WPプラグイン開発入門 (3)テストデータ

このプラグインは、カスタム投稿タイプの件数を表示するプラグインですから、まずはカスタム投稿タイプを追加します。Custom Post Type UIなどのプラグインで追加するのが一般的です。最近はAdvanced Custom Fields (ACF)でもできるようになったようですね。今回はプラグインにカスタム投稿タイプを追加するコードを含めます。

そもそもカスタム投稿タイプとは、WordPressに標準で搭載されているpost(投稿)、page(固定ページ)などの標準の投稿タイプに並ぶ新しい投稿タイプです。フロントエンドに表示するか、アーカイブページを作成するか、階層構造にするかなどのオプションを指定して作成します。

カスタム投稿タイプを追加する

あらかじめ、カスタム投稿タイプの内部名と公開側の名前を決めておきます。今回はプラグイン名の頭文字で始まるdrnp-mycpt-a, drnp-mycpt-bという2つのカスタム投稿タイプを作ります。ハンドブックのRegistering Custom Post Typesのサンプルを参考にし、以下のコードを追加します。

PHP
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()直後で以下のコードを実行します。

PHP
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必須アンインストール時に実行される関数名
PHP
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
<?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
Expand

関連サイト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です