こんにちは私は私が開発しているテンプレートのいくつかのカスタムオプションを作成しようとしていますが、エラーが発生しているようです。
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;
}
?>
根本的な問題は オプション配列のキーがまだ存在していないことです 。あなたの初期化関数で、ここから始めましょう:
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
はデフォルト値の定義済み配列です。現状では、add_action()
に values をオプションに追加するように指示していないため、wp_options
DBテーブルに 空の行 を追加するだけです。
私たちが話題にしている間、私は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 optionsを返しますが、ユーザーがオプションを設定していない場合は Theme-defined defaultsに戻ります。
たとえば、設定ページのフォームフィールドでは、次のようになります。
// 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']
は、設定されていない配列キーにエラーをスローするのではなく、テーマ定義のデフォルト値を返します。
あなたのエラーはまったくエラーではありません
警告 :C:\ xampp\htdocs\wordpress\wp-content\themes\01の不正な文字列オフセット 'show_header' 62行目の\ MyMy\includes\theme-options.php
警告はエラーではありません、エラーは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
そう: