WordPress の Quick Edit にカスタムフィールドを挿入するカスタマイズ方法

WordPress の投稿一覧ページで、Quick Edit のボタンから素早くタクソノミーを追加したりする人も多いだろう。プラグインやテーマの開発で、独自のインプットフィールドをそこに配置する必要がある場合がある。今回はその方法を紹介する。

できるだけ手順の流れを把握しやすいように、シンプルにするため、今回は、親記事の ID を設定できるフィールドを表示させる。カスタム投稿タイプで hierachical オプションが有効になっている場合は必要ない機能だが、無効になっていて、記事をツリー型表示させたい場合など、凝ったカスタマイズをする時に必要になってくる。

ちなみにこの方法は WordPress 4.9.8 以降にサポートされているフックを使うので、それ以前のバージョンでは動かない。

はじめに

流れ

流れを軽く説明。

  1. 記事リストテーブルに、カスタムカラムを挿入
  2. タイトルの非表示インライン要素に post_parent データを埋め込む
  3. クイックエディットにフィールドを挿入
  4. JavaScript でユーザーが Quick Edit ボタンを押した時に、フィールドに設定された値を表示させる
  5. CSS でカラムの幅を調整
  6. デフォルトで挿入したカラムを非表示設定

準備

  1. WordPress 4.9.8 以上
  2. 目的のカスタム投稿タイプのスラッグ。ここでは note で進める
  3. テーマの functions.php に書き込むことを想定
  4. 同階層に /js/quick_edit_post_parent.js というJavScript ファイルを作成

カスタマイズ

PHP クラスの作成

まず、フックとコールバックをひとところにまとめる PHP クラスを作ってあげる。これで関数が散らかったりすることもなく、不要になった時にクラスと関連ファイルだけ取り除けば何事もなくなるというクリーンな状態を保つことができる。

テーマの functions.php に書き込むことを想定しているが、実際自分で実装する時は、クラスごとにファイルを作ってあげてオートロードさせてやるとか工夫すればよい。ここではその説明はしない。

目的の投稿タイプ以外はカスタマイズが適用されないようにするため、コンストラクターに指定の投稿タイプのスラッグを渡し、それをプロパティに格納。

インスタンス化をして、コードが実行されるようにしておき、カスタマイズが適用されているか確認しながら進める。ここでは、note という投稿タイプのスラッグを渡して、その投稿タイプでのみ今回のカスタマイズを適用させてね、としている。

記事一覧テーブルにカスタムカラムを挿入

クイックエディットにフィールドを挿入するのになんでカスタムカラム挿入するのと思うかもだが、クイックエディットに挿入するためのフィルターフックが、カスタムカラムが無いと発動しないので、その為。後に、このカラムはデフォルトでは批評に設定のカスタマイズを行うため、ユーザーには取り散らかった印象は与えないようにすることができる。

コンストラクターに以下のフックをかけ、コールバックメソッドを配置。

manage_edit-{投稿タイプスラッグ}_columns フィルター

ここではカラムの ID は post_parent としている。

この状態で、こんな感じになる。

manage_{投稿タイプスラッグ}_posts_custom_column アクション

次に、カラムの内容を表示させる。ここでは 記事 ID と親記事 ID を表示。コンストラクターを次のように書き換える。manage_{ポストタイプスラッグ}_posts_custom_column フックが追加されたことに留意。

そして、対応するコールバックメソッドも追加。

で、こんな感じになる。

指定投稿タイプの判定

次に、指定した投稿タイプのスクリーンかどうかを判定し、それに該当するときのみ、処理を進めるようにしたいため、current_screen アクションフックをかます。コンストラクターに次を追加し、該当するコールバックメソッドも追加。

次に、クイックエディットのパネルにフィールドを挿入。上の // ここにコードを追加していく の箇所に以下を挿入。

該当するコールバックメソッドを追加。

この時点でこんな感じになる。

他の投稿タイプで来ていないか確認。大丈夫、来てないね。

JavaScript でインプットフィールドの値をアップデート

この状態だと、ユーザーがクイックエディットを開いた時点で値が設定されおらず、Update が押されると、空の値が送信されてしまう。親記事が設定されていなければ問題ないが、既に設定されている場合など問題だ。そこで、JavaScript でこの値を自動挿入させてあげる。

JavaScript 側から値を参照する為に、データを非表示で埋め込んであげる。その為に add_inline_data フィルターフックを使う。次を先程の replyToSetUp() メソッドに追加。

そして、該当するコールバックメソッドも追加。

これで Title カラムの中に非表示でデータが埋め込まれる。

次に、JavaScript を読み込む。先程の replyToSetUp() メソッドに、次を追加。

該当するコールバックメソッド。

読み込むための JavaScript スクリプト。これは、functions.php と同階層に js ディレクトリを作成しその中に, quick_edit_post_parent.js というファイル名で保存。この場所は任意。違う場所に保存の場合は上の wp_enqueue_script() の URL の値も該当するものに変更。

この時点で、Quick Edit を押すと、値が入力されている。ちなみに未設定の場合は 0 となる。

カラムの幅を修正

そのままだと、カラムの幅が広い。表示する内容も特に多くないため、幅を狭くしたい。次を replyToSetUp() に追加し、該当するコールバックも追加。

追加したカスタムカラムをデフォルトで非表示設定

この時点でほぼほぼ完成だが、ユーザーにとってカスタムカラムが必要ない場合、デフォルトで非表示にしてやることが可能。必要なユーザーは右上の Screen Options から有効にすればよい。次を replyToSetUp() に、そして、対応するコールバックメソッドも追加。

フィルターで渡される配列に、カスタムカラムの ID post_parent を追加。

PHP コード全部

全体のコードはこんな感じ。付随する JavaScript スクリプトは上に挙げたとおり。配置するファイルのパスに気をつけて。

あとがき

今回は、クイックエディットにカスタムフィールドを挿入して、親記事を変更できるようにするカスタマイズを紹介した。

既知の問題として、値を変更した直後に、もう一度 Quick Edit を押すと、値が表示されない。内部ではデータは変更されているのでページをリロードする必要がある。これに関してはまた分かることがあれば追記したい。

Leave a Reply

Your email address will not be published. Required fields are marked *