主题设置默认,首次保存前行为异常

时间:2013-02-22 作者:Chris

我正在用设置API构建一个主题选项页面。我使用ajax调用从其他页面/选项卡自动计算一些设置。我注意到,所有新的默认设置(“std”)都将显示在它们的输入字段中,但当我使用以下命令进行ajax调用时,这些设置将是未定义的:

array_merge(get_option(\'some_options\', \'fail\'), get_option(\'some_other_options\', \'fail\'));
也就是说,在我第一次保存新设置之前,它们将是未定义的。所有先前定义的设置都将在结果对象中渲染,但所有新编写的添加内容都将未定义。

我想知道当您第一次切换到主题时,是否保存了该选项的默认值。

因此,当我在使用该主题时添加新选项时,不会保存默认选项。如果是这样的话,我担心当用户第一次激活这个主题时,一些键值会被忽略。

所以我只是想弄清楚发生了什么。

1) 首先,我有一些选择。->一切都很好。

2) 我编写了一些新选项。->故障开始

3) 设置页面加载。默认值在输入字段中,但当我调用并检查数据库时。对于这些新设置,将返回“undefined”。所有其他设置都正常。

4) 重新加载页面。->无变化

5) 保存更改。

6) Ajax调用很好,定义了所有值。

1 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

不要依赖于保存的选项。更好的是,无论用户是否访问过主题设置页面,主题都能正常运行。

第一步是定义一个函数以返回选项默认值,可以是:

在函数中定义它们,然后在选项参数数组中引用该函数

function mytheme_option_parameters() {
    $parameters = array(
        \'foo\' => array( 
            \'name\' => \'foo\',
            \'title\' => \'Foo\',
            \'std\' => \'bar\'
        ),
        \'foo1\' => array( 
            \'name\' => \'foo1\',
            \'title\' => \'Foo1\',
            \'std\' => \'bar1\'
        ),
     );
     return $parameters;
)

function mytheme_option_defaults() {
    $parameters = mytheme_option_parameters;
    $defaults = array();
    foreach ( $parameters as $param ) {
        $defaults[$param[\'name\']] = $param[\'std\'];
    }
    return $defaults;
} 
在选项参数数组中定义它们,然后在函数中循环该数组。

function mytheme_option_defaults() {
    $parameters = mytheme_option_parameters;
    $defaults = array();
    foreach ( $parameters as $param ) {
        $defaults[$param[\'name\']] = $param[\'std\'];
    }
    return $defaults;
} 

function mytheme_option_defaults() {
    $defaults = array(
        \'foo\' => \'bar\',
        \'foo1\' => \'bar1\'
    );
    return $defaults;
} 

function mytheme_option_parameters() {
    $defaults = mytheme_option_defaults();
    $parameters = array(
        \'foo\' => array( 
            \'name\' => \'foo\',
            \'title\' => \'Foo\',
            \'std\' => $defaults[\'foo\'];
        ),
        \'foo1\' => array( 
            \'name\' => \'foo1\',
            \'title\' => \'Foo1\',
            \'std\' => $defaults[\'foo1\']
        ),
     );
     return $parameters;
)
然后,当您需要参考主题选项时,请执行以下操作:

function mytheme_get_options() {
    $defaults = mytheme_option_defaults();
    $options = wp_parse_args( get_option( \'theme_themename_options\', array() ), $defaults );
    return $options;
}   
这里的魔法是wp_parse_args() 呼叫基本上,如果没有设置主题选项,则使用默认值,但如果设置了选项,则使用默认值。用户未设置的任何选项(例如,新添加的选项)将回退以使用主题定义的默认值。

即使用户从未访问过“主题设置”页面,主题也可以使用主题定义的默认值,开箱即用。如果用户从未实际保存任何设置,则主题甚至从未为其选项写入DB条目。

结束

相关推荐

Wp_Options设计模式的优势是什么?

众所周知,Wordpress数据库代码中经常使用的一种设计模式是为特定对象(博客/帖子/评论)持久化数据,并使用特定名称或键进行索引。我们在以下标准表中看到了此模式:据我所知,这个设计决策的动机是使插件/主题作者能够轻松地持久化数据(例如,通过使用自定义字段),而无需修改数据库模式。在我看来,这种方法几乎没有其他优势,因为它的速度明显较慢,并且更难实现复杂的查询。这种方法的其他优势是什么(如果有的话)?更新:阅读有关此方法缺点的信息:https://stackoverflow.com/questions/