WPプラグイン開発入門 (5)投稿タイプ

前回までで、追加した2つのカスタム投稿タイプの件数を表示できるようになりました。今回は、コードを一部修正し、より汎用的に使えるようにしていきます。

カスタム投稿タイプの増減に対応する

現在のコードでは、カスタム投稿タイプ名がプラグインファイルに直接書かれているので、カスタムタイプが増減するごとにプラグインを修正しなければなりません。WordPressで使用されているカスタム投稿名を自動的に取得できると便利ですね。「カスタム投稿タイプ 一覧 取得」で検索すると、get_post_types()という関数が使えそうです。

get_post_types( array|string $args = array(), string $output = ‘names’, string $operator = ‘and’ ): string[]|WP_Post_Type[]

get_post_types() – Function | Developer.WordPress.org
必須デフォルト値内容
第1引数arrayまたはstring型の$args任意array()取得する投稿タイプを絞り込むための条件。$argsに指定できる値はregister_post_type()$argsを参照
第2引数string $output任意‘names’返り値を投稿タイプ名で返すか、またはオブジェクトで返すか。
第3引数string $operator任意‘and’第1引数の検索条件。and, or, not検索のいずれか。
返り値string型の配列またはWP_Post_Typeオブジェクトの配列取得された投稿タイプ名、または投稿タイプオブジェクト

フロント側に公開されているカスタム投稿タイプ(ただし、標準で組み込まれているpost, pageは除く)を取得し、ループに渡す配列として使用します。

PHP
function drnp_add_my_custom_post_type_to_right_now( $elements ) {
	$args       = array(
		'public'   => true,
		'_builtin' => false,
	);
	$post_types = get_post_types( $args, 'object', 'and' );
	foreach ( $post_types as $post_type ) {
		$num_posts = wp_count_posts( $post_type->name );
		if ( $num_posts && $num_posts->publish ) {
			$text = sprintf( '%s件の%s', number_format_i18n( $num_posts->publish ), $post_type->labels->name );
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				$elements[] = sprintf( '<a class="%1$s-count" href="edit.php?post_type=%1$s">%2$s</a>', esc_html( $post_type->name ), esc_html( $text ) );
			} else {
				$elements[] = sprintf( '<span class="%1$s-count">%2$s</span></li>', esc_html( $post_type->name ), esc_html( $text ) );
			}
		}
	}
	return $elements;
}
add_filter( 'dashboard_glance_items', 'drnp_add_my_custom_post_type_to_right_now' );

コードまとめ

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' );

/**
 * 概要メタボックスにカスタム投稿タイプの件数を表示
 *
 * @param array $elements 追加表示させる内容.
 * @return array 追加表示させる内容.
 */
function drnp_add_my_custom_post_type_to_right_now( $elements ) {
	$args       = array(
		'public'   => true,
		'_builtin' => false,
	);
	$post_types = get_post_types( $args, 'object', 'and' );
	foreach ( $post_types as $post_type ) {
		$num_posts = wp_count_posts( $post_type->name );
		if ( $num_posts && $num_posts->publish ) {
			$text = sprintf( '%s件の%s', number_format_i18n( $num_posts->publish ), $post_type->labels->name );
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				$elements[] = sprintf( '<a class="%1$s-count" href="edit.php?post_type=%1$s">%2$s</a>', esc_html( $post_type->name ), esc_html( $text ) );
			} else {
				$elements[] = sprintf( '<span class="%1$s-count">%2$s</span></li>', esc_html( $post_type->name ), esc_html( $text ) );
			}
		}
	}
	return $elements;
}
add_filter( 'dashboard_glance_items', 'drnp_add_my_custom_post_type_to_right_now' );
dashboard-right-now-plus.php
Expand

関連サイト

コメントを残す

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