WordPressでデフォルトで用意されている「投稿」以外の「カスタム投稿タイプ」などの投稿の有無を判別して、ユーザー情報をまとめて取得する方法

WordPressで作られたWebサイトなどでは、複数で記事を書ける(投稿できる)ように「ユーザー」を作成して、運営/管理を行うこともあると思います。

複数で記事を書くスタイル

これは例ですが、下のように「ネコ」「ウサギ」「カタツムリ」「トリ」の4ユーザーが、それぞれ1つのWebサイトで記事を書く、というイメージです。

動物だとわかりにくいな、という場合は「Aさん」「Bさん」「Cさん」「Dさん」というように「人が書いている」と読みかえてください。

ユーザーのことを紹介しよう

複数で記事を書くようなWebサイトでは「『誰』が書いているのか」「『誰』がどれくらいの『記事数』を書いているのか」など、広く知らせたい場合もあると思います。

そんな時は、各ユーザーをまとめて紹介する「ユーザー一覧ページ」を作って、ずらっと見られると便利ですよね。

「ユーザー一覧ページ」を作ろう

というわけで以上が前置きで、以下が本題です。

「カスタム投稿タイプ」に投稿する運用パターン

デフォルトで用意されている「投稿」は、Webサイト全体のメンテナンス情報やニュースリリースを発信する使い方をして「カスタム投稿タイプ」には、複数のユーザーが投稿(今回の例では、ユーザーが好む食べ物を投稿)する、というように「目的別に投稿を分ける」運用パターンって結構あります。

目的別に投稿を分ける運用

上記の場合で「ユーザー一覧ページ」を作るためには、少し工夫が必要でした。

取得できないユーザーがいるぞ・・・

WordPressではユーザーの情報をまとめて取得する方法がいくつかあるのですが「wp_list_authors」や「get_users」を使っても、取得できないユーザーがいました。

少し調べると、上記の2つの関数は「デフォルトで用意されている『投稿』」に対して判別を行って、ユーザー情報を取得しているようです。(認識が間違っていたらすみません)

※「wp_list_authors」に指定できるパラメーターで「hide_empty」を「0」に指定すれば、投稿の有無関係なしにすべてのユーザー情報を取得できますが、それだと関係ないユーザーまで表示されてしまうので、やりたいことと違うな~という感じです。

ですので、例えば「『カスタム投稿タイプ』にたくさん投稿していてもユーザー一覧ページには表示されないユーザーがいる」という状態です。

これは望んでいない・・・

WP_User_Queryを使う

「カスタム投稿タイプ」に投稿しているユーザーも、もちろんユーザー一覧ページに表示させたい。

そんな時は「WP_User_Query」を使うとできることを知りました。

例えば、以下のようにパラメーターを指定します。

$args = array(
 //publicな投稿タイプの中で、投稿が公開済みになっているユーザー
 'has_published_posts' => true
);
$user_query = new WP_User_Query( $args );

コードがやっていること

ちょっと説明が下手ですみませんが・・・「WP_User_Query」に指定できるパラメーター「has_published_posts」に「true」を指定すると、publicな投稿タイプ「投稿」「固定ページ」「添付ファイル」「カスタム投稿タイプ(publicなもの)」の中で、投稿が公開済みになっているユーザーの情報をまとめて取得できます。

特定のカスタム投稿タイプのみ判別したい場合はこうする

特定のカスタム投稿タイプのみ判別する場合は、以下のように書けばOKです。

$args = array(
 //カスタム投稿タイプ「food」で、投稿が公開済みになっているユーザーの情報を取得
 'has_published_posts' => array( 'food' )
);
$user_query = new WP_User_Query( $args );

上記の場合は、publicなカスタム投稿タイプ「food」で、投稿が公開済みになっているユーザーの情報をまとめて取得します。

まとめ

ユーザー一覧ページを作る機会は今後もありそうなので、メモ程度に書き残しました。

この方法とあわせて、ユーザーを取得する際に発行されるSQL文をフックを使ってカスタマイズすれば「投稿数の上位ユーザーランキング」とかを作ることもできます。

次回はその件について書きますので、機会がありましたらまた読みに来てください。

著者:bouya Imamura