テーマ カスタマイザー: 条件、子テーマ、プラグイン
- <スパン>1. WordPress テーマ カスタマイザーの概要
- <スパン>2. WordPress テーマ カスタマイザーとの対話
- <スパン>3. WordPress テーマカスタマイザーの定型文
- <スパン>4. WordPress テーマ カスタマイザーのボイラープレートを拡張する
- 5.現在読んでいる内容: テーマ カスタマイザー: 条件、子テーマ、プラグイン
これまで、テーマ カスタマイザー ボイラープレートとそのフックを使用してテーマ オプションを処理することがいかに簡単であるかを見てきました。おそらく覚えていると思いますが、最も重要な手順は、「thsp_cbp_options_array」 フィルター フックにフックし、テーマで使用するオプションの配列を渡すことでした。
WordPress のアクション フックとフィルター フック (プラグイン API) とその仕組みについてはすでによくご存じだと思いますが、念のため簡単にまとめておきます (フィルター フックを例として使用します)。カスタム関数を定義し、add_filter 関数を使用して既存のフィルターにフックできます。
add_filter( $tag, $function_to_add, $priority, $accepted_args );
優先順位の議論に焦点を当てましょう。デフォルト値は 10 なので、別の数値を使用しない場合、それが関数の実行優先順位になります。数値を小さくすると、関数がより早く実行されます。したがって、次のようなことをすると:
// Adding first message
function my_theme_add_first_message( $content ) {
$content .= '<p>First Message</p>';
return $content;
}
add_filter( 'the_content', 'my_theme_add_first_message', 1 );
// Adding second message
function my_theme_add_second_message( $content ) {
$content .= '<p>Second Message</p>';
return $content;
}
add_filter( 'the_content', 'my_theme_add_second_message', 2 );
single.php またはその他のテンプレートで the_content 関数を呼び出すと、投稿コンテンツが表示され、その後に最初のメッセージ、その後に 2 番目のメッセージが表示されます。それは、このコード スニペットでの順序だからではなく、実行優先度パラメーターによるものです。フックを、丘を転がり落ちていく雪玉が途中であらゆる種類の物を拾っているようなものだと考えてください。
これはテーマ カスタマイザーのボイラープレートにどのように適用されますか?
優先順位の値を 1 に設定したカスタム関数 (例: my_theme_options_array) を使用して、テーマの function.php ファイルから 'thsp_cbp_options_array' にフックできます。 つまり、'thsp_cbp_options_array にフックする他の関数を意味します。 ' フィルター フックは、すでに定義した my_theme_options_array 関数の後に実行されます。この例を見てください。
function my_theme_options_array() {
// Using helper function to get default required capability
$thsp_cbp_capability = thsp_cbp_capability();
$options = array(
// Section ID
'my_theme_new_section' => array(
'existing_section' => false,
'args' => array(
'title' => __( 'New Section', 'my_theme_textdomain' ),
'priority' => 10
),
'fields' => array(
/*
* Radio field
*/
'my_radio_button' => array(
'setting_args' => array(
'default' => 'option-2',
'type' => 'option',
'capability' => $thsp_cbp_capability,
'transport' => 'refresh',
),
'control_args' => array(
'label' => __( 'My Radio Button', 'my_theme_textdomain' ),
'type' => 'radio', // Radio control
'choices' => array(
'option-1' => array(
'label' => __( 'Option 1', 'my_theme_textdomain' )
),
'option-2' => array(
'label' => __( 'Option 2', 'my_theme_textdomain' )
),
'option-3' => array(
'label' => __( 'Option 3', 'my_theme_textdomain' )
)
),
'priority' => 3
)
)
)
)
);
return $options;
}
add_filter( 'thsp_cbp_options_array', 'my_theme_options_array', 1 );
これにより、My Radio Button という 1 つのフィールドを含む新しいセクションがテーマ カスタマイザーに追加されます。次に、あなたまたは他の誰かが自分のテーマの子テーマを開発し、新しいセクションを保持することにしましたが、私のラジオ ボタンの代わりに私のチェックボックスを使用した方がよい場合があります。簡単:
function my_child_theme_options_array( $options ) {
// Using helper function to get default required capability
$thsp_cbp_capability = thsp_cbp_capability();
/*
* This time, we're only editing fields in my_theme_new_section in the $options array
*/
$options['my_theme_new_section']['fields'] = array(
'my_checkbox_field' => array(
'setting_args' => array(
'default' => true,
'type' => 'option',
'capability' => $thsp_cbp_capability,
'transport' => 'refresh',
),
'control_args' => array(
'label' => __( 'My Checkbox', 'my_theme_textdomain' ),
'type' => 'checkbox', // Checkbox field control
'priority' => 2
)
)
);
return $options;
}
add_filter( 'thsp_cbp_options_array', 'my_child_theme_options_array', 2 );
$options パラメータを my_theme_options_array に渡さず、my_child_theme_options_array 関数で渡したことに気づきましたか?これは、最初に 「thsp_cbp_options_array」 フックにフックしたときに、テーマ カスタマイザーのボイラープレート サンプル オプションをオーバーライドしたかったためです。その後、子テーマから再度接続するときに、親テーマのオプションを完全に削除するのではなく、少し編集するだけで済みました。そのため、$options 配列全体ではなく、$options['my_theme_new_section']['fields'] のみをいじっています。
もちろん、親テーマから 'thsp_cbp_options_array' フィルター フックに複数回フックすることもできます。テーマにプラグイン テリトリー機能を追加せず、プラグインに機能を任せるとします。はずです。ここで、特定のプラグインがアクティブな場合にのみ、いくつかのテーマ カスタマイザー オプションを表示したいとします。繰り返しますが、簡単です:
function my_plugin_dependency_options_array( $options ) {
// Using helper function to get default required capability
$thsp_cbp_capability = thsp_cbp_capability();
/*
* Only adding my_plugin_dependency_section if 'test-plugin.php' is active
*/
if ( is_plugin_active( 'test-plugin/test-plugin.php' ) ) {
$options['my_plugin_dependency_section'] = array(
'existing_section' => false,
'args' => array(
'title' => __( 'Plugin Dependency', 'my_theme_textdomain' ),
'priority' => 10
),
'fields' => array(
/*
* Text field
*/
// Field ID
'new_text_field' => array(
'setting_args' => array(
'default' => __( '', 'my_theme_textdomain' ),
'type' => 'option',
'capability' => $thsp_cbp_capability,
'transport' => 'refresh',
),
'control_args' => array(
'label' => __( 'Only shows if', 'my_theme_textdomain' ),
'type' => 'text', // Text field control
'priority' => 5
)
),
)
);
}
return $options;
}
add_filter( 'thsp_cbp_options_array', 'my_plugin_dependency_options_array', 3 );
テーマで使用するコア機能プラグインを開発したいと思いますか?テーマの function.php ファイルから行うのと同じ方法で、プラグインのファイルの 1 つから 「thsp_cbp_options_array」 にフックすることもできます。
オプションをクレイジーにしないでください
開発したテーマにオプションを追加するたびに、WordPress の中核原則の 1 つであるオプションではなく決定を念頭に置く必要があります。調子に乗って、テーマのあらゆる細かい点にユーザー オプションを追加し始めるのは簡単ですが、それは誰の利益にもなりません。これらのいくつかのトリック、特にプラグインに依存するオプションの追加が、テーマのオプション数をできるだけ低く抑えるのに役立つことを願っています。
結局のところ、テーマにすべての要素のすべての境界線の半径などのオプションがある場合、それはテーマではなく、WYSIWYG エディターであり、おそらく優れたエディターではありません。
白いシャツを買うのは、ちょっと頑張ればテーブルクロスに変身できるから買うのではなく、その「白いシャツらしさ」が好きだから買うのです。 WordPress テーマも同様であるべきです。考えられるすべての方法ですべてを実行しようとするのではなく、特定の方法でコンテンツを表示する必要があります。あなたがテーマ開発者であれば、ユーザーの期待が期待どおりであることを確認するのがあなたの仕事です。