WordPressの投稿者ページで記事一覧にカスタム投稿タイプも表示する


WordPressの投稿者ページにて、以下のようにして記事一覧を表示するようにしました。

<?php if ( have_posts() ) : ?>
    <?php while ( have_posts() ) : the_post(); ?>
        ここに記事を表示するロジックを書く
    <?php endwhile; ?>
<?php endif; ?>

これで、記事一覧は表示されるのですが、デフォルトで表示されるのは「投稿」で書いている記事だけです。

記事の一覧にカスタム投稿タイプを表示する

僕が使用していたWordPressでは、投稿は使用していなく、カスタム投稿タイプを使用していたので、カスタム投稿タイプで書いた記事を一覧に表示するやり方です。

functions.phpに以下を追加します。
※column、caseという名前のカスタム投稿タイプを使用した例です

functions.php
function author_search_filter($query) {
  if (!is_admin() && is_author() && $query->is_main_query() ) {
    $query->set('post_type', array( 'column', 'case'));
  }
}
add_action( 'pre_get_posts','author_search_filter' );

is_author()で、投稿者ページを表示する時のクエリに対して、投稿タイプにカスタム投稿タイプを設定するというのをやっています。

また、!is_admin()も加えて、管理画面のクエリは対象外とするようにします。

is_author()は管理画面でtrueと判定される?

当初、上記のロジックには!is_admin()を入れていなかったのですが、以下のような不具合が発生していました。
管理画面でカスタム投稿タイプの一覧を見た時に、選択しているカスタム投稿タイプとは別のものが表示されてしまいました。

  1. 新しくカスタム投稿タイプ(例、news)を追加する
  2. 管理画面で新しく作ったカスタム投稿タイプの一覧を見た時、既存のカスタム投稿タイプ(例、column)の記事が一覧に表示されている

最初は原因が全く分からず苦労したのですが、プログラムを追っていくと、管理画面でカスタム投稿タイプの一覧を見た時に、is_author()がtrueになっていたので、上記のプログラムの条件を満たして、クエリが変わっていたのが原因でした。

is_author()は投稿者ページを判断する処理なのに、管理画面の関係ないところでtrueになるんですね。
ドキュメントも見てみましたが、結局よく分かりませんでした。

フロントで使うロジックには、!is_admin()の条件を入れたほうが良いということですね。
これは勉強になりました。