WordPress как на ладони
rgbcode is looking for WordPress developers.

update_option()WP 1.0.0

Обновляет значение опции (настройки) в базе данных. Ожидает не экранированную строку.

Эта функция может быть использована для того, чтобы добавлять новые опции, вместо add_option(): update_option сначала проверяет существует ли указанная опция, если нет, то работа передается add_option(). Название опции очищается, перед тем как опция добавляется в базу данных.

До версии 4.2 нельзя было указать параметр $autoload. Это значит, что функции нельзя было указать, что добавляемая опция является частной и её не над загружать в память вместе со всеми опциями. Для этого приходилось использовать функцию add_option() (см. описание).

Важно! По умолчанию параметр $autoload = yes для новых опций. Т.е. при обычном добавлении опции через эту функцию, её значение будет автоматически подгружаться в память. В некоторых случаях это может привести в перегрузке памяти, поэтому если опция нужна для каких то редких действий, важно указать параметр $autoload = no.

Если указанное значение опции равно старому значению, то функция ничего не обновляет и обрывает свою работу.

Ожидает не экранированную строку, т.е. функция сохраняет переданное значение как есть, и если там есть экранированные символы, они будут записаны как есть. Поэтому если в опции есть экранированные символы, значение нужно обработать функцией wp_unslash() и затем передать фукнции.

Основа для: remove_theme_mod(), set_theme_mod()
1 раз — 0.001228 сек (очень медленно) | 50000 раз — 9.96 сек (быстро) | PHP 7.0.5, WP 4.5.2

Возвращает

true|false.

  • true, если значение изменилось.
  • false, если в БД ничего не поменялось или в случае ошибки.

Использование

update_option( $option, $value, $autoload );
$option_name(строка) (обязательный)
Название настройки, которую нужно обновить.
$value(строка|массив|число|объект|логический) (обязательный)
Новое значение настройки, которое будет добавлено в БД.
$autoload(строка|true|false)

Нужно ли обновить установленную метку (autoload) опции. Эта метка определяет загружать ли опцию при запуске WordPress.

Для обратной совместимости также принимаются значения 'yes' и 'no'.

true - при первом получении всех опций сайта, опция добавляется в глобальный массив опций. Затем при обращении к этой опции, она берется из кэша, а не из базы данных.

false - опция не будет загружаться со всеми опциями. При обращении к этой опции будет делаться отдельный запрос к БД.

null - оставить решение на усмотрение стандартных эвристик WordPress.

Автозагрузка слишком большого количества опций может привести к проблемам с производительностью, особенно если эти опции редко используются. Поэтому:

  • Для опций, которые используются в нескольких местах на фронтенде, рекомендуется загружать их автоматически, установив значение true.
  • Для опций, которые используются только на нескольких конкретных URL, рекомендуется не загружать их автоматически, установив значение false.
  • Для несуществующих опций значение по умолчанию - null, что означает, что WordPress определит значение автозагрузки автоматически.

По умолчанию: null

Примеры

2

#1 Обновим существующую опцию my_option

установим ей значение "новое значение":

<?php update_option( 'my_option', 'новое значение' ); ?>
0

#2 Обновим опцию extract_length значением 255.

Если такой опции не существует, то update_option() создаст её автоматически.

Обратите внимание, что с версии 4.2 в update_option() мы можем указать параметр autoload, который будет обновлен, если опция существует и передан в функцию add_option() если опции не существует и её нужно создать...

$newvalue = '255' ;

update_option( 'extract_length', $newvalue, 'no' );

Тоже самое для версии WP ниже 4.2:

Если опции extract_length еще не существует, то добавим её с использованием функции add_ooption(), в которой укажем, чтобы опция не загружалась автоматически (сделаем её частной).

$option_name = 'extract_length' ;
$newvalue    = '255' ;

if ( get_option( $option_name ) != $newvalue ) {
	update_option( $option_name, $newvalue );
}
else {
	$deprecated = '';
	$autoload = 'no';
	add_option( $option_name, $newvalue, $deprecated, $autoload );
}

Заметки

  • Global. wpdb. $wpdb WordPress database abstraction object.

Список изменений

С версии 1.0.0 Введена.
С версии 4.2.0 The $autoload parameter was added.

Код update_option() WP 6.6.2

function update_option( $option, $value, $autoload = null ) {
	global $wpdb;

	if ( is_scalar( $option ) ) {
		$option = trim( $option );
	}

	if ( empty( $option ) ) {
		return false;
	}

	/*
	 * Until a proper _deprecated_option() function can be introduced,
	 * redirect requests to deprecated keys to the new, correct ones.
	 */
	$deprecated_keys = array(
		'blacklist_keys'    => 'disallowed_keys',
		'comment_whitelist' => 'comment_previously_approved',
	);

	if ( isset( $deprecated_keys[ $option ] ) && ! wp_installing() ) {
		_deprecated_argument(
			__FUNCTION__,
			'5.5.0',
			sprintf(
				/* translators: 1: Deprecated option key, 2: New option key. */
				__( 'The "%1$s" option key has been renamed to "%2$s".' ),
				$option,
				$deprecated_keys[ $option ]
			)
		);
		return update_option( $deprecated_keys[ $option ], $value, $autoload );
	}

	wp_protect_special_option( $option );

	if ( is_object( $value ) ) {
		$value = clone $value;
	}

	$value     = sanitize_option( $option, $value );
	$old_value = get_option( $option );

	/**
	 * Filters a specific option before its value is (maybe) serialized and updated.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.6.0
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param mixed  $value     The new, unserialized option value.
	 * @param mixed  $old_value The old option value.
	 * @param string $option    Option name.
	 */
	$value = apply_filters( "pre_update_option_{$option}", $value, $old_value, $option );

	/**
	 * Filters an option before its value is (maybe) serialized and updated.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed  $value     The new, unserialized option value.
	 * @param string $option    Name of the option.
	 * @param mixed  $old_value The old option value.
	 */
	$value = apply_filters( 'pre_update_option', $value, $option, $old_value );

	/*
	 * If the new and old values are the same, no need to update.
	 *
	 * Unserialized values will be adequate in most cases. If the unserialized
	 * data differs, the (maybe) serialized data is checked to avoid
	 * unnecessary database calls for otherwise identical object instances.
	 *
	 * See https://core.trac.wordpress.org/ticket/38903
	 */
	if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) {
		return false;
	}

	/** This filter is documented in wp-includes/option.php */
	if ( apply_filters( "default_option_{$option}", false, $option, false ) === $old_value ) {
		return add_option( $option, $value, '', $autoload );
	}

	$serialized_value = maybe_serialize( $value );

	/**
	 * Fires immediately before an option value is updated.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option    Name of the option to update.
	 * @param mixed  $old_value The old option value.
	 * @param mixed  $value     The new option value.
	 */
	do_action( 'update_option', $option, $old_value, $value );

	$update_args = array(
		'option_value' => $serialized_value,
	);

	if ( null !== $autoload ) {
		$update_args['autoload'] = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );
	} else {
		// Retrieve the current autoload value to reevaluate it in case it was set automatically.
		$raw_autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );
		$allow_values = array( 'auto-on', 'auto-off', 'auto' );
		if ( in_array( $raw_autoload, $allow_values, true ) ) {
			$autoload = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );
			if ( $autoload !== $raw_autoload ) {
				$update_args['autoload'] = $autoload;
			}
		}
	}

	$result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) );
	if ( ! $result ) {
		return false;
	}

	$notoptions = wp_cache_get( 'notoptions', 'options' );

	if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
		unset( $notoptions[ $option ] );
		wp_cache_set( 'notoptions', $notoptions, 'options' );
	}

	if ( ! wp_installing() ) {
		if ( ! isset( $update_args['autoload'] ) ) {
			// Update the cached value based on where it is currently cached.
			$alloptions = wp_load_alloptions( true );

			if ( isset( $alloptions[ $option ] ) ) {
				$alloptions[ $option ] = $serialized_value;
				wp_cache_set( 'alloptions', $alloptions, 'options' );
			} else {
				wp_cache_set( $option, $serialized_value, 'options' );
			}
		} elseif ( in_array( $update_args['autoload'], wp_autoload_values_to_autoload(), true ) ) {
			// Delete the individual cache, then set in alloptions cache.
			wp_cache_delete( $option, 'options' );

			$alloptions = wp_load_alloptions( true );

			$alloptions[ $option ] = $serialized_value;
			wp_cache_set( 'alloptions', $alloptions, 'options' );
		} else {
			// Delete the alloptions cache, then set the individual cache.
			$alloptions = wp_load_alloptions( true );

			if ( isset( $alloptions[ $option ] ) ) {
				unset( $alloptions[ $option ] );
				wp_cache_set( 'alloptions', $alloptions, 'options' );
			}

			wp_cache_set( $option, $serialized_value, 'options' );
		}
	}

	/**
	 * Fires after the value of a specific option has been successfully updated.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.0.1
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param mixed  $old_value The old option value.
	 * @param mixed  $value     The new option value.
	 * @param string $option    Option name.
	 */
	do_action( "update_option_{$option}", $old_value, $value, $option );

	/**
	 * Fires after the value of an option has been successfully updated.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option    Name of the updated option.
	 * @param mixed  $old_value The old option value.
	 * @param mixed  $value     The new option value.
	 */
	do_action( 'updated_option', $option, $old_value, $value );

	return true;
}
13 комментариев
Полезные 2 Все
    Войти