WordPress.org

Make WordPress Core

Ticket #38931: 38931.diff

File 38931.diff, 1.6 KB (added by dd32, 3 years ago)
  • src/wp-includes/option.php

    function update_option( $option, $value, 
    319319         * @param string $option    Name of the option to update.
    320320         * @param mixed  $old_value The old option value.
    321321         * @param mixed  $value     The new option value.
    322322         */
    323323        do_action( 'update_option', $option, $old_value, $value );
    324324
    325325        $update_args = array(
    326326                'option_value' => $serialized_value,
    327327        );
    328328
    329329        if ( null !== $autoload ) {
    330330                $update_args['autoload'] = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';
    331331        }
    332332
    333333        $result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) );
    334         if ( ! $result )
    335                 return false;
     334        if ( ! $result ) {
     335                // get_option() said the option exists, checks have said it should differ from what's in the DB. The UPDATE failed, suggesting that it might be in the cache-only and not the DB, so perform an add_option instead.
     336                return add_option( $option, $value, '', $autoload );
     337        }
    336338
    337339        $notoptions = wp_cache_get( 'notoptions', 'options' );
    338340        if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) {
    339341                unset( $notoptions[$option] );
    340342                wp_cache_set( 'notoptions', $notoptions, 'options' );
    341343        }
    342344
    343345        if ( ! wp_installing() ) {
    344346                $alloptions = wp_load_alloptions();
    345347                if ( isset( $alloptions[$option] ) ) {
    346348                        $alloptions[ $option ] = $serialized_value;
    347349                        wp_cache_set( 'alloptions', $alloptions, 'options' );
    348350                } else {
    349351                        wp_cache_set( $option, $serialized_value, 'options' );
    350352                }