web-dev-qa-db-ja.com

Wordpress設定APIエラー

こんにちは私は私が開発しているテンプレートのいくつかのカスタムオプションを作成しようとしていますが、エラーが発生しているようです。

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;
    }
?>
6

根本的な問題は オプション配列のキーがまだ存在していないことです 。あなたの初期化関数で、ここから始めましょう:

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']は、設定されていない配列キーにエラーをスローするのではなく、テーマ定義のデフォルト値を返します。

6
Chip Bennett

あなたのエラーはまったくエラーではありません

警告 :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

そう:

  • それらをチェックせずに存在しないかもしれない変数にアクセスしない
  • エラーログを画面に表示しないでください。エラーログとテキストエディタが目的です。
  • まったくデフォルトではなく、正しいデフォルトを指定する
4
Tom J Nowell