Добавить опцию, если она не существует
Мне нужно проверить наличие опции, и если она существует, получить её значение. Если нет - нужно добавить её.
В Codex предлагается следующий код:
<?php
$option_name = 'myhack_extraction_length';
$new_value = '255';
if ( get_option( $option_name ) != $new_value ) {
update_option( $option_name, $new_value );
} else {
$deprecated = ' ';
$autoload = 'no';
add_option( $option_name, $new_value, $deprecated, $autoload );
}
Который, предположительно, обновляет опцию myhack_extraction_length значением 255. Если опция не существует, то использует add_option и устанавливает autoload в no.
Однако мне кажется, что вторая часть может сработать в двух случаях: если опция не существует ИЛИ если новое значение равно значению опции.
Правильно ли это?
Я не рекомендую использовать подход if (!(get_option("XXXX"))
для проверки существования
, так как он не сработает с допустимыми значениями false/null/0/empty
.
Предлагаю следующий вариант:
if (!option_exists("XXXX")) {
add_option("XXXX", "valueee");
}
Код функции:
public function option_exists($name, $site_wide=false){
global $wpdb; return $wpdb->query("SELECT * FROM ". ($site_wide ? $wpdb->base_prefix : $wpdb->prefix). "options WHERE option_name ='$name' LIMIT 1");
}
(Я также отправил этот функционал как запрос в ЯДРО)

Пожалуйста, добавьте объяснение к вашему ответу: почему это может решить проблему?

При использовании update_option
: "Если опция не существует, то она будет добавлена со значением option и значением $autoload 'yes'." - https://developer.wordpress.org/reference/functions/update_option/

Я считаю, что лучший подход к этой проблеме — создать логику IF-ELSE, как показано ниже:
if(get_option('some_option')){
update_option('some_option', 'value_we_want_to_add');
}
else {
add_option('some_option', 'value_we_want_to_add');
}
Логика: get_option() вернёт TRUE, если опция существует. В этом случае мы можем просто обновить эту опцию нужным значением с помощью update_option('some_option','value_we_want_to_add')
. С другой стороны, если some_option не существует, get_option вернёт FALSE, и активируется блок ELSE. Внутри блока else мы даём инструкцию создать эту опцию "some_option" и присвоить ей нужное значение.
При необходимости эту логику можно изменить для более сложных требований.

Это правильно?
Если вы имеете в виду "когда выполняется 'if', а когда 'else', то "Нет". Посмотрите на условие: if ( get_option( $option_name ) != $new_value ) {
Если опция не существует — false != '255'
вернет true
— тогда выполнится первая часть. Она также выполнится, если опция существует, но значения не совпадают — '123' != '255'
вернет true
.
else
выполнится только если значения совпадают — '255' != '255'
вернет false, поэтому выполнится часть else
. Значения могут совпадать по чему угодно: числа, строки, булевы значения (true или false).

Я немного боролся с подобным управлением опциями и реализовал это немного по-другому...
// создаем или обновляем токен в БД
switch ( get_option( 'ngitc_token' ) ) {
case false:
echo "<p>Добавлен токен в БД</p>";
delete_option( 'ngitc_token' ); // get_option() вернет false если опция не существует ИЛИ если она пустая. Поэтому я перестраховываюсь - удаляю перед добавлением.
add_option( 'ngitc_token', $token->token );
break;
case $token->token:
echo "<p>Нет изменений в БД</p>";
break;
case true:
echo "<p>Обновлен токен в БД</p>";
update_option( 'ngitc_token', $token->token );
break;
}
@Steve дает вам идеальный ответ, я просто добавляю альтернативный вариант подхода к управлению опциями.

Логика оператора IF THEN ELSE действительно выглядит немного странной. Если я правильно понимаю...
Вызов get_option( $option_name ) вернёт FALSE, если опция не существует или если у неё нет значения.
Таким образом, условие IF будет выполнено:
- когда опция не существует и $new_value != FALSE
- когда опция существует, но не имеет значения и $new_value != FALSE
- когда опция существует и имеет значение, которое != $new_value
Затем вызов update_option() обновит значение или создаст опцию с $new_value.
Блок ELSE будет вызван если:
- опция существует и имеет то же значение, что и $new_value
- опция не существует и $new_value == FALSE

Попробуйте это
Функция проверяет наличие $arg / строки / в mySQL.
$arg должен быть строкой / именем вашей опции /
Если функция возвращает true -> опция существует; возвращает false -> нет опции с таким именем.
/** * Проверяет существование опции; * @param String * @return boolean; */
function exist_option( $arg ) {
global $wpdb;
$prefix = $wpdb->prefix;
$db_options = $prefix.'options';
$sql_query = 'SELECT * FROM ' . $db_options . ' WHERE option_name LIKE "' . $arg . '"';
$results = $wpdb->get_results( $sql_query, OBJECT );
if ( count( $results ) === 0 ) {
return false;
} else {
return true;
}
}
Пример:
var_dump( exist_option( 'your_option' ) );
Результат:
true / false
Пример: (создать опцию, если не существует):
if( exist_option( 'your_option' ) == false ) {
add_option( 'your_option', '255', '', true );
}
И ваш ответ может быть таким:
$new_value = '255';
if( exist_option( 'myhack_extraction_length' ) == false ) {
add_option( 'myhack_extraction_length', '255', '', true );
} else {
if ( get_option( 'myhack_extraction_length' ) == $new_value ) {
// Ваш код здесь: или
return;
} else {
update_option( 'myhack_extraction_length', $new_value );
}
}

Пожалуйста, не просто выкладывайте код, а объясните, что вы делаете и для чего это нужно — спасибо.
