WordPress テーマカスタマイズAPIチートシート

WordPress

コードサンプル

基本的な書き方は、以下のコードを参照くだだい。

<?php
add_action('customize_register', 'themename_customize_register');

function themename_customize_register ($wp_customize) {

  $wp_customize->add_panel(
    'themename_panel', // パネルID
    array(
      'title'    => 'パネルタイトル',
      'priority' => 1000,
    )
  );

  $wp_customize->add_section(
    'themename_section', // セクションID
    array(
      'title'       => 'セクションタイトル',
      'description' => 'セクションの説明',
      'panel'       => 'themename_panel', // 紐付けるパネルIDを指定。省略すると最上位に表示される。
      'priority'    => 1000
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Text 1行テキスト

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_text', // 設定ID
    array(
      'default' => '',
      'priority' => 1000,
      'sanitize_callback' => 'sanitize_text_field'
    )
  );

  $wp_customize->add_control(
    'themename_control_text',
    array(
      'section'     => 'themename_section',  // 紐づけるセクションIDを指定
      'settings'    => 'themename_text',  // 紐づける設定IDを指定
      'label'       => '1行テキスト',
      'description' => '説明',
      'type'        => 'text'
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Textarea テキストエリア 複数行テキスト

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_textarea', // 設定ID
    array(
      'default' => '',
      'priority' => 1000,
      'sanitize_callback' => 'sanitize_text_field'
    )
  );

  $wp_customize->add_control(
    'themename_control_textarea',
    array(
      'section'     => 'themename_section',  // 紐づけるセクションIDを指定
      'settings'    => 'themename_textarea',  // 紐づける設定IDを指定
      'label'       => '複数行テキスト',
      'description' => '説明',
      'type'        => 'textarea'
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Checkbox チェックボックス

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_checkbox', // 設定ID
    array(
      'priority' => 1000,
      'sanitize_callback' => 'sanitize_text_field'
    );
  );

  $wp_customize->add_control(
    'themename_control_checkbox',
    array(
      'section'     => 'themename_section',  // 紐づけるセクションIDを指定
      'settings'    => 'themename_checkbox',  // 紐づける設定IDを指定
      'label'       => 'チェックボックス',
      'description' => '説明',
      'type'        => 'checkbox'
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Radio ラジオボタン

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_radio', // 設定ID
    array(
      'default' => 'value1',
      'priority' => 1000,
      'sanitize_callback' => 'sanitize_text_field'
    )
  );

  $wp_customize->add_control(
    'themename_control_radio',
    array(
      'section'     => 'themename_section',  // 紐づけるセクションIDを指定
      'settings'    => 'themename_radio',  // 紐づける設定IDを指定
      'label'       => 'ラジオボタン',
      'description' => '説明',
      'type'        => 'radio',
      'choices'     => array(
        'value1' => '選択肢 1',
        'value2' => '選択肢 2',
        'value3' => '選択肢 3'
      )
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Select セレクトボックス

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_select', // 設定ID
    array(
      'default' => 'value1',
      'priority' => 1000,
      'sanitize_callback' => 'sanitize_text_field'
    )
  );

  $wp_customize->add_control(
    'themename_control_select',
    array(
      'section'     => 'themename_section',  // 紐づけるセクションIDを指定
      'settings'    => 'themename_select',  // 紐づける設定IDを指定
      'label'       => 'セレクトボックス',
      'description' => '説明',
      'type'        => 'select',
      'choices'     => array(
        'value1' => '選択肢 1',
        'value2' => '選択肢 2',
        'value3' => '選択肢 3'
      )
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Page Dropdown 固定ページドロップダウン

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_page',
    array(
      'priority' => 1000,
      'sanitize_callback' => 'absint'
    )
  );

  $wp_customize->add_control(
    'themename_control_page',
    array(
      'section'     => 'themename_section',  // 紐づけるセクションIDを指定
      'settings'    => 'themename_page',  // 紐づける設定IDを指定
      'label'       => '固定ページ',
      'description' => '',
      'type'        => 'dropdown-pages',
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Image Upload 画像アップロード URLを取得

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_image',
    array(
      'default'           => get_theme_mod('themename_image'), // これを入れないとアップロードした画像のプレビューが消えてしまう
      'priority'          => 1000,
      'sanitize_callback' => 'esc_url_raw'
    )
  );

  $wp_customize->add_control(
    new WP_Customize_Image_Control(
      $wp_customize,
      'themename_control_image',
      array(
        'section'     => 'themename_section',  // 紐づけるセクションIDを指定
        'settings'    => 'themename_image',  // 紐づける設定IDを指定
        'label'       => '画像アップロード',
        'description' => '説明'
      )
    )
  );
  
  /////////////////////////////////////////////////////////////////////////////////////

  // Image Upload 画像アップロード 画像IDを取得

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_image_id',
    array(
      'default'           => '',
      'priority'          => 1000,
      'sanitize_callback' => 'esc_url_raw'
    )
  );

  $wp_customize->add_control(
    new WP_Customize_Image_Control(
      $wp_customize,
      'themename_control_image_id',
      array(
        'section'     => 'themename_section',  // 紐づけるセクションIDを指定
        'settings'    => 'themename_image_id',  // 紐づける設定IDを指定
        'label'       => '画像アップロード',
        'description' => '説明'
      )
    )
  );
  

  /////////////////////////////////////////////////////////////////////////////////////

  // File Upload ファイルアップロード

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_file',
    array(
      'default' => '',
      'priority' => 1000,
      'sanitize_callback' => 'themename_sanitize_file'
    )
  );

  $wp_customize->add_control(
    new WP_Customize_Upload_Control(
      $wp_customize,
      'themename_control_file',
      array(
        'section'     => 'themename_section',  // 紐づけるセクションIDを指定
        'settings'    => 'themename_file',  // 紐づける設定IDを指定
        'label'       => 'ファイルアップロード',
        'description' => '',
      )
    )
  );

  /////////////////////////////////////////////////////////////////////////////////////

  // Color Picker カラーピッカー

  /////////////////////////////////////////////////////////////////////////////////////

  $wp_customize->add_setting(
    'themename_color',
    array(
      'default'           => '',
      'priority'          => 1000,
      'sanitize_callback' => 'sanitize_hex_color'
    )
  );

  $wp_customize->add_control(
    new WP_Customize_Color_Control(
      $wp_customize,
      'themename_control_color',
      array(
        'section'     => 'themename_section',  // 紐づけるセクションIDを指定
        'settings'    => 'themename_color',  // 紐づける設定IDを指定
        'label'       => 'カラーピッカー',
        'description' => ''
      )
    )
  );
}

/////////////////////////////////////////////////////////////////////////////////////

// Sanitize Callback サニタイズ

/////////////////////////////////////////////////////////////////////////////////////

// チェックボックス用
function themename_sanitize_checkbox($input) {
  return $input ? true : false;
}

// ファイル用
function themename_sanitize_file($input, $setting) {
  $mimes = array(
    'jpg|jpeg|jpe' => 'image/jpeg',
    'gif'          => 'image/gif',
    'png'          => 'image/png',
    'svg'          => 'image/svg+xml',
    'bmp'          => 'image/bmp',
    'tif|tiff'     => 'image/tiff',
    'ico'          => 'image/x-icon'
  );
  $file = wp_check_filetype($input, $mimes);
  return ($file['ext'] ? $input : $setting->default);
}

WordPressのビルトインセクション

WordPressでもともと用意されている、add_control で指定できるセクション。

title_taglineサイトタイトルと説明文
colors
header_imageヘッダー画像
background_image背景画像
static_front_pageホームページ設定

フィールドタイプ

add_controltype で指定できるタイプ名。他にもあると思う。

text1行テキスト
textarea複数行テキスト
emailメールアドレス
number数値
urlURL
selectセレクトボックス
checkboxチェックボックス
radioラジオボタン
dropdown-pagesドロップダウン固定ページ

設定値の読み出しには get_theme_mod()を使う

<?php
return get_theme_mod(設定ID, デフォルト値);

第1引数は設定ID、第2引数はデフォルト値を設定できる。add_setting の第2引数の default="xxx" でデフォルト値を設定してない場合でも、こちらに設定しておけば良い。

get_theme_mod()の注意点

注意点として、add_setting の第2引数に 'type' => 'option' 等を設定していると、get_theme_mod() が使えないので、覚えておくべし。

というのも、デフォルトでは theme_mods_テーマ名 という名前でoptionに登録されるのだが、 'type' => 'option' を設定した項目は、設定IDの名前でデータベースのoptionに登録されるため。なので、その場合 get_option() で取得する必要がある。

サニタイズ sanitize_callback

設定項目には sanitize_callback を指定するべき。なくても動くけど、テーマを公式リポジトリに公開するには全ての設定項目に sanitize_callback を設定しなければなりません。

テキスト / テキストエリア

sanitize_text_field

HTMLタグの削除や記号のエスケープなどで文字列を無害化する。前後の半角スペースのトリミングも行われる。

wp_strip_all_tags

scriptstyle を含むすべてのHTMLタグを削除する。

wp_filter_nohtml_kses の方が、不正なHTMLをよりよい方法で処理しようとするが、完全なHTMLパーサーではなく、かつはるかに遅い。通常は wp_strip_all_tags が推奨される。

CSS

wp_strip_all_tags を使うとよい。

HTML

wp_filter_post_kses

文字列を無害化するが、HTMLタグが使える。script タグは削除される。インラインスタイルの display 属性など特定のプロパティは削除される。クオーテーション, ダブルクオーテーションはエスケープされる。

メールアドレス

sanitize_email

メールアドレスに使用できない文字を削除する。

URL

esc_url_raw

URLエンコードされる。

sanitize_hex_color

有効なHEXカラー(#000000 から #ffffff まで)の場合はそのまま、それ以外は null を返す。

数値

absint

数値を正の整数に変換する。

チェックボックス

自前で用意する。

function themename_sanitize_checkbox($input) {
  return (isset($input) ? true : false);
}

ラジオボタン / セレクトボックス

さまざまなサイトでこれ↓が紹介されているが…僕の環境では$choicesnull になってしまうので使えない。

function themename_sanitize_select($input, $setting) {
  $input = sanitize_key($input);
  $choices = $setting->manager->get_control($setting->id)->choices;
  return (array_key_exists($input, $choices) ? $input : $setting->default);
}

null になる原因は、get_control() の引数に control のIDではなく setting のIDを入れてるからだと思うんだけど、皆はこれでうまく取得できているのだろうか?

もちろん、control のIDを手動でハードコードすると choices を正しく取得できる。つまり $setting からそれぞれの control のIDを取得できれば解決するのだが、ググっても方法がわからない。(上のコードばかり出てくる)。

というわけで、僕は代替としてsanitize_text_field を使ってる。

ドロップダウン固定ページ

absint を使う。

ファイルアップロード

自前で用意する。

function theme_slug_sanitize_image($input, $setting) {
  $mimes = array(
    'jpg|jpeg|jpe' => 'image/jpeg',
    'gif'          => 'image/gif',
    'png'          => 'image/png',
    'svg'          => 'image/svg+xml',
    'bmp'          => 'image/bmp',
    'tif|tiff'     => 'image/tiff',
    'ico'          => 'image/x-icon'
  );
  $file = wp_check_filetype($input, $mimes);
  return ($file['ext'] ? $input : $setting->default);
}

参考文献