設定

設定は、カスタマイザーオブジェクトのライブプレビュー、保存、およびサニタイズを処理します。各設定はコントロールオブジェクトによって管理されます。新しい設定を追加する際に利用できるいくつかのパラメータがあります:

  1. $wp_customize->add_setting( 'setting_id', array(
  2. 'type' => 'theme_mod', // or 'option'
  3. 'capability' => 'edit_theme_options',
  4. 'theme_supports' => '', // Rarely needed.
  5. 'default' => '',
  6. 'transport' => 'refresh', // or postMessage
  7. 'sanitize_callback' => '',
  8. 'sanitize_js_callback' => '', // Basically to_json.
  9. ) );

重要: widget_*sidebars_widgets[*]nav_menu[*]、または nav_menu_item[*] のような設定IDを使用しないでください。これらの設定IDパターンは、それぞれウィジェットインスタンス、サイドバー、ナビメニュー、およびナビメニューアイテムのために予約されています。「ウィジェット」を設定IDに使用する必要がある場合は、接頭辞ではなく接尾辞として使用してください。例えば「homepage_widget」のように。

設定には主に2つのタイプがあります:オプションとテーマの変更。オプションは、WordPressデータベースのwp_optionsテーブルに直接保存され、アクティブなテーマに関係なくサイトに適用されます。テーマは、オプションタイプの設定を追加することはほとんどありません。テーマの変更は、特定のテーマに特有のものです。ほとんどのテーマオプションはtheme_modsであるべきです。例えば、カスタムCSSプラグインは、テーマ_modとしてカスタムテーマCSS設定を登録でき、各テーマがテーマを切り替えたときにCSSを失うことなく、ユニークなCSSルールのセットを持つことができます。

customize-theme-mods-options
テーマ_modとオプション設定タイプの例。

通常、設定のデフォルト値とそのサニタイズコールバックを設定することが最も重要です。これにより、安全でないデータがデータベースに保存されないことが保証されます。典型的なテーマの使用法:

  1. $wp_customize->add_setting( 'accent_color', array(
  2. 'default' => '#f72525',
  3. 'sanitize_callback' => 'sanitize_hex_color',
  4. ) );

典型的なプラグインの使用法:

  1. $wp_customize->add_setting( 'myplugin_options[color]', array(
  2. 'type' => 'option',
  3. 'capability' => 'manage_options',
  4. 'default' => '#ff2525',
  5. 'sanitize_callback' => 'sanitize_hex_color',
  6. ) );

カスタマイザーは、オプションタイプを使用する設定のためにキー付き配列として保存されたオプションを処理できることに注意してください。これにより、テーマの変更ではない単一のオプションに複数の設定を保存できます。カスタマイザーオプションの値を取得して使用するには、設定IDを使用して get_theme_mod()get_option() を使用します:

  1. function my_custom_css_output() {
  2. echo '<style type="text/css" id="custom-theme-css">' .
  3. get_theme_mod( 'custom_theme_css', '' ) . '</style>';
  4. echo '<style type="text/css" id="custom-plugin-css">' .
  5. get_option( 'custom_plugin_css', '' ) . '</style>';
  6. }
  7. add_action( 'wp_head', 'my_custom_css_output');

get_theme_mod()get_option() の2番目の引数はデフォルト値であり、設定を追加する際に設定したデフォルトと一致する必要があります。

コントロール

コントロールは、UIを作成するための主要なカスタマイザーオブジェクトです。具体的には、すべてのコントロールは設定に関連付けられており、その設定はコントロールからデータベースにユーザーが入力したデータを保存します(ライブプレビューに表示することに加えて、サニタイズも行います)。コントロールはカスタマイザー管理者によって追加され、最小限の労力で堅牢なUIオプションを提供します:

  1. $wp_customize->add_control( 'setting_id', array(
  2. 'type' => 'date',
  3. 'priority' => 10, // Within the section.
  4. 'section' => 'colors', // Required, core or custom.
  5. 'label' => __( 'Date' ),
  6. 'description' => __( 'This is a date control with a red border.' ),
  7. 'input_attrs' => array(
  8. 'class' => 'my-custom-class-for-js',
  9. 'style' => 'border: 1px solid #900',
  10. 'placeholder' => __( 'mm/dd/yyyy' ),
  11. ),
  12. 'active_callback' => 'is_front_page',
  13. ) );

コントロールを追加する際の最も重要なパラメータはそのタイプです。これにより、カスタマイザーが表示するUIのタイプが決まります。コアは、いくつかの組み込みコントロールタイプを提供します:

  • <input>要素(許可されている任意のタイプ)
  • checkbox
  • textarea
  • radio(値のキー付き配列をchoices引数に渡す)
  • select(値のキー付き配列をchoices引数に渡す)
  • dropdown-pagesallow_addition引数を使用して、ユーザーがコントロールから新しいページを追加できるようにする)

html input要素によってサポートされる任意の入力タイプについては、コントロールを追加する際にタイプ属性値をタイプパラメータに渡すだけです。これにより、texthiddennumberrangeurltelemailsearchtimedatedatetime、および week のようなコントロールタイプがサポートされます(ブラウザのサポートに依存)。

コントロールは、表示される前にセクションに追加する必要があります(セクションは表示されるためにコントロールを含む必要があります)。これは、コントロールを追加する際にセクションパラメータを指定することで行います。基本的なテキストエリアコントロールを追加する例は次のとおりです:

  1. $wp_customize->add_control( 'custom_theme_css', array(
  2. 'label' => __( 'Custom Theme CSS' ),
  3. 'type' => 'textarea',
  4. 'section' => 'custom_css',
  5. ) );

基本的な範囲(スライダー)コントロールの例もあります。ほとんどのブラウザは、このコントロールの数値を表示しません。なぜなら、範囲入力タイプは、正確な値が重要でない設定のために設計されているからです。数値が重要な場合は、数値タイプの使用を検討してください。input_attrsパラメータは、属性のキー付き配列を属性にマッピングし、プレースホルダーテキストからdata-のJavaScript参照データまで、さまざまな目的に使用できます。数値および範囲コントロールの場合、最小値、最大値、およびステップ値を設定できます。

  1. $wp_customize->add_control( 'setting_id', array(
  2. 'type' => 'range',
  3. 'section' => 'title_tagline',
  4. 'label' => __( 'Range' ),
  5. 'description' => __( 'This is the range control description.' ),
  6. 'input_attrs' => array(
  7. 'min' => 0,
  8. 'max' => 10,
  9. 'step' => 2,
  10. ),
  11. ) );

コアカスタムコントロール

基本的なコントロールタイプがニーズに合わない場合は、カスタムコントロールを簡単に作成して追加できます。カスタムコントロールについては、この記事の後半で詳しく説明しますが、基本的には、必要な任意のHTMLマークアップと機能を許可するWP_Customize_Controlオブジェクトのサブクラスです。コアには、開発者がリッチなJavaScript駆動の機能を簡単に実装できるようにするいくつかの組み込みカスタムコントロールがあります。カラーピッカーコントロールは次のように追加できます:

  1. $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'color_control', array(
  2. 'label' => __( 'Accent Color', 'theme_textdomain' ),
  3. 'section' => 'media',
  4. ) ) );

WordPress 4.1および4.2では、メディアコントロールを使用して、任意のタイプのマルチメディアコンテンツのサポートも追加されました。メディアコントロールは、ネイティブのWordPressメディアマネージャーを実装し、ユーザーがライブラリからファイルを選択したり、新しいファイルをアップロードしたりできるようにします。コントロールを追加する際にmime_typeパラメータを指定することで、特定のタイプ(画像や音声など)を表示するようにメディアライブラリに指示できます:

  1. $wp_customize->add_control( new WP_Customize_Media_Control( $wp_customize, 'image_control', array(
  2. 'label' => __( 'Featured Home Page Image', 'theme_textdomain' ),
  3. 'section' => 'media',
  4. 'mime_type' => 'image',
  5. ) ) );
  1. $wp_customize->add_control( new WP_Customize_Media_Control( $wp_customize, 'audio_control', array(
  2. 'label' => _( 'Featured Home Page Recording', 'theme_textdomain' ),
  3. 'section' => 'media',
  4. 'mime_type' => 'audio',
  5. ) ) );

WP_Customize_Media_Controlに関連付けられた設定は関連付けられた添付IDを保存し、WP_Customize_Upload_Controlのすべての他のメディア関連コントロール(子)では、メディアファイルのURLを設定に保存します。詳細情報はMake WordPress Coreで入手できます。

さらに、WordPress 4.3では、WP_Customize_Cropped_Image_Controlが導入され、画像を選択した後にトリミングするためのインターフェースを提供します。これは、特定のアスペクト比が必要な場合に便利です。

セクション

セクションは、カスタマイザーコントロールのUIコンテナです。コアセクションにカスタムコントロールを追加できますが、オプションがいくつかある場合は、1つ以上のカスタムセクションを追加したいかもしれません。WP_Customize_Managerオブジェクトのadd_sectionメソッドを使用して、新しいセクションを追加します:

  1. $wp_customize->add_section( 'custom_css', array(
  2. 'title' => __( 'Custom CSS' ),
  3. 'description' => __( 'Add custom CSS here' ),
  4. 'panel' => '', // Not typically needed.
  5. 'priority' => 160,
  6. 'capability' => 'edit_theme_options',
  7. 'theme_supports' => '', // Rarely needed.
  8. ) );

デフォルト値を上書きしたいフィールドのみを含める必要があります。例えば、デフォルトの優先度(表示順)は通常受け入れ可能であり、オプションが自己説明的である場合、ほとんどのセクションには説明文が必要ありません。カスタムセクションの位置を変更したい場合は、コアセクションの優先度は以下の通りです:

タイトル ID 優先度(順序)
サイトタイトル & タグライン title_tagline 20
colors 40
ヘッダー画像 header_image 60
背景画像 background_image 80
メニュー(パネル) nav_menus 100
ウィジェット(パネル) widgets 110
静的フロントページ static_front_page 120
default 160
追加CSS custom_css 200

ほとんどの場合、セクションは1つまたは2つのパラメータを指定するだけで追加できます。テーマのフッターに関連するオプションのセクションを追加する例は次のとおりです:

  1. // Add a footer/copyright information section.
  2. $wp_customize->add_section( 'footer' , array(
  3. 'title' => __( 'Footer', 'themename' ),
  4. 'priority' => 105, // Before Widgets.
  5. ) );

パネル

カスタマイザーパネルAPIはWordPress 4.0で導入され、開発者がコントロールやセクションを超えた追加の階層を作成できるようにします。セクションのコントロールを単にグループ化するだけでなく、パネルはカスタマイザーに対してウィジェット、メニュー、または将来的には投稿の編集など、明確なコンテキストを提供するように設計されています。セクションオブジェクトとパネルオブジェクトの間には重要な技術的区別があります。

テーマは、ほとんどの場合、自分のパネルを登録すべきではありません。セクションはパネルの下にネストする必要はなく、各セクションは一般的に複数のコントロールを含むべきです。コアが提供するセクションに色オプションを追加するなど、コントロールもセクションに追加する必要があります。また、オプションができるだけ効率的であることを確認してください。詳細はWordPressの哲学を参照してください。パネルは、ウィジェット、メニュー、または投稿などの全機能のコンテキストとして設計されており、一般的なセクションのラッパーとして設計されていません。パネルを絶対に使用する必要がある場合、APIはセクションのものとほぼ同じであることがわかります:

  1. $wp_customize->add_panel( 'menus', array(
  2. 'title' => __( 'Menus' ),
  3. 'description' => $description, // Include html tags such as <p>.
  4. 'priority' => 160, // Mixed with top-level-section hierarchy.
  5. ) );
  6. $wp_customize->add_section( $section_id , array(
  7. 'title' => $menu->name,
  8. 'panel' => 'menus',
  9. ) );

パネルには、表示されるために少なくとも1つのセクションが含まれている必要があります。セクションには、少なくとも1つのコントロールが含まれている必要があります。上記の例のように、セクションはコントロールがセクションに追加されるのと同様にパネルに追加できます。ただし、コントロールとは異なり、セクションを登録する際にPanelパラメータが空の場合、メインのトップレベルのカスタマイザーコンテキストに表示されます。ほとんどのセクションはパネルに含まれるべきではありません。

カスタムコントロール、セクション、およびパネル

カスタムコントロール、セクション、およびパネルは、それぞれのカスタマイザーオブジェクトに関連付けられたPHPオブジェクトをサブクラス化することで簡単に作成できます:WP_Customize_ControlWP_Customize_Section、およびWP_Customize_PanelWP_Customize_Settingについても同様ですが、カスタム設定は通常、次のセクションで説明するカスタム設定タイプを使用して実装する方が良いです)。基本的なカスタムコントロールの例は次のとおりです:

  1. class WP_New_Menu_Customize_Control extends WP_Customize_Control {
  2. public $type = 'new_menu';
  3. /**
  4. * Render the control's content.
  5. */
  6. public function render_content() {
  7. ?>
  8. <button class="button button-primary" id="create-new-menu-submit" tabindex="0"><?php _e( 'Create Menu' ); ?></button>
  9. <?php
  10. }
  11. }

基本コントロールクラスをサブクラス化することで、必要に応じてカスタム機能で任意の機能をオーバーライドしたり、コア機能を使用したりできます。最も一般的にオーバーライドされる関数はrender_content()で、これによりHTMLを使用してカスタムUIをゼロから作成できます。ただし、カスタムコントロールは注意して使用する必要があります。周囲のコアUIと一貫性のないUIを導入し、ユーザーに混乱を引き起こす可能性があるからです。カスタムカスタマイザーオブジェクトは、デフォルトのコントロール、セクション、およびパネルが追加されるのと同様に追加できます:

  1. $wp_customize->add_control(
  2. new WP_Customize_Color_Control(
  3. $wp_customize, // WP_Customize_Manager
  4. 'accent_color', // Setting id
  5. array( // Args, including any custom ones.
  6. 'label' => __( 'Accent Color' ),
  7. 'section' => 'colors',
  8. )
  9. )
  10. );

コントロールを追加する際に渡されるパラメータは、コントロールクラス内のクラス変数にマッピングされるため、カスタムオブジェクトの特定の部分が異なるインスタンス間で異なる場合にカスタム変数を追加して使用できます。

カスタムコントロール、セクション、またはパネルを作成する際は、オーバーライド可能な機能を完全に理解するためにコアコードを参照することを強くお勧めします。コアには、各タイプのカスタムオブジェクトの例も含まれています。これは、wp-includes/class-wp-customize-control.phpwp-includes/class-wp-customize-section.php、およびwp-includes/class-wp-customize-panel.phpで見つけることができます。また、各カスタマイザーオブジェクトタイプにはJavaScript APIがあり、カスタムオブジェクトで拡張できます。詳細については、カスタマイザーJavaScript APIセクションを参照してください。

カスタマイザーUI基準

カスタムカスタマイザーコントロール、セクション、およびパネルは、可能な限りコアUIの慣行に一致する必要があります。これには、.buttonおよび.button-primaryクラスを使用するなど、wp-adminの基準に依存することが含まれます。カスタマイザーに特有のいくつかの基準もあります(WordPress 4.7現在):

  • 白い背景色は、ナビゲーションおよびアクション可能なアイテム(入力など)を示すためにのみ使用されます。
  • 一般的な#eee背景色は、白い要素に対して視覚的なコントラストを提供します。
  • 1px #dddボーダーは、ナビゲーション要素を背景のマージンや互いから分離します。
  • 視覚的な分離が望ましい要素間には15pxのスペースが提供されます。
  • ナビゲーション要素の一方の側に4pxボーダーが使用され、ホバーまたはフォーカスを示し、#0073aaの色が使用されます。
  • カスタマイザーのテキストはcolor: #555d66を使用し、ナビゲーション要素のホバーおよびフォーカス状態には#0073aaが使用されます。

カスタム設定タイプ

デフォルトでは、カスタマイザーは設定をオプションまたはテーマの変更として保存することをサポートしています。しかし、この動作は、WordPressデータベースのwp_optionsテーブルの外で設定を手動で保存およびプレビューしたり、他のカスタム処理を適用したりするために簡単に上書きできます。始めるには、設定を追加する際にオプションまたはtheme_mod以外のタイプを指定します(ほぼ任意の文字列を使用できます):

  1. $wp_customize->add_setting( $nav_menu_setting_id, array(
  2. 'type' => 'nav_menu',
  3. 'default' => $item_ids,
  4. ) );

関連付けられたコントロールで値が変更されると、設定はもはや保存またはプレビューされません。これで、customize_update_$setting->typeおよびcustomize_preview_$setting->typeアクションを使用してカスタム保存およびプレビュー機能を実装できます。メニューアイテムの順序プロパティを保存するためのメニューカスタマイザープロジェクトの例は次のとおりです(設定の値はメニューIDの順序付き配列です):

  1. function menu_customizer_update_nav_menu( $value, $setting ) {
  2. $menu_id = str_replace( 'nav_menu_', '', $setting->id );
  3. // ...
  4. $i = 0;
  5. foreach( $value as $item_id ) { // $value is ordered array of item ids.
  6. menu_customizer_update_menu_item_order( $menu_id, $item_id, $i );
  7. $i++;
  8. }
  9. }
  10. add_action( 'customize_update_nav_menu', 'menu_customizer_update_nav_menu', 10, 2 );

ナビメニューアイテムのプレビューを実装する同じプラグインの例は次のとおりです(この例はPHP 5.3以上が必要です):

  1. function menu_customizer_preview_nav_menu( $setting ) {
  2. $menu_id = str_replace( 'nav_menu_', '', $setting->id );
  3. add_filter( 'wp_get_nav_menu_items', function( $items, $menu, $args ) use ( $menu_id, $setting ) {
  4. $preview_menu_id = $menu->term_id;
  5. if ( $menu_id == $preview_menu_id ) {
  6. $new_ids = $setting->post_value();
  7. foreach ( $new_ids as $item_id ) {
  8. $item = wp_setup_nav_menu_item( $item );
  9. $item->menu_order = $i;
  10. $new_items[] = $item;
  11. $i++;
  12. }
  13. return $new_items;
  14. } else {
  15. return $items;
  16. }
  17. }, 10, 3 );
  18. }
  19. add_action( 'customize_preview_nav_menu', 'menu_customizer_preview_nav_menu', 10, 2 );