web-dev-qa-db-ja.com

テーマ設定のデフォルト、初回保存前の奇妙な動作

設定APIを使ってテーマオプションページを作成していました。私は他のページ/タブから自動的にいくつかの設定を計算するためにajax呼び出しを使います。新しい設定のデフォルト( "std")はすべて入力フィールドに表示されますが、次のコマンドを使用してajax呼び出しを行うと未定義になることに気付きました。

array_merge(get_option('some_options', 'fail'), get_option('some_other_options', 'fail'));

それは私が新しい設定を最初に保存するまでそれらは未定義であるということです。以前に定義された設定はすべて結果のオブジェクトにレンダリングされますが、新しく作成された追加はすべて未定義になります。

初めてテーマに切り替えたときにオプションのデフォルトが保存されるかどうか疑問に思いました。

そのテーマを使用している間に新しいオプションを追加すると、オプションのデフォルトは保存されません。そうであれば、ユーザーがこのテーマを最初にアクティブにしたときにいくつかのキー値が省略されることを心配しています。

何が起こっているのかを明確にするためだけに。

1)私にはいくつかの選択肢があります。 - >すべてが良いです。

2)私はいくつか新しいオプションを書きます。 →トラブルが発生

3)設定ページが読み込まれます。デフォルト値は入力フィールドにありますが、電話をかけてデータベースをチェックすると。これらの新しい設定に対しては、 "undefined"が返されます。他の設定はすべて問題ありません。

4)ページをリロードします。 - >変化なし

5)変更を保存してください。

6)Ajax呼び出しは問題ありません。すべての値が定義されています。

1
Chris

これまでに保存されたオプションに頼らないでください。ユーザーがテーマ設定ページにアクセスしたことがあるかどうかに関係なく、テーマが正常に機能するようにすることをお勧めします。

最初のステップは、オプションのデフォルトを返すための関数を定義することです。

  1. それらを関数内で定義してから、そのオプション関数配列内でその関数を参照してください。

    function mytheme_option_parameters() {
        $parameters = array(
            'foo' => array( 
                'name' => 'foo',
                'title' => 'Foo',
                'std' => 'bar'
            ),
            'foo1' => array( 
                'name' => 'foo1',
                'title' => 'Foo1',
                'std' => 'bar1'
            ),
         );
         return $parameters;
    )
    
    function mytheme_option_defaults() {
        $parameters = mytheme_option_parameters;
        $defaults = array();
        foreach ( $parameters as $param ) {
            $defaults[$param['name']] = $param['std'];
        }
        return $defaults;
    } 
    
  2. あなたのオプションパラメータ配列でそれらを定義してから、関数の中でその配列をループしてください。

    function mytheme_option_defaults() {
        $parameters = mytheme_option_parameters;
        $defaults = array();
        foreach ( $parameters as $param ) {
            $defaults[$param['name']] = $param['std'];
        }
        return $defaults;
    } 
    
    function mytheme_option_defaults() {
        $defaults = array(
            'foo' => 'bar',
            'foo1' => 'bar1'
        );
        return $defaults;
    } 
    
    function mytheme_option_parameters() {
        $defaults = mytheme_option_defaults();
        $parameters = array(
            'foo' => array( 
                'name' => 'foo',
                'title' => 'Foo',
                'std' => $defaults['foo'];
            ),
            'foo1' => array( 
                'name' => 'foo1',
                'title' => 'Foo1',
                'std' => $defaults['foo1']
            ),
         );
         return $parameters;
    )
    

それから、あなたがあなたのテーマオプションを参照する必要があるとき、これをしてください:

function mytheme_get_options() {
    $defaults = mytheme_option_defaults();
    $options = wp_parse_args( get_option( 'theme_themename_options', array() ), $defaults );
    return $options;
}   

ここでの魔法は wp_parse_args() 呼び出しです。基本的に、テーマオプションが設定されていない場合はデフォルトが使用されますが、オプションに設定されている場合はそれらが使用されます。ユーザによって設定されていないオプション(例えば、新しく追加されたオプション)は、テーマ定義のデフォルトを使用するようにフォールバックします。

ユーザーが「テーマ設定」ページにアクセスしなくても、テーマはデフォルトでテーマ定義のデフォルトを使用してそのまま使用できます。また、ユーザーが実際に設定を保存したことがなければ、テーマはそのオプションのDBエントリを作成することすらありません。

1
Chip Bennett