Добавить опцию, если она не существует

3 нояб. 2012 г., 12:53:03
Просмотры: 25.1K
Голосов: 8

Мне нужно проверить наличие опции, и если она существует, получить её значение. Если нет - нужно добавить её.

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

Однако мне кажется, что вторая часть может сработать в двух случаях: если опция не существует ИЛИ если новое значение равно значению опции.

Правильно ли это?

0
Все ответы на вопрос 6
3
17

Я не рекомендую использовать подход 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");
}

(Я также отправил этот функционал как запрос в ЯДРО)

13 мар. 2014 г. 18:49:55
Комментарии

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

fuxia fuxia
13 мар. 2014 г. 19:57:31

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

JDandChips JDandChips
25 февр. 2019 г. 09:53:06

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

Rup Rup
28 июл. 2021 г. 10:05:13
0

Я считаю, что лучший подход к этой проблеме — создать логику 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" и присвоить ей нужное значение.

При необходимости эту логику можно изменить для более сложных требований.

13 июн. 2016 г. 06:28:34
0

Это правильно?

Если вы имеете в виду "когда выполняется 'if', а когда 'else', то "Нет". Посмотрите на условие: if ( get_option( $option_name ) != $new_value ) {

Если опция не существует — false != '255' вернет true — тогда выполнится первая часть. Она также выполнится, если опция существует, но значения не совпадают — '123' != '255' вернет true.

else выполнится только если значения совпадают'255' != '255' вернет false, поэтому выполнится часть else. Значения могут совпадать по чему угодно: числа, строки, булевы значения (true или false).

3 нояб. 2012 г. 14:11:24
0

Я немного боролся с подобным управлением опциями и реализовал это немного по-другому...

// создаем или обновляем токен в БД

    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 дает вам идеальный ответ, я просто добавляю альтернативный вариант подхода к управлению опциями.

12 июл. 2019 г. 16:03:39
0
-1

Логика оператора IF THEN ELSE действительно выглядит немного странной. Если я правильно понимаю...

Вызов get_option( $option_name ) вернёт FALSE, если опция не существует или если у неё нет значения.

Таким образом, условие IF будет выполнено:

  1. когда опция не существует и $new_value != FALSE
  2. когда опция существует, но не имеет значения и $new_value != FALSE
  3. когда опция существует и имеет значение, которое != $new_value

Затем вызов update_option() обновит значение или создаст опцию с $new_value.

Блок ELSE будет вызван если:

  1. опция существует и имеет то же значение, что и $new_value
  2. опция не существует и $new_value == FALSE
3 нояб. 2012 г. 14:11:27
2
-1

Попробуйте это

  1. Функция проверяет наличие $arg / строки / в mySQL.

  2. $arg должен быть строкой / именем вашей опции /

  3. Если функция возвращает 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 );
    }
}
20 янв. 2016 г. 15:01:00
Комментарии

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

Nicolai Grossherr Nicolai Grossherr
20 янв. 2016 г. 15:06:45

Минусую, потому что нет абсолютно никаких причин напрямую обращаться к БД. В любом случае update_option добавит опцию, если она не существует, так что весь код бессмыслен.

Mark Kaplun Mark Kaplun
21 янв. 2016 г. 13:51:37