WordPressをカスタマイズしていると、以下のような場面に出くわすことが多いと思います。
- 投稿や固定ページ一覧に列を追加して、何か(カスタムフィールドの値など)を表示したい
- カスタムフィールドを簡単に入力・保存できるように、カスタムメタボックスを編集画面へ挿入したい
この2つの実装方法については、検索すればたくさんのサイトやページで紹介されているので、それを参考にされればいいと思うのですが、これらを独自に追加したカスタム投稿タイプで実装する時どうしてますか?
基本的に、どちらの場合も、以下の流れで実装するでしょう。
- 列やメタボックスを追加するためのコールバック関数を作る
- フックや関数を使って表示させるようにする
一覧への列追加の場合以下のフィルターフックを、
manage_{post_type}_posts_columns
メタボックスを表示する場合、以下の関数を使いますね。
add_meta_box( $id , $title , $callback , $screen , $context , $priority );
例えば、複数のカスタム投稿タイプの一覧へ同じ列を追加したい時、これまで私は以下のようにしてきました。
add_filter('manage_custompostytpe1_posts_columns','コールバック関数');
add_filter('manage_custompostytpe2_posts_columns','コールバック関数');
add_filter('manage_custompostytpe3_posts_columns','コールバック関数');
add_filter('manage_custompostytpe4_posts_columns','コールバック関数');
個人ユースであれば、これで事足りるんです。
でも、今後追加される、削除される度に漏れなくメンテナンスできるかというとちょっと不安。
そこで今回は、カスタム投稿タイプの作成・削除をした際にもノーメンテナンスで同じ処理がされる(上記の場合は一覧へ列が追加される)ようにする方法を自身のメモも兼ねて紹介したいと思います。
本ページ掲載のコードを使用するときは
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
動作したスニペット
ダラダラ書いてもしょうがないので、いきなりですが動作した方法をば。
冒頭で書いたように、やりたいことは、カスタム投稿タイプの増減によってコードを追加・削除することなく管理画面の列やメタボックスが自動で追加・削除されることです。
文末の参考ページの2の方法を使えば、ほぼまんまのやり方で結構簡単に実装できます。
ただ、問題なのは、プラグインなどが管理画面側でのみ追加したカスタム投稿タイプにも追加されてしまうことです。これについては参考ページでもさらに工夫が必要という風に書かれています。
ではどうする?の解が以下のコードです。
/* 公開しているすべての投稿タイプへ管理画面一覧の列を追加 */
if ( !function_exists( 'sample_add_admin_columns' ) ){
function sample_add_admin_columns(){
//コールバック関数をセット
$function = 'コールバック関数';
//投稿や固定ページと同じ機能を持つ投稿タイプを$post_typesへ代入
$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));
//$post_typeで公開になっていない投稿タイプを除外して$post_keyに代入し直す
foreach ($post_types as $post_key => $post_type) {
if (!is_post_type_viewable($post_type)) {
unset($post_types[$post_type]);
}
}
//$post_keyに合致する投稿タイプに対してコールバック関数の列を表示
foreach ($post_types as $post_key) {
add_filter( 'manage_'.$post_key.'_posts_columns', $function );
}
}
}
add_action( 'admin_menu' , 'sample_add_admin_columns' );
上のコードは管理画面の一覧に列(カラム)を表示させるためのものですが、add_filter...の行をメタボックス用の関数に変えれば同様に動作します。
あとは、列の出力用のコールバック関数を用意して、コード中の「コールバック関数」のところに入れれば動作するようになります。
列がなければ、その中に表示する値も当然存在しないので、値の表示を行う関数やフックは基本的に変更する必要はありません
...とちょっと乱暴すぎる感があるので、コードの解説や詳しい使い方を見たいという方は次項を参照ください。
コードが行っていること
もう一度コードを以下に転記しておきますのでそれを見ながら解説をご覧ください。
/* 公開しているすべての投稿タイプへ管理画面一覧の列を追加 */
if ( !function_exists( 'sample_add_admin_columns' ) ){
function sample_add_admin_columns(){
//コールバック関数をセット
$function = 'コールバック関数';
//投稿や固定ページと同じ機能を持つ投稿タイプを$post_typesへ代入
$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));
//$post_typeで公開になっていない投稿タイプを除外して$post_keyに代入し直す
foreach ($post_types as $post_key => $post_type) {
if (!is_post_type_viewable($post_type)) {
unset($post_types[$post_type]);
}
}
//$post_keyに合致する投稿タイプに対してコールバック関数の列を表示
foreach ($post_types as $post_key) {
add_filter( 'manage_'.$post_key.'_posts_columns', $function );
}
}
}
add_action( 'admin_menu' , 'sample_add_admin_columns' );
コード中にあるコメントごとに解説していきます。
「投稿や固定ページと同じ機能を持つ投稿タイプを$post_typesへ代入」
$post_typesという変数に、get_post_types_by_supportという関数を使って、「タイトルとエディター(本文の編集)とアイキャッチ画像」がある投稿タイプをすべて抽出して格納します。
「タイトルとエディター(本文の編集)とアイキャッチ画像」がある..というのは、WordPressのインストール時の状態では「投稿」「固定ページ」「再利用ブロック」になります。また、プラグインなどが追加するカスタム投稿タイプも含まれます
$post_typeで公開になっていない投稿タイプを除外して$post_keyに代入し直す
前項の措置では、デフォルト状態の場合、再利用ブロックやプラグインなどが追加した投稿タイプも含まれてしまうので、それらを除外して抽出し直します。
具体的にはis_post_type_viewableという関数を使います。
上記コードでは以下のことを行っています。
- 抽出した$post_types内の投稿タイプをforeachを使って1つ1つ検証していきます
- is_post_type_viewable関数を使って、フロントエンドで公開できるようになっている投稿タイプ以外を除外していきます
- 最終的にフロントエンドで公開できるようになっている投稿タイプのみを$post_keyという変数へ格納しなおします
これで、一般公開されていない(再利用ブロックやプラグインなどが追加した投稿タイプなど)を除いた投稿タイプの一覧($post_key)が完成します。
$post_keyに合致する投稿タイプに対してコールバック関数の列を並び替え可能にする
最後に、処理させたいもの(上記コードの場合は管理画面の一覧に列を追加する)を再びforeachで$post_keyにある投稿タイプの数だけ回して、コールバック関数を発火させるということをします。
これを最終的にadmin_menuにフックさせて、管理画面が生成されるときに処理が実行されるようにしています。
以下は管理画面に「最終更新日」という列を追加するためのコード一式です。コピペで実装して、以下の点を確認ください。
- 管理画面の投稿・固定ページの一覧で、「日付」欄の左に「最終更新日」という列が表示される
- 各行に「最終更新日」が表示される
- 再利用ブロック(やプラグインが生成したカスタム投稿タイプ)ではその行は表示されない
一応テストサイトへコピーして動作確認をしていますが、お使いの環境ではエラーが出たりすることがあります。エラー時の対処に明るくない方は、コピーしての試用を行わないでください
/***** 管理画面一覧へ最終更新日を表示 *****/
/* 投稿一覧へカラム作成するコールバック関数 */
if ( !function_exists( 'sample_modified_column_register' ) ){
function sample_modified_column_register( $columns) {
$new_columns = array();
//date(公開日)の左に表示
foreach ( $columns as $column_name => $column_display_name ) {
if ( $column_name == 'date' ) {
$new_columns['Modified'] =__('最終更新日');
}
$new_columns[ $column_name ] = $column_display_name;
}
return $new_columns;
}
}
/* 公開しているすべての投稿タイプへ最終更新日の列を追加 */
if ( !function_exists( 'sample_add_admin_columns' ) ){
function sample_add_admin_columns(){
//コールバック関数をセット
$function = 'sample_modified_column_register';
//投稿や固定ページと同じ機能を持つ投稿タイプを$post_typesへ代入
$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));
//$post_typeで公開になっていない投稿タイプを除外して$post_keyに代入し直す
foreach ($post_types as $post_key => $post_type) {
if (!is_post_type_viewable($post_type)) {
unset($post_types[$post_type]);
}
}
//$post_keyに合致する投稿タイプに対してコールバック関数の列を表示
foreach ($post_types as $post_key) {
add_filter( 'manage_'.$post_key.'_posts_columns', $function );
}
}
}
add_action( 'admin_menu' , 'sample_add_admin_columns' );
/* 更新日の出力 */
if ( !function_exists( 'sample_modified_column_display' ) ){
function sample_modified_column_display( $column_name, $post_id ) {
switch ( $column_name ) {
case 'Modified':
global $post;
$mod_date_data = get_the_modified_date();
echo $mod_date_data;
break;
}
}
}
add_action( 'manage_posts_custom_column', 'sample_modified_column_display', 5, 2 );
add_action( 'manage_pages_custom_column', 'sample_modified_column_display', 5, 2 );
列幅の調整コードは入れていませんので幅広く表示されますから、ご自身で調整してください
どうでしたか?うまく動作しましたか?
本ページで紹介した方法(コード)は、あくまでも一例であり、環境によっては思ったように動作しない場合もあります。
また、他にもいろいろな方法があると思いますので、他のサイトのページなどもいろいろと調べて研究してみてください。
参考にさせていただいたページ
この機能を実装するにあたり、以下のページを参考にさせていただきました。
どの方法がどのような挙動をするかについては、実際にご自身のサイトで実装してみて、一番希望に合う、一番コードの管理がしやすい方法を選ばれるとよいでしょう。
- カスタム投稿タイプの管理画面の投稿一覧に並び順を追加する方法
- WordPressで利用されている「カスタム投稿タイプ名」をすべて取得する関数
- Only get post types based on support
ちなみに私は順番に実装してみて、最後のリンク先ページの方法を応用して、このサイト(正確にはこのサイトで配布している「Hima Art Utility」プラグイン)へ実装しました。
コメントを残す