Wordpress Settings API error

时间:2012-08-21 作者:Nistor Alexandru

您好,我正在尝试为我正在开发的模板创建一些自定义选项,但我似乎遇到了一个错误:

Warning: Illegal string offset \'show_header\' in C:\\xampp\\htdocs\\wordpress\\wp-content\\themes\\01MyWork\\includes\\theme-options.php on line 62
这条线似乎抛出了错误:

 $html = \'<input type="checkbox" id="show_header" name="thanathos_theme_display_options[show_header]" value="1" \' . checked(1, $options[\'show_header\'], false) . \'/>\';  
这是全部代码:

    <?php 
    function thanatos_theme_menu(){
        add_theme_page(
                       "Thanathos Theme Options", 
                       "Thanathos Theme", 
                       "administrator", 
                       "thanathos_theme_options",
                       "thanathos_theme_display_callback"
                      );
    }
    add_action(\'admin_menu\' , \'thanatos_theme_menu\');
    function thanathos_theme_display_callback(){
?>
         <div class="wrap">  
                <div id="icon-themes" class="icon32"></div>  
                <h2>Sandbox Theme Options</h2>  

                <?php settings_errors(); ?>
                <!--Create the form that will be used to render our options-->
                <form method="post" action="options.php">
                    <?php settings_fields(\'thanathos_theme_display_options\'); ?>
                    <?php do_settings_sections( \'thanathos_theme_display_options\' ); ?>             
                    <?php submit_button(); ?>
                </form>
        </div>
<?php
    }

    add_action(\'admin_init\' , \'thanatos_initializa_theme_options\');
    function thanatos_initializa_theme_options(){
        if( false == get_option( \'thanathos_theme_display_options\' ) ) {    
            add_option( \'thanathos_theme_display_options\' );  
        } 
        add_settings_section(
                \'general_settings_section\', 
                \'Thanatos Options\', 
                \'thanatos_general_options_callback\', 
                \'thanathos_theme_display_options\'
        );
        add_settings_field(
                \'show_header\',
                \'Header\',
                \'thanathos_field_header_callback\',
                \'thanathos_theme_display_options\',
                \'general_settings_section\',
                 array(                              // The array of arguments to pass to the callback. In this case, just a description.  
                    \'Activate this setting to display the header.\'
                 ) 
        );
        register_setting(\'thanathos_theme_display_options\', \'thanathos_theme_display_options\');
    }

    function thanatos_general_options_callback(){
        echo \'mergem la mare\';
    }
    function thanathos_field_header_callback($args){
         // First, we read the options collection  
        $options = get_option(\'thanathos_theme_display_options\');
        // Next, we update the name attribute to access this element\'s ID in the context of the display options array  
        // We also access the show_header element of the options collection in the call to the checked() helper function 
        $html = \'<input type="checkbox" id="show_header" name="thanathos_theme_display_options[show_header]" value="1" \' . checked(1, $options[\'show_header\'], false) . \'/>\';  
         // Here, we\'ll take the first argument of the array and add it to a label next to the checkbox  
        $html .= \'<label for="show_header"> \'  . $args[0] . \'</label>\';   
        echo $html;
    }
?>

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

我认为根本的问题是选项数组键还不存在。让我们从这里开始,在初始化函数中:

if( false == get_option( \'thanathos_theme_display_options\' ) ) {    
    add_option( \'thanathos_theme_display_options\' );  
} 
首先,这:

false == get_option( \'thanathos_theme_display_options\' )
。。。应该是这样的:

false === get_option( \'thanathos_theme_display_options\' )
。。。因为您希望返回一个数组。

第二,这:

add_option( \'thanathos_theme_display_options\' );
。。。应该是这样的:

add_option( \'thanathos_theme_display_options\', $defaults );
。。。哪里$defaults 是定义的默认值数组。目前,您只需将一个空行添加到wp_options DB表,因为您没有告诉add_action() 要添加到选项中的值。

在讨论这个主题时,我要提到,有一种比向DB中添加默认值更好的方法。当您需要引用主题选项时,请执行以下操作,而不是执行此操作:

function thanathos_get_options() {
    $defaults = array(); // define this somewhere; reference it here
    return array_merge( $defaults, get_option( \'thanathos_theme_display_options\', array() ) );
}
此函数将返回任何用户设置的选项,如果用户没有设置任何选项,则返回到定义的主题默认值。

例如,在设置页面表单字段中:

// Get Theme Options
$options = thanathos_get_options();
// Define form-field markup
 $html = \'<input type="checkbox" id="show_header" name="thanathos_theme_display_options[show_header]" value="1" \' . checked(1, $options[\'show_header\'], false) . \'/>\';
现在,即使用户没有为\'show_header\', $options[\'show_header\'] 将返回主题定义的默认值,而不是因未设置数组键而引发错误。

SO网友:Tom J Nowell

你的错误根本不是错误

Warning: C:\\xampp\\htdocs\\wordpress\\wp content\\themes\\01MyWork\\includes\\theme options中的非法字符串偏移量“show\\u header”。php第62行

警告不是错误,错误会停止PHP执行,警告则不是(尽管如果在标题之前输出,有时可能会)。

此错误是由于访问show_header 数组的键,而无需事先检查它是否实际存在

e、 g。

$test = array();
$test[\'foo\'] = \'bar\';
echo $test[\'khjbefoc4gt8t\']; // something I made up by smushing the keyboard
这里的“khjbefoc4gt8t”未定义,我从未给过它一个值,以前也从未遇到过,所以PHP不知道要打印什么,所以它将来自一个警告。

这将更加明智:

if(isset($test[\'khjbefoc4gt8t\']){
    echo $test\'khjbefoc4gt8t\'];
}
您还可以提供默认值:

$test = array();

// setup defaults
$test = array_merge( array( \'khjbefoc4gt8t\' => \'hello world\'), $test );

// do some work
$test[\'foo\'] = \'bar\';
echo $test[\'khjbefoc4gt8t\']; // something I made up by smushing the keyboard
因此:

如果不检查可能不存在的变量,则不要访问这些变量。不要将错误日志打印到屏幕上,这就是错误日志和文本编辑器的用途。提供合理的默认值,而不是没有默认值

结束

相关推荐