Add Option if Not Exists

时间:2012-11-03 作者:Chris

我需要看看是否有一个选项,如果有,是否得到值。如果没有,我需要添加它。

这个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 );
}
据推测updates the option name myhack_extraction_length with the value 255. If the option does not exist then use add_option and set autoload to no.

然而,在我看来,如果选项不存在,或者如果新值==选项,则可以通过两种方式调用下半部分

这是正确的吗?

6 个回复
最合适的回答,由SO网友:Steve 整理而成

IF-THEN-ELSE的逻辑似乎有点不可靠。如果我读对了。。。

如果get\\u选项不存在或没有值,则调用get\\u选项($option\\u name)将返回FALSE。

因此,将执行IF:

选项不存在且$new\\u值!=FALSE选项没有值,并且$new\\u值!=FALSE该选项存在,其值为!=$new value然后,update\\u option()调用将更新该值或使用$new\\u value创建该选项。

如果出现以下情况,将调用ELSE:

该选项存在,并且与$new\\u值具有相同的值。该选项不存在,并且$new\\u值==FALSE

SO网友:T.Todua

我不建议使用if (!(get_option("XXXX")) 方法to check for existence, 因为它失败了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");
}
(我还将此功能作为CORE request)

SO网友:Technogeek

我认为解决这个问题的最佳方法是创建这样的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\');
    }
Logic: 如果该选项确实存在,则get\\u option()将返回TRUE。在这种情况下,我们可以简单地用我们想要添加的值更新该选项。这是由update_option(\'some_option\',\'value_we_want_to_add\'). 另一方面,如果某个\\u选项不存在,get\\u选项将返回FALSE并激活ELSE块。在else块中,我们给出了创建这个“some\\u选项”的指令,并为其赋值。

或者,可以更改此逻辑以匹配更高级的需求。

SO网友:s_ha_dum

这是正确的吗?

如果您的意思是“If何时执行,else何时执行,则为“否”。请查看条件:if ( get_option( $option_name ) != $new_value ) {

如果选项不存在--false != \'255\'true-- 然后执行第一部分。如果该选项存在且值不匹配,它也会执行--\'123\' != \'255\'true.

这个else 仅当值do 匹配--\'255\' != \'255\' 为false,因此else 零件管路。他们可以匹配任何东西,数字,字符串,布尔值--也就是真或假

SO网友:PeeR

我在这类期权管理方面有点挣扎,并采用了不同的方法。。。

// create or update the token in DB

    switch ( get_option( \'ngitc_token\' ) ) {
        case false: 
            echo "<p>Added token to DB</p>";
            delete_option( \'ngitc_token\' ); //get_option() will send false if option doesn\'t exist OR if it\'s empty. So I take no chances, I delete it before adding it.
            add_option( \'ngitc_token\', $token->token );
            break;
        case $token->token:
            echo "<p>No change to DB</p>";
            break; 
        case true:
            echo "<p>Updated token to DB</p>";
            update_option( \'ngitc_token\', $token->token );  
            break;   

    }
@Steve很好地回答了你的问题,我只是增加了一个如何进行期权管理的可能性。

SO网友:Paskal Novakov

试试这个

函数检查mySQL中是否存在$arg/string/。

$参数必须是字符串/选项名称/

  • 如果函数返回true->选项exist;返回false->没有具有此名称的选项。

    检查选项是否存在;*@参数字符串*@返回布尔值*/

    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\' ) );
    
    结果:

    真/假

    示例:(如果不存在,则创建选项):

    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 ) {
            // Your Code Here: or
            return;
        } else {
            update_option( \'myhack_extraction_length\', $new_value );
        }
    }
    

  • 结束