Passing array in add_option()

时间:2014-07-14 作者:Payal

我必须在我的自定义主题wordpress中创建一个选项页。下面是一个代码示例

<?php

    function bguru_register_settings(){

   $default_options=array(
        \'bguru_logo\'=>\'http://templategraphy.com/demo/businessguru/images/logo.png\',
        \'bguru_vimeo\'=>\'\',
        \'bguru_skype\'=>\'\',
        \'bguru_dribbble\'=>\'\',
        \'bguru_slide_one_image\'=>\'\',
        \'bguru_slide_one_heading\'=>\'\',
        \'bguru_slide_one_text\'=>\'\'
         );

        add_option(\'bguru_options\',$default_options);

        register_setting(\'tgbusinessguru\', \'bguru_options\');
    }

    add_action(\'admin_init\', \'bguru_register_settings\');

    function bguru_register_options_page(){

    add_theme_page(\'Business Guru Options\', \'Theme Customizer\', \'edit_theme_options\', \'bguru-options\', \'bguru_options_page\');

}

    add_action(\'admin_menu\', \'bguru_register_options_page\');

    function bguru_options_page(){
        $options=get_option(\'bguru_options\');

        ?>
<div class="wrap">
    <?php
 screen_icon(); ?>
    <h1>Business Guru Options</h1>
    <form method="post" action="options.php"> 
        <?php
 settings_fields(\'tgbusinessguru\'); ?>
            <table class="form-table">
                <tr valign="top">
                    <th><h2>General</h2><th>
                </tr>
                <tr valign="top">

                    <th scope="row"><label for="bguru_logo">Logo:</label></th>

                    <td><input type="text" id="bguru_logo" size="50" name="bguru_options[bguru_logo]" value="<?php echo $options[\'bguru_logo\']; ?>" /></td>

                </tr>

                <tr valign="top">
                    <th><h2>Social Links</h2><th>
                </tr>
                <tr valign="top">
                    <th scope="row"><label for="bguru_vimeo">Vimeo:</label></th>
                    <td><input type="text" id="bguru_vimeo" size="50" name="bguru_options[bguru_vimeo]" value="<?php echo $options[\'bguru_vimeo\']; ?>" /></td>

                 </tr>
                <tr valign="top">
                    <th scope="row"><label for="bguru_skype">Skype:</label></th>
                    <td><input type="text" id="bguru_skype" size="50" name="bguru_options[bguru_skype]" value="<?php echo $options[\'bguru_skype\']; ?>" /></td>
                </tr>
                <tr valign="top">
                    <th scope="row"><label for="bguru_dribbble">Dribbble:</label></th>
                    <td><input type="text" id="bguru_dribbble" size="50" name="bguru_options[bguru_dribbble]" value="<?php echo $options[\'bguru_dribbble\']; ?>" /></td>
                </tr>
                <tr valign="top">

                    <th scope="row"><label for="bguru_slide_one_image">Image:</label></th>

                    <td><input type="text" id="bguru_slide_one_image" size="50" name="bguru_options[bguru_slide_one_image]" value="<?php
 echo $options[\'bguru_slide_one_image\']; ?>" /></td>
                </tr>
                <tr valign="top">
                    <th scope="row"><label for="bguru_slide_one_heading">Heading:</label></th>
                    <td><input type="text" id="bguru_slide_one_heading" size="50" name="bguru_options[bguru_slide_one_heading]" value="<?php
 echo $options[\'bguru_slide_one_heading\']; ?>" /></td>
                </tr>
                <tr valign="top">
                    <th scope="row"><label for="bguru_slide_one_text">Description:</label></th>
                    <td><textarea type="text" id="bguru_slide_one_text" style="width:439px;height:100px;" name="bguru_options[bguru_slide_one_text]"><?php  echo $options[\'bguru_slide_one_text\']; ?></textarea></td>
                </tr>
              </table>
          <?php submit_button(); ?>
       </form>
     </div>
<?php  } ?>
所有表单详细信息都通过仪表板传递。如果管理员忘记填充徽标字段,则默认情况下,此$default\\u选项有效,因此默认情况下徽标字段填充,但当我尝试使用get\\u选项访问阵列时,我没有得到预期的结果。

2 个回复
SO网友:cybmeta

我想你已经添加了bguru_options 之前的选项。如果bguru_options 已存在,add_option() 什么都不做。要修改现有选项的值,应使用update_option() 相反

EDIT

我证实了我的想法。您正在跑步add_option(\'bguru_options\', $default_options); 在每个admin_init. bguru_options 选项在第一次运行时添加到数据库中,随后调用add_option(\'bguru_options\', $default_options); 什么都没做。

使用update_option() 更改现有选项的值。如果该选项不存在,将创建它使用add_option() 如果你真的需要的话。例如,如果需要设置autoload=no. 此参数不被接受update_option(). 如果需要使用,最好在插件/主题激活期间执行此操作add_option() 如果您不确定该选项是否已存在,请使用delete_option() 通话前add_option().

EDIT 2

我已经完全按照原样测试了您的代码,并且已经测试过了。默认徽标URL已正确添加到数据库中bguru_options 选项并由返回get_option(\'bguru_options\');:

$options=get_option(\'bguru_options\');
var_dump($options[\'bguru_logo\']);
根本没有问题。唯一的缺点是,如果您将URL字段留空,则不会设置默认徽标URL,因为我重复一下,add_option() 在后续调用中不执行任何操作,因为bguru_options 选项已存在。

我已经对代码进行了测试,它可以正常工作。如果它不适合你,我需要更多的信息。也许是调试日志?

不管怎样,我想告诉你怎么做get_option() 支持默认值,无需store default values in the database:

$default_options=array(
     \'bguru_logo\'=>\'http://templategraphy.com/demo/businessguru/images/logo.png\',
     \'bguru_vimeo\'=>\'\',
     \'bguru_skype\'=>\'\',
     \'bguru_dribbble\'=>\'\',
     \'bguru_slide_one_image\'=>\'\',
     \'bguru_slide_one_heading\'=>\'\',
     \'bguru_slide_one_text\'=>\'\'
 );
 $bguru_options = get_option(\'bguru_options\', $bguru_options_defaults);
 //Set defaults for unsaved subset in the array
 $bguru_options = wp_parse_args( $bguru_options, $bguru_options_defaults );

SO网友:Lucian

在将数组作为选项添加之前,应将其编码为json或序列化:

  add_option(\'bguru_options\',json_encode($default_options));

  add_option(\'bguru_options\',serialize($default_options));

结束

相关推荐

当我在admin的post.php上时,我如何知道当前的帖子类型?

当且仅当用户正在编辑post类型为“event”的帖子(post.php)时,我试图使用admin\\u init钩子做一些事情。我的问题是,即使wordpress指向一个全局变量调用$post\\u type。如果我这样做:global $post_type; var_dump($post_type); 它返回NULL。但如果我这样做:global $pagenow; var_dump($pagenow); 它返回我的当前页面。i、 e.“post.php”。我研究了