このプラグインは、カスタム投稿タイプの件数を表示するプラグインですから、まずはカスタム投稿タイプを追加します。Custom Post Type UIなどのプラグインで追加するのが一般的です。最近はAdvanced Custom Fields (ACF)でもできるようになったようですね。今回はプラグインにカスタム投稿タイプを追加するコードを含めます。
そもそもカスタム投稿タイプとは、WordPressに標準で搭載されているpost(投稿)、page(固定ページ)などの標準の投稿タイプに並ぶ新しい投稿タイプです。フロントエンドに表示するか、アーカイブページを作成するか、階層構造にするかなどのオプションを指定して作成します。
カスタム投稿タイプを追加する
あらかじめ、カスタム投稿タイプの内部名と公開側の名前を決めておきます。今回はプラグイン名の頭文字で始まるdrnp-mycpt-a
, drnp-mycpt-b
という2つのカスタム投稿タイプを作ります。ハンドブックのRegistering Custom Post Typesのサンプルを参考にし、以下のコードを追加します。
function drnp_add_my_custom_post_type() {
$custom_post_types = array(
'drnp-mycpt-a' => array(
'type' => 'drnp-mycpt-a',
'name' => 'マイCPT-A',
),
'drnp-mycpt-b' => array(
'type' => 'drnp-mycpt-b',
'name' => 'マイCPT-B',
),
);
foreach ( $custom_post_types as $custom_post_type ) {
register_post_type(
$custom_post_type['type'],
array(
'labels' => array(
'name' => $custom_post_type['name'],
'singular_name' => $custom_post_type['name'],
),
'public' => true,
)
);
}
}
add_action( 'init', 'drnp_add_my_custom_post_type' );
関数名がdrnp_
で始まっているのは、他のプラグインと関数名が重ならないようにするためです。プラグインをクラス化すれば、重複の可能性をさらに低くすることもできますが、まずはクラス化せずに進めていきます。
関数drnp_add_my_custom_post_type()
内にあるregister_post_type
関数でカスタム投稿タイプdrnp-mycpt-a
, drnp-mycpt-b
を作成します。コードリファレンスのregister_post_typeには以下のように説明されています。
register_post_type( string $post_type, array|string $args = array() ): WP_Post_Type|WP_Error
register_post_type() – Function | Developer.WordPress.org
値 | 型 | 必須 | デフォルト値 | 内容 |
---|---|---|---|---|
第1引数 | string (文字列)型の$post_type | 必須 | カスタム投稿タイプの内部名を指定 | |
第2引数 | array (配列)またはstring (文字列)型の$args | 任意 | array() (空の配列) | カスタム投稿タイプのオプションを指定 |
返り値 | WP_Post_Type オブジェクトまたはWP_Error オブジェクト | 処理成功:WP_Post_Type オブジェクト処理失敗: WP_Error オブジェクト |
関数drnp_add_my_custom_post_type()
を実行するタイミングは、ハンドブックに従います。
You must call register_post_type() before the admin_init hook and after the after_setup_theme hook. A good hook to use is the init action hook.
Registering Custom Post Types – Plugin Handbook | Developer.WordPress.org
register_post_type()はadmin_initフックの前、かつafter_setup_themeフックの後に呼び出さなければなりません。initアクションフックで呼び出すのが最善でしょう。
add_actionを使い、initアクションフックで呼び出すようにします。
カスタム投稿の記事を追加する
プラグインからカスタム投稿の記事を追加します。関数drnp_add_my_custom_post_type()
内のregister_post_type()
直後で以下のコードを実行します。
if ( 0 === wp_count_posts( $custom_post_type['type'] )->publish ) {
for ( $i = 1; $i <= 3; $i++ ) {
wp_insert_post(
array(
'post_type' => $custom_post_type['type'],
'post_title' => $custom_post_type['name'] . ' 記事 #' . $i,
'post_status' => 'publish',
)
);
}
}
wp_count_posts()
はカスタム投稿タイプの記事数を、記事のステータス別に取得します。公開されている記事の件数が0のとき、wp_insert_post()
でサンプルの記事を3件追加します。
プラグインアンインストール時の処理
プラグインをアンインスールするときに、サンプル記事を削除する処理を追加します。register_uninstall_hook()
を使用します。この関数の引数は次のとおりです。
register_uninstall_hook( string $file, callable $callback )
register_uninstall_hook() – Function | Developer.WordPress.org
この関数は、以下の引数を取ります。
値 | 型 | 必須 | デフォルト値 | 内容 |
---|---|---|---|---|
第1引数 | string (文字列)型の$file | 必須 | プラグインファイル。第2引数で指定する関数を含むファイルを指定。自分自身を指定する場合、__FILE__ とする | |
第2引数 | callable型の$callback | 必須 | アンインストール時に実行される関数名 |
function drnp_uninstall_my_custom_post_type() {
$args = array(
'post_type' => array(
'drnp-mycpt-a',
'drnp-mycpt-b',
),
'numberposts' => -1,
);
$posts = get_posts( $args );
foreach ( $posts as $post ) {
wp_delete_post( $post->ID );
}
}
register_uninstall_hook( __FILE__, 'drnp_uninstall_my_custom_post_type' );
get_posts()関数でカスタム投稿タイプdrnp-mycpt-a
, drnp-mycpt-b
の記事を取得します。'numberposts' => -1
とすることで、条件に該当する記事を配列で全件取得します。あとは、foreachで配列を回し、wp_delete_post()
で記事を削除します。
コードまとめ
ここまでのコードにコメントを追加してまとめておきます。
<?php
/**
* Dashboard Right Now Plus
*
* @package DashboardRightNowPlus
*
* @wordpress-plugin
* Plugin Name: Dashboard Right Now Plus
* Plugin URI: https://gist.github.com/web83info/5747ac715e4544b408e91e2ec034ab05/
* Description: Add custom post type to "Right Now" meta box on WordPress dashboard
* Version: 1.0.0
* Requires at least: 6.4
* Requires PHP: 7.2
* Author: web83info
* Author URI: https://labs.web83.info/
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
/**
* カスタム投稿タイプdrnp-mycpt-a, drnp-mycpt-b を追加
*
* @return void
*/
function drnp_add_my_custom_post_type() {
$custom_post_types = array(
'drnp-mycpt-a' => array(
'type' => 'drnp-mycpt-a',
'name' => 'マイCPT-A',
),
'drnp-mycpt-b' => array(
'type' => 'drnp-mycpt-b',
'name' => 'マイCPT-B',
),
);
foreach ( $custom_post_types as $custom_post_type ) {
register_post_type(
$custom_post_type['type'],
array(
'labels' => array(
'name' => $custom_post_type['name'],
'singular_name' => $custom_post_type['name'],
),
'public' => true,
)
);
if ( 0 === wp_count_posts( $custom_post_type['type'] )->publish ) {
for ( $i = 1; $i <= 3; $i++ ) {
wp_insert_post(
array(
'post_type' => $custom_post_type['type'],
'post_title' => $custom_post_type['name'] . ' 記事 #' . $i,
'post_status' => 'publish',
)
);
}
}
}
}
add_action( 'init', 'drnp_add_my_custom_post_type' );
/**
* アンインストール時にカスタム投稿タイプdrnp-mycpt-a, drnp-mycpt-b の記事を削除
*
* @return void
*/
function drnp_uninstall_my_custom_post_type() {
$args = array(
'post_type' => array(
'drnp-mycpt-a',
'drnp-mycpt-b',
),
'numberposts' => -1,
);
$posts = get_posts( $args );
foreach ( $posts as $post ) {
wp_delete_post( $post->ID );
}
}
register_uninstall_hook( __FILE__, 'drnp_uninstall_my_custom_post_type' );
dashboard-right-now-plus.php