update_option() WP 1.0.0
Обновляет значение опции (настройки) в базе данных. Ожидает не экранированную строку.
Эта функция может быть использована для того, чтобы добавлять новые опции, вместо add_options(): update_option сначала проверяет существует ли указанная опция, если нет, то работа передается add_options()
. Название опции очищается, перед тем как опция добавляется в базу данных.
До версии 4.2 нельзя было указать параметр $autoload
. Это значит, что функции нельзя было указать, что добавляемая опция является частной и её не над загружать в память вместе со всеми опциями. Для этого приходилось использовать функцию add_option() (см. описание).
Важно! По умолчанию параметр $autoload = yes
для новых опций. Т.е. при обычном добавлении опции через эту функцию, её значение будет автоматически подгружаться в память. В некоторых случаях это может привести в перегрузке памяти, поэтому если опция нужна для каких то редких действий, важно указать параметр $autoload = no
.
Если указанное значение опции равно старому значению, то функция ничего не обновляет и обрывает свою работу.
update_option()
ожидает не экранированную строку, т.е. она сохраняет переданное значение как есть, и если там есть экранированные символы, они будут записаны как есть.
Поэтому если в опции есть экранированные символы, значение нужно обработать функцией wp_unslash() и затем передать фукнции.
✈ 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. Чтобы отключить, укажите 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.
Заметки
- Global. wpdb.
$wpdb
WordPress database abstraction object.
Список изменений
С версии 1.0.0 |
Введена. |
С версии 4.2.0 |
The $autoload parameter was added. |
<?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вязанные функции
Привет.
Подскажи. Сталкиваюсь с такой проблемой. При добавлении большого массива - не удается сохранить. Как быть?
Большого - это какого?
Например массив из 30 элементов, в каждом из них по ассоциативному массиву ~ 40 элементов, в которых могут быть тоже ассоциативные массивы.
Элементы могут содержать строки длинной свыше 500 символов.
Ajax передача данных, всё работает ~ до 30ого элемента, дальше в консоле выводится 0 - аналог false.
Очень жаль, что нельзя отследить, когда именно ошибка, а когда просто данные не изменились. Получается надо делать запрос, что находится в опциях, сравнивать с тем, что хочешь записать и уже тогда делать выводы.
А в каких случаях может быть ошибка запроса, если в БД все нормально? Вроде бы ни в каких...
В крайнем случае, можно попробовать сразу после выполнения проверить глобальный объект $wpdb - его последний запрос и наличие ошибки...
Ну ты прям мне с плеча всё обрубил. Просто я привык проверять всё и вся. Заботанил
Но зато теперь буду знать, что в $wpdb такие вещи глядеть надо.
Там всего одна переменная может быть разной - $value и какой бы она не была ошибки запроса не будет...
Почему-то во многих примерах, связанных с использованием update_option при сохранении проверяют, есть ли данные с помощью get_option. Тут тоже во 2 примере так. Какой смысл? Ведь update_option сама всё сделает за нас.
Потому что в
update_option()
в версиях меньше 4.2 параметр autoload нельзя было передать - он всегда yes...С 4.2 смысла нет в такой проверке... И я сейчас этот момент добавлю в пример. Спасибо за коммент!
Она сериализует данные, если на вход подать массив?
Идем на add_option
Подскажите, каким образом обновить часть серриализованного массива, который хранится в опции?
Лучше всего в PHP получить опцию, изменить данные и сохранить...