Cocoon設定画面に独自設定を追加して保存・取得する方法

Cocoonカスタマイズ集
この記事は約7分で読めます。
記事内に広告が含まれています。

はじめに

Cocoonの設定画面に独自の項目を追加したい場合は、用意されているフックや専用関数を利用することで、安全に拡張できます。

この記事では、Cocoon設定→コメントに独自メニュー(チェック項目)を追加するケースを例に、処理を大きな単位ごとに分けて解説します。

完成イメージ

実装手順

以下の手順で実装します。

  • ラベル
    PHPを追加(設定値を定義する関数を作成)

    以下のコードをfunctions.phpに追加します。

    Cocoon設定での設定値を取得・保存するにあたり、独自設定(my_comment_toggle_enableなど)の設定キーと初期値を配列として定義します。

    /**
     * カスタム設定一覧(設定キー => デフォルト値)を定義
     *
     * @return array 設定キーとデフォルト値の配列
     */
    if (!function_exists('my_cocoon_options')):
    function my_cocoon_options() {
      return [
        'my_comment_toggle_enable' => 0,
      ];
    }
    endif;
  • ラベル
    PHPを追加(設定値を取得する関数を作成)

    以下のコードをfunctions.phpに追加します。

    前述のコードで定義した設定一覧(my_cocoon_options)をもとに、指定したキーの設定値を取得する関数を作成します。

    /**
     * カスタム設定を取得
     *
     * @param string $key 設定キー名
     * @return mixed 設定値(未設定の場合はデフォルト値)
     */
    if (!function_exists('my_get_cocoon_options')):
    function get_my_cocoon_options($key) {
      $options = my_cocoon_options();
    
      return get_theme_option($key, $options[$key]);
    }
    endif;
  • ラベル
    設定値を保存する処理を作成

    以下のコードをfunctions.phpに追加します。

    前述のコードで定義した設定をもとに、フォーム送信時に値を一括保存する処理を作成します。
    Cocoonの保存フック(cocoon_settings_after_save)を利用することで、各設定値の保存処理をテーマ側に委ねす。

    // Cocoon設定値を保存
    add_action('cocoon_settings_after_save', function () {
      foreach (array_keys(my_cocoon_options()) as $key) {
        update_theme_option($key);
      }
    });
  • ラベル
    PHPを追加(作成した処理をCocoon設定ページにフック登録)

    以下のコードをfunctions.phpに追加します。

    前述のDOM挿入処理(add_comment_field)を、Cocoon設定ページ(theme-settings)が読み込まれたタイミング限定で実行されるようフックへ登録します。

    // 管理画面にメニューを追加
    add_action('admin_menu', function () {
      $page_hook = get_plugin_page_hookname('theme-settings', '');
    
      if ($page_hook) {
        add_action($page_hook, 'add_comment_field');
      }
    }, 99);
  • ラベル
    PHPを追加(設定画面にHTMLを挿入する処理を作成)

    以下のコードをfunctions.phpに追加します。

    関数(get_comment_field_html)で生成したHTMLを、JavaScriptを使ってCocoon設定画面の目的の位置へDOM 挿入します。

    /**
     * Cocoon設定(投稿)にメニュー項目を追加
     *
     * @return void
     */
    if (!function_exists('add_comment_field')):
    function add_comment_field() {
      $html = get_comment_field_html();
    
      ?>
      <script>
      // 既存の「送信ボタンラベル」設定行の前に追加
      jQuery(function ($) {
        const $target = $('#comment_submit_label').closest('tr');
        if ($target.length) {
          $target.before(<?= wp_json_encode($html); ?>);
        }
      });
      </script>
      <?php
    }
    endif;
  • ラベル
    PHPを追加(設定画面のHTMLを生成する関数を作成)

    以下のコードをfunctions.phpに追加します。

    Cocoonの設定画面に追加表示するフォームのHTMLを生成する関数を作成します。
    前述の取得関数(my_get_cocoon_option)を使って現在の設定値を呼び出し、Cocoon標準の関数でUIを出力します。

    /**
     * Cocoon設定項目のHTMLを取得
     *
     * @return string 設定項目のHTML
     */
    if (!function_exists('get_comment_field_html')):
    function get_comment_field_html() {
      ob_start();
      ?>
      <tr>
        <th scope="row">
          <label>コメントを短縮表示</label>
        </th>
        <td>
          <?php generate_checkbox_tag('my_comment_toggle_enable', get_my_cocoon_options('my_comment_toggle_enable'), 'コメントを短縮表示する'); ?>
          <?php generate_tips_tag('コメントを折りたたみ表示に切り替えます。'); ?>
        </td>
      </tr>
      <?php
      return ob_get_clean();
    }
    endif;

Cocoon独自の入力フォーム生成関数

Cocoonには管理画面用の入力フォームを簡単に作成できる便利な関数が標準で用意されています(表1参照)。
これらを利用することで、統一感のあるUIを少ないコードで構築できます。

フォーム生成関数一覧
関数説明
generate_textbox_tagテキストボックスを生成
generate_checkbox_tagチェックボックスを生成
generate_radiobox_tagラジオボタンを生成
generate_selectbox_tagセレクトボックス(プルダウン)を生成
generate_tips_tag項目の補足説明やヒントを表示

フィルターフックを使って既存の入力項目に追加する方法

前述のJavaScript(DOM操作)による挿入は「任意の位置に自由に追加できる」のに対し、フィルターフック(admin_input_form_tag)を使用する方法は「既存の特定の入力項目の直前・直後に直接要素を追加できる」のが特徴です。

完成イメージ

完成イメージ

実装方法

以下のコードをfunctions.phpに追加します。

/**
 * 管理画面入力フォームにHTMLを追加
 *
 * @param string $tag  入力フォームHTML
 * @param string $name 設定項目の保存キー
 * @return string 追加後の入力フォームHTML
 */
add_filter('admin_input_form_tag', function ($tag, $name) {
  // 対象設定項目以外は処理対象外
  if ($name !== OP_COMMENT_WEBSITE_VISIBLE) {
    return $tag;
  }

  ob_start();

  generate_checkbox_tag('my_comment_toggle_enable', get_my_cocoon_option('my_comment_toggle_enable'), 'コメントを短縮表示する');
  generate_tips_tag('コメントを折りたたみ表示に切り替えます。');

  return ob_get_clean() . $tag;
}, 10, 2);

さいごに

今回紹介した方法を使えば、Cocoonの設定画面に独自設定メニューを追加し、保存・取得まで安全に実装できます。
これにより、テーマの管理画面を拡張して、自分好みの機能を安全に追加することが可能です。

タイトルとURLをコピーしました