问题描述
嗨,我正在尝试为我正在开发的模板创建一些自定义选项,但是我似乎收到一个错误:
Warning: Illegal string offset 'show_header' in C:xampphtdocswordpresswp-contentthemes1MyWorkincludestheme-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;
}
?>
最佳解决方案
我相信基本的问题是选项数组键不存在。我们从这里开始,在你的初始化函数中:
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
数据库表添加一个空行,因为您没有告知 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() ) );
}
此功能将返回任何 user-set 选项,如果用户未设置任何选项,则返回到 Theme-defined 默认值。
所以例如在您的设置页面窗体字段中:
// 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']
将返回 Theme-defined 默认值,而不是为未设置的数组键发出错误。
次佳解决方案
你的错误根本不是错误
Warning: Illegal string offset ‘show_header’ in C:xampphtdocswordpresswp-contentthemes1MyWorkincludestheme-options.php on line 62
一个警告不是错误,一个错误会阻止 PHP 的执行,一个警告不会 (尽管有时它可以如果它在头之前输出) 。
此错误是通过访问数组的 show_header
键而不事先检查其实际存在的
例如
$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
所以:
-
不检查可能不存在的变量
-
不要将错误日志打印到屏幕上,这就是错误日志和文本编辑器
-
提供合理的默认值,而不是没有
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。