理解してしまえばそんなに難しくない。
どういうことか
投稿者別の投稿一覧はauthor.phpで表示される。author.phpがなければarchive.php。出力されるのは元からある「投稿」なので、カスタム投稿の記事は表示されない。それも表示したいんだけどって記事はある。
そうじゃなくて。「カスタム投稿毎に投稿者別の投稿一覧」を作りたい。中規模以上になるとカスタム投稿で色々作るようになって、それぞれに執筆者がいたり全部に掛かってたり、が出てくる。単純に記事一覧として何でもかんでも全部表示すると都合が悪いので、カスタム投稿毎に切り分けられるようになりたい。
という話。
URLで切り分けられる
通常、投稿者別の記事一覧はこんな感じになる。
https://【ドメイン】/author/【username】/
https://【ドメイン】/?author=【userID】
これにpost_typeを繋ぐとカスタム投稿で絞ることができる。
https://【ドメイン】/author/【username】/?post_type=【カスタム投稿名】
https://【ドメイン】/?author=【userID】&post_type=【カスタム投稿名】
書式はパーマリンクの設定により変わる。
なお、post_typeを指定した場合に表示されるのはpost_type毎のarchive.phpになる。
URLによってachive.phpとauthor.phpの使い分けができるってことですね。
archive.phpに仕込む
本題。
以下のURLでやっていくとする。他の場合は試してないのでわかんない。
https://【ドメイン】/author/【username】/?post_type=【カスタム投稿名】
まず条件分岐の作成。author情報の有無を判別する。
<?php
if(is_author()):
$authorMode = true;
$authorID = get_the_author_meta( 'ID', $author );
$authorNickname = get_the_author_meta( 'nickname', $author );
endif;
?>
author込のURLでアクセスした場合のために、is_author()で条件分岐を仕込む。以降はユーザー情報を必要に応じて変数に格納。
出力できるユーザー情報はここを参照。
独自に追加した項目があるなら対応するフィールド名を入れる。
条件分岐はこんな感じで。
<?php if(is_author()): ?>
<?php echo $authorNickname; ?>の記事一覧
<?php endif; ?>
誰の一覧か表示する他、逆に不要になるものを非表示にしたり。
記事一覧の出力はこんな感じ。
<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 10,
'paged' => $paged,
'post_type' => '【カスタム投稿名】',
'post_status' => 'publish',
'author' => $authorID
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) :
?>
$authorIDが入っていれば該当のユーザーによるカスタム投稿、空欄だった場合は全てのカスタム投稿の一覧が出力される。ここもifで切り替えても良いんだけど、バグは起きないのでまあ良いのかなみたいな。
まとめ
やりたいことはwpの仕様で対応できた。ということは知らないだけだったんだけど、この部分は数年WPをいじり続けても触らなかった部分なので全く知識がなかった。
やっぱりWPは便利だなーって思う。
コメント