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, якщо БД нічого не змінилося або у разі помилки.

Використання

$ updated = update_option ($ option_name, $ newvalue, $ autoload);
$option_name
(рядок) (обов’язковий)
Назва установки, яку потрібно оновити.
$newvalue
(рядок|масив|число|об’єкт|логічний) (обов’язковий)
Нове значення налаштування, яке буде додано до БД.
$autoload
(рядок|true|false)

Оновити встановлену позначку (autoload) опції. З версії 4.2.

true|yes– при першому отриманні всіх опцій сайту, опція додається до глобального масиву опцій. Потім при зверненні до цієї опції вона береться з кешу, а не з бази даних.
false|no– опція не завантажуватиметься з усіма опціями. При зверненні до цієї опції робитиметься окремий запит до БД.

Ця мітка оновлюється під час оновлення опції.

Типово: null (yes)

Приклади

1

#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 );
}

нотатки

З версії 4.2 додався параметр $autoload.

нотатки

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

список змін

З версії 1.0.0Введено.
З версії 4.2.0The $autoload parameter був added.

Код update_option() WP 6.0.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 ( ! wp_installing() && isset( $deprecated_keys[ $option ] ) ) {
		_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 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 );

	/*
	 * Якщо нові й starі значення є самі, не потрібні для оновлення.
	 *
	 * Несеріалізовані значення будуть встановлені в більшості випадків. If the unserialized
	 * data differs, the (maybe) послідовний data is checked to avoid
	 * unnecessary database calls для іншихwise identical object instances.
	 *
	 * See https://core.trac.wordpress.org/ticket/38903
	 */
	if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) {
		return false;
	}

	/** Цей filter is documented в wp-includes/option.php */
	if ( apply_filters( "default_option_{$option}", false, $option, false ) === $old_value ) {
		// Default setting for new options is 'yes'.
		if ( null === $autoload ) {
			$autoload = 'yes';
		}

		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'] = ('no' === $autoload || false === $autoload ) ? 'no': 'yes';
	}

	$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() ) {
		$ 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');
		}
	}

	/**
	 * Fires after the value of a specific option has been successfully updated.
	 *
	 * The dynamic portion of 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *