WordPress как на ладони
wordpress jino

update_option() WP 1.0.0

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

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

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

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

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

Поэтому если в опции, могут быть экранированные символы, перед передачей, значение опции нужно обработать функцией 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(логический)

Обновить установленную метку (autoload) опции. С версии 4.2.

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

Чтобы включить autoload, укажите в этом параметре true, yes или что-то еще кроме null, false и no
Чтобы отключить, укажите false или no.
По умолчанию: null ('yes')

Примеры

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

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

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

#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.

Код update option: wp-includes/option.php WP 4.9

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

	$option = trim($option);
	if ( empty($option) )
		return false;

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

Cвязанные функции

Из раздела: Опции сайта (настройки)

Http://www.7dach.ru/

http://www.7dach.ru/

www.7dach.ru

update_option 12 комментариев
Полезные 2 Все
  • Юра

    Привет.
    Подскажи. Сталкиваюсь с такой проблемой. При добавлении большого массива - не удается сохранить. Как быть?

    Ответить2.1 года назад #
    • Максим @

      Большого - это какого?

      Ответить2.1 года назад #
      • Михаил

        Например массив из 30 элементов, в каждом из них по ассоциативному массиву ~ 40 элементов, в которых могут быть тоже ассоциативные массивы.
        Элементы могут содержать строки длинной свыше 500 символов.

        if($_REQUEST['action_me'] == 'post'){
        	if(is_array($_REQUEST['flat_plugin_Query'])){
        		foreach ($_REQUEST['flat_plugin_Query'] as &$value) {
        			foreach ($value['stack_of_blocks'] as &$key) {
        				$key['html'] = str_replace("\\'", "'", str_replace("\\\"", "\"", $key['html']));
        			}
        			unset($key);
        		}
        		unset($value);
        	}
        	$updated = update_option('flat_plugin_options', $_REQUEST);
        	die(json_encode(get_option( 'flat_plugin_options' )));
        }

        Ajax передача данных, всё работает ~ до 30ого элемента, дальше в консоле выводится 0 - аналог false.

  • campusboy1896 cайт: www.youtube.com/c/wpplus

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

    Очень жаль, что нельзя отследить, когда именно ошибка, а когда просто данные не изменились. Получается надо делать запрос, что находится в опциях, сравнивать с тем, что хочешь записать и уже тогда делать выводы.

    Ответить1.5 года назад #
    • Kama4558

      А в каких случаях может быть ошибка запроса, если в БД все нормально? Вроде бы ни в каких...

      В крайнем случае, можно попробовать сразу после выполнения проверить глобальный объект $wpdb - его последний запрос и наличие ошибки...

      1
      Ответить1.5 года назад #
      • campusboy1896 cайт: www.youtube.com/c/wpplus

        А в каких случаях может быть ошибка запроса, если в БД все нормально?

        Ну ты прям мне с плеча всё обрубил. Просто я привык проверять всё и вся. Заботанил crazy Но зато теперь буду знать, что в $wpdb такие вещи глядеть надо.

        Ответить1.5 года назад #
        • Kama4558

          Там всего одна переменная может быть разной - $value и какой бы она не была ошибки запроса не будет... smile

          Ответить1.5 года назад #
  • campusboy1896 cайт: www.youtube.com/c/wpplus

    Почему-то во многих примерах, связанных с использованием update_option при сохранении проверяют, есть ли данные с помощью get_option. Тут тоже во 2 примере так. Какой смысл? Ведь update_option сама всё сделает за нас.

    Ответить1.2 года назад #
    • Kama4558

      Потому что в update_option() в версиях меньше 4.2 параметр autoload нельзя было передать - он всегда yes...

      С 4.2 смысла нет в такой проверке... И я сейчас этот момент добавлю в пример. Спасибо за коммент!

      2
      Ответить1.2 года назад #
  • Павел

    Она сериализует данные, если на вход подать массив?

    • campusboy1896 cайт: www.youtube.com/c/wpplus

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

      Идем на add_option

      Если данные нужно сериализовать, для хранение в БД, то они будут автоматические сериализованы перед добавлением опции. Так, в настройках можно хранить массивы.

      1

Здравствуйте, !

Ваш комментарий