画像ブロックですでにアップロード済みの画像を再利用する際、「メディアライブラリ」を開いてその中から選択するが、画像が多くなったら「日付」だけで絞り込むのはしんどい感じがしたので、カスタムタクソノミーを追加したいと思ったのが、先月くらい。Googleで検索してもそれっぽい内容を検索できず、ChatGPTで問い合わせしても意図した通りの挙動にはならず、ちょっと時間がかかってしまった。
ChatGPT(無料版)でやりとりしている中でちょっと意外だったのが、現時点で対応しているWordPressのバージョンは「5.8」ということ。5.9のリリースは2022年1月になるので、WordPressに関しては2021年以前の情報がベースになるらしい。分野によってどの程度違いがあるのか少し気になる。。。
さて本題も戻すと、「メディア」-「ライブラリ」で表示される内容は、リスト表示とグリッド表示の2種類があり、画像ブロックで表示される「メディアライブラリ」はグリッド表示とほぼ同じふるまいになっていた。拡張方法は、2つの表示内容でまったく異なっており、リスト表示はPHPだけで済むが、グリッド表示のほうはJavaScriptも用意する必要がある。
グリッド表示で今回使用したのが、admin_enqueue_scriptsアクションのほか、ajax_query_attachments_args、media_view_settings、media_view_stringsフィルターになる。media_view_settingsとmedia_view_stringsフィルターはwp_enqueue_media関数内で呼び出されるもので、JavaScript側ではwp.media.view.settingsとwp.media.view.l10nのプロパティからそれぞれのデータを参照できる。JavaScript側へデータを渡す汎用的な方法としてはwp_add_inline_script関数を使用すうこともできるが、メディアライブラリ用のJavaScriptであれば、media_view_settingsおよびmedia_view_stringsフィルターを使うほうがよいと判断した。
admin_enqueue_scriptsアクションのコールバック関数のポイントは、第1パラメータをチェックする際、投稿編集ページも含めること。post.phpだけでなく、post-new.phpも指定する。
if ( in_array( $hook_suffix, [ 'upload.php', 'post.php', 'post-new.php' ] ) ) {
ajax_query_attachments_argsフィルターのコールバック関数ではカスタムタクソノミー「グループ」を検索条件に追加する処理を行う。プルダウンメニューの選択が変わる度にこのフィルターは呼び出されており、$query[‘tax_query’]に検索条件を設定することになる。
今回予想以上に時間がかかってしまったが、想定通りに動いてくれればその苦労も報われた。既存ブロックのちょっとした拡張はなかなか面白い。