【独自カスタマイズ】WordPressの「概要」にカスタム投稿タイプの投稿数を追加する方法とコードの仕組み

コメント (0)

  1. 改善TIPS
  2. 【独自カスタマイズ】WordPressの「概要」にカスタム投稿タイプの投稿数を追加する方法とコードの仕組み
この記事にはアフィリエイト広告が含まれている場合がございます。

WordPressの管理画面を開くと、ダッシュボードの「概要」ボックスに投稿や固定ページなどの件数が表示されます。

「お知らせ」「制作実績」などのカスタム投稿タイプを使っている場合、それらの件数も同じ場所で確認できると便利です。カスタム投稿タイプとは、通常の「投稿」「固定ページ」とは別に設ける記事の種類のことです。

この記事では、「概要」にカスタム投稿タイプの公開済み投稿数と一覧へのリンクを追加するPHPコードを紹介し、それぞれの処理の意味を説明します。

このカスタマイズでできること

今回の目的は、管理画面のトップで「概要」ボックスからコンテンツの件数を確認し、そのまま一覧画面へ移動できるようにすることです。

例えば、「概要」に次のような項目を追加します。

  • お知らせ:12件
  • 制作実績:8件

クリックすると、それぞれの公開済み投稿の一覧に移動します。表示名には、投稿タイプに登録されている名称を自動で使います。

以下では「実績紹介」というカスタム投稿タイプの投稿件数を「概要」ボックスに表示されるようにしています。

このコードは、すでに登録されているカスタム投稿タイプを対象にします。CPT UIなどで作成した投稿タイプにも利用できますが、コード自体に投稿タイプを新しく作成する機能はありません。また、記号は「○」印で固定となっております(記号を変更できる方法もあるにはあるのですが、そちらに関しては各自お調べいただけますと幸いです)。

フィルターフックで「概要」の表示項目を追加する

WordPressには、本体の処理に機能を追加したり、扱うデータを変更したりするための「フック」という仕組みがあります。そのうち、受け取ったデータを加工して返す仕組みが「フィルターフック」です。

今回は、「概要」の追加項目を変更する dashboard_glance_items フィルターを使います。このフックはWordPress 3.8.0から用意されています。

WordPress本体では、wp-admin/includes/dashboard.php 内の wp_dashboard_right_now() 関数が「概要」の表示を担当しています。追加項目の処理は、次のようになっています。

$elements = apply_filters( 'dashboard_glance_items', array() );

if ( $elements ) {
	echo '<li>' . implode( "</li>\n<li>", $elements ) . "</li>\n";
}Code language: PHP (php)

最初の行で、空の配列(複数のデータをまとめる入れ物)をフィルターに渡します。登録されている処理がそこに項目を追加し、その結果を $elements で受け取ります。

項目があれば、WordPress本体がそれぞれを箇条書きの項目を表す <li> タグで囲んで出力します。implode() は配列の要素を指定した文字列でつなぐPHPの関数です。

この仕組みを使うため、追加する側ではリンクのHTMLを配列に入れて返します。<li> タグを自分で付けたり、echo で直接表示したりする必要はありません。

追加するPHPコード

以下は、投稿タイプのスラッグが news と works の場合のコードです。スラッグとは、投稿タイプを識別するための名前です。「お知らせ」などの表示名ではなく、登録時に指定した値を使います。

/**
 * ダッシュボードの「概要」にカスタム投稿タイプの投稿数を追加。
 */
add_filter( 'dashboard_glance_items', function ( $items ) {

	// 表示したいカスタム投稿タイプのスラッグを指定。
	$post_types = array( 'news', 'works' );

	foreach ( $post_types as $post_type ) {
		$post_type_object = get_post_type_object( $post_type );

		// 未登録・管理画面なし・編集権限なしの場合は表示しない。
		if (
			! $post_type_object ||
			! $post_type_object->show_ui ||
			! current_user_can( $post_type_object->cap->edit_posts )
		) {
			continue;
		}

		$counts = wp_count_posts( $post_type );
		$count  = (int) $counts->publish;

		$url = add_query_arg(
			array(
				'post_type'   => $post_type,
				'post_status' => 'publish',
			),
			admin_url( 'edit.php' )
		);

		$text = sprintf(
			'%1$s:%2$s件',
			$post_type_object->labels->name,
			number_format_i18n( $count )
		);

		$items[] = sprintf(
			'<a href="%1$s">%2$s</a>',
			esc_url( $url ),
			esc_html( $text )
		);
	}

	return $items;
} );Code language: PHP (php)

基本的に変更するのは、次の部分です。

$post_types = array( 'news', 'works' );Code language: PHP (php)

news と works を、自分のサイトで使っている投稿タイプのスラッグに置き換えてください。1種類だけなら array( 'news' ) とします。

コードは子テーマの functions.php のPHP部分、または独自プラグインのPHPファイル内に追加します。既存のPHP部分へ追記する場合、<?php を重ねて書く必要はありません。

なお、上のコードは独自プラグインの完成ファイルではないため、新規プラグインとして作る場合は別途プラグインヘッダーなどが必要です。

コード全体は何をしているのか

コードの役割は、指定した投稿タイプについて、表示できるかを確認し、公開済みの件数とリンクを作って「概要」に追加することです。

全体の流れは次のとおりです。

  1. 「概要」の追加項目を変更する処理を登録する。
  2. 対象の投稿タイプを1つずつ調べる。
  3. 投稿タイプの登録状況とユーザーの権限を確認する。
  4. 公開済み投稿数を取得する。
  5. 一覧画面のURLと表示文字列を作る。
  6. リンクを追加項目の配列に入れ、WordPressへ返す。

以下では、この流れに沿って各処理を見ていきます。

各処理の意味

① フィルターに処理を登録する

add_filter( 'dashboard_glance_items', function ( $items ) {Code language: PHP (php)

add_filter() は、フィルターフックに処理を登録する関数です。ここでは、WordPressが「概要」の追加項目を組み立てるときに実行する処理を登録しています。

function ( $items ) { ... } は、名前を付けずにその場で定義する関数です。$items には追加項目の配列が渡され、先に動いたプラグインなどが項目を入れている場合もあります。

② 対象の投稿タイプを1つずつ取得する

$post_types = array( 'news', 'works' );

foreach ( $post_types as $post_type ) {
	$post_type_object = get_post_type_object( $post_type );Code language: PHP (php)

$post_types に対象のスラッグを並べ、foreach で1つずつ順に処理します。最初は news、次は works が $post_type に入ります。

get_post_type_object() は、その投稿タイプの登録情報を取得します。ここで取得するのは記事本文ではなく、表示名・管理画面の有無・必要な権限などの設定です。コード中の -> は、取得した情報から個々の設定値を取り出すために使っています。

③ 表示できる投稿タイプか確認する

if (
	! $post_type_object ||
	! $post_type_object->show_ui ||
	! current_user_can( $post_type_object->cap->edit_posts )
) {
	continue;
}Code language: PHP (php)

この部分では、次のいずれかに当てはまる投稿タイプを対象から外します。

条件意味
投稿タイプの登録情報がないスラッグが誤っている、登録元のプラグインが停止しているなど
show_ui が無効標準の管理用画面を表示しない設定になっている
ユーザーに必要な編集権限がないその投稿タイプの編集権限を持っていない

! は「そうではない」、|| は「いずれか」という意味です。continue に到達すると、その投稿タイプの処理をやめて次の投稿タイプへ進みます。

権限は「管理者かどうか」という役割名ではなく、その投稿タイプに設定されている編集権限で確認します。この判定方法は、WordPress本体の「概要」でも使われています。

④ 公開済み投稿数を取得する

$counts = wp_count_posts( $post_type );
$count  = (int) $counts->publish;Code language: PHP (php)

wp_count_posts() は、指定した投稿タイプの件数を「公開済み」「下書き」などの状態別に取得します。

その中の publish が公開済みの件数です。(int) は、その値を整数として扱うための指定です。

このコードで表示するのは公開済みの件数なので、下書き・予約投稿・非公開・ゴミ箱の件数は含まれません。

⑤ 公開済み投稿一覧へのURLを作る

$url = add_query_arg(
	array(
		'post_type'   => $post_type,
		'post_status' => 'publish',
	),
	admin_url( 'edit.php' )
);Code language: PHP (php)

admin_url( 'edit.php' ) で管理画面の投稿一覧URLを取得し、add_query_arg() で対象の投稿タイプと公開状態を指定します。

post_type は「どの投稿タイプか」、post_status は「どの公開状態か」を表します。公開済みの件数を表示しているため、リンク先も公開済みの一覧にそろえています。

⑥「お知らせ:12件」という表示文字列を作る

$text = sprintf(
	'%1$s:%2$s件',
	$post_type_object->labels->name,
	number_format_i18n( $count )
);Code language: PHP (php)

sprintf() は、指定した書式に値を埋め込んで文字列を作るPHPの関数です。ここでは %1$s に投稿タイプの表示名、%2$s に件数を入れます。

labels->name が「お知らせ」で件数が12なら、「お知らせ:12件」という文字列になります。number_format_i18n() はサイトの言語設定に合わせて数値の表示を整える関数で、日本語環境では通常、1,000のような桁区切りになります。

⑦ リンクを作り、配列に追加する

$items[] = sprintf(
	'<a href="%1$s">%2$s</a>',
	esc_url( $url ),
	esc_html( $text )
);Code language: PHP (php)

作成したURLと表示文字列を使ってリンクを組み立てます。$items[] は、配列の末尾に新しい要素を追加する書き方です。受け取った配列に追記するので、先に追加されていた項目も引き継げます。

esc_url() はURLを、esc_html() は表示文字列を、HTMLへ出力する場所に合わせて処理します。この処理を「エスケープ」と呼びます。例えば表示名に < などが含まれていても、HTMLタグとして解釈されないようにします。

add_query_arg() で生成したURLは出力用のエスケープが済んでいないため、リンクに組み込む段階で esc_url() を使っています。

⑧ 追加後の配列をWordPressに返す

return $items;Code language: PHP (php)

すべての投稿タイプを処理したら、追加した項目を含む配列を返します。その後、WordPress本体が配列の各項目を <li> タグで囲んで表示します。

フィルターでは、この「加工した値を返す」部分が必要です。echo で表示するだけでは、次の処理へ配列を渡せません。

導入後に確認したいこと

コードを追加したら、ダッシュボードを開いて、追加項目の表示とリンク先を確認します。

確認すること今回のコードの動作
件数の集計範囲対象の投稿タイプ全体の公開済み投稿数
公開済み投稿がない場合「0件」と表示
階層型の投稿タイプ親投稿・子投稿をそれぞれ1件として集計
編集権限がないユーザーその投稿タイプの項目を表示しない
投稿タイプが未登録の場合その投稿タイプの項目を表示しない

件数は、ログイン中のユーザーが作成した投稿だけを数えるものではありません。権限判定は項目の表示可否を決めるためのもので、集計対象を本人の記事に絞る処理ではない点に注意してください。

管理メニューや一覧画面をプラグインで独自に制御しているサイトでは、編集権限だけでなく、リンク先を実際に開けるかも確認してください。

WordPress公式資料(英語)

公式資料を読む際の補足

dashboard_glance_items の公式リファレンス下部には、利用者が投稿したコード例があります。その例では add_action() と echo が使われていますが、フック自体の定義はフィルターです。

本記事では、公式のフック定義と本体の処理に合わせ、add_filter() で処理を登録し、追加後の配列を返す方法を採用しています。

本記事に掲載したコードは公式リファレンスおよび掲載された本体コードと照合しています。個別のWordPress環境での動作確認は行っていません。

お気に召しましたら是非ともシェアをお願いします!

この記事を書いた人

スクリーンネーム: Y.INABA

WordPress歴は約10年ほど、色々な形で触れてきました。
HTMLやCSS、PHPに至っては20年以上も触れ続けています。
現在も日々学習中。

– 広告 –

当記事へのコメント

コメントの際の注意

  • コメントは承認制です。当方で承認されるまでは記事内に掲載されません。
  • 記載内容に問題がなければ承認しますが、過剰な煽り・加害性等が認められる場合や著しい事実誤認等が含まれている場合は承認しません。
  • 「記事中で話題として触れていないのに、他サイトでの関連性の薄い(主題とは異なる)話題を出す」行為もお控えください。
  • 承認後でも、問題があると判断した場合はこちらの判断により削除する可能性がございます。

コメントはこちらからどうぞ

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


– 広告 –
トップへ戻る