投稿者アーカイブ→個別投稿ページの時のみ、ページ送りを制御したい
-
個別投稿ページ(single.php)についての質問です。
複数の投稿者によるサイトを運営しております。
ブログのアーカイブページ(category-blog.php)は、複数の投稿者による記事が並び、
また個別投稿ページ(single.php)のページ送り(前の記事/次の記事)のリンクも、
複数の投稿者にまたがって表示されています(★)。この度、投稿者アーカイブ(author-[name].php)を作ることになったのですが、
そこから個別投稿ページに行った場合のみ、
ページ送り(前の記事/次の記事)のリンクも、投稿者ひとり(表示中記事の投稿者)だけに絞りたいと希望しております。閲覧者が特定の投稿者の記事のみ見て行きたい場合、投稿者アーカイブだけでなく、
個別投稿ページでも特定の投稿者だけ追って行きたい、という希望があったからです。previous_post_link()/next_post_linkの直前に、別のトピックで教えていただいた関数を挿入することにより、ページ送り(前の記事/次の記事)のリンクを表示中記事の投稿者のみに絞ることができるのは確認しました。
ただし、single.phpに反映しているので、
通常の流れ(★)でも投稿者が絞られてしまうことになります。都合良く、single-[author-name].php的なテンプレートが有れば良いのですが、
良い方法はありますでしょうか。
よろしくお願いいたします。
-
1つの実現方法として、個別投稿ページへのリンクに from=author といったクエリーストリングを付加しておき、それによって前後リンクの出力を変更することが考えられます。
この実現方法で行う場合、いくつかやるべきことがあります。
- 投稿者アーカイブからのリンクにクエリーストリングを付加する
- クエリーストリングがあった場合のみ、ページ送りを特定の投稿者に絞る
- クエリーストリングがあった場合、ページ送りのリンクにクエリーストリングを付加する
2については、シングルページでのページャーを特定の投稿者のみの表示にしたい。の条件分岐に、クエリーストリングの条件を追加
if ( ! is_admin() && is_single() ) {を
if ( ! is_admin() && is_single() && isset( $_GET['from'] ) && 'author' == $_GET['from'] ) {の様な感じでできるかと思います。
1, 3については、post_link フィルターにフックし、add_query_arg を用いて、クエリーストリングを付加できます。
ただし、このフィルターを functions.php で適用してしまうと、ページ内全ての投稿ページへのリンクにクエリーストリングが付加されてしまうため、適用箇所を限定する必要がでてきます。
これには、previous_post_link/next_post_link の直前に、add_filter でフックを追加し、直後に、remove_filter でフックの削除を行うことで、ページ送り部分のみクエリーストリングの付加を行うことができます。jim912様
返信ありがとうございます。
まだ試してみませんが、取り急ぎお礼申し上げます。
時間がかかるかもしれませんが、試した結果を改めてお知らせします。
今後ともよろしくお願いいたします。
jim912様
ご指示いただいた内容で進めた場合、
author-[name].php
↓
single.php(author-[name].phpから来たので、前後ページのリンクは[name]の記事のみ)
↓
single.php(single.phpから来たので、前後ページのリンクは[name]の記事のみにはならない)という感じになってしまうことはないでしょうか。
実はまだ、教えていただいた内容で試行錯誤しており、
上手く動作していないのですが、こちらの理解不足からです。前後ページのリンクは[name]の記事のみにするかどうかの判定基準を、「from=author といったクエリーストリング」の有無により判定することを考えています。
上記の懸念点については、
クエリーストリングがあった場合、ページ送りのリンクにクエリーストリングを付加する
の対応により解消できるかと思います。
jim912様
以下の内容で行き詰まってしまっています。
<?php
if ( ! is_admin() && is_single() && isset( $_GET[‘from’] ) && ‘author’ == $_GET[‘from’] ) {
?><?php
add_filter( ‘get_next_post_where’, ‘my_get_next_post_where’, 10, 5 );
function my_get_next_post_where( $where, $in_same_term, $excluded_terms, $taxonomy, $post ) {
if ( ! is_admin() && is_single() ) {
$where .= ” AND p.post_author = ” . $post->post_author;
}
return $where;
}add_filter( ‘get_previous_post_where’, ‘my_get_previous_post_where’, 10, 5 );
function my_get_previous_post_where( $where, $in_same_term, $excluded_terms, $taxonomy, $post ) {
if ( ! is_admin() && is_single() ) {
$where .= ” AND p.post_author = ” . $post->post_author;
}
return $where;
}
?><div class=”adjacent_post_links”>
-
<li class=”previous”><?php previous_post_link(‘%link’, ‘‹ %title’, true); ?>
<li class=”next”><?php next_post_link(‘%link’, ‘%title ›’, true); ?></div>
<?php
}
endif;
?><div class=”adjacent_post_links”>の中が前後ページへのリンクで、
その直前にadd_filterによって、現在表示記事の投稿者のみの記事へのリンクに絞るところまでは可能でした。
ただし、single.phpに書き込んでいるので、author-[name].phpからのルートのみに反映したいという希望にはかなっていません。
そこで、author-[name].phpからのルートでのみ、single.phpでの前後リンクを特定の投稿者のみで続けていきたく、
ご指示いただいた、
if ( ! is_admin() && is_single() && isset( $_GET[‘from’] ) && ‘author’ == $_GET[‘from’] ) {
を加えた、という流れでした。全然理解できていなくてすみません。
single.phpの追加した部分(前のトピックで追加した部分含む)の記述は、一旦消してください。
その上で、投稿者で絞り込むための記述を functions.php に追記します。
add_filter( 'get_next_post_where', 'my_get_post_where', 10, 5 ); add_filter( 'get_previous_post_where', 'my_get_post_where', 10, 5 ); function my_get_post_where( $where, $in_same_term, $excluded_terms, $taxonomy, $post ) { if ( ! is_admin() && is_single() && isset( $_GET['from'] ) && 'author' == $_GET['from'] ) { $where .= " AND p.post_author = " . $post->post_author; } return $where; }※ 同じ記述があるので、簡略化しました。
この状態で、個別投稿ページのURLに ?from=author を付けると、前後ページへのリンクが投稿者で絞り込まれるはずです。
つまり、投稿者アーカイブから個別投稿ページのリンク、および from=author が付いてアクセスされた際の前後リンクに from=author を追加する処理が必要になります。
functions.php に、さらに以下を追記してみてください。function add_from_query_arg( $permalink ) { $permalink = add_query_arg( array( 'from' => 'author' ), $permalink ); return $permalink; } add_filter( 'post_link', 'add_from_query_arg' );この追記によって、個別投稿ページのリンクに from=author が付加されるようになります。
ただし、個別投稿ページの全てのリンクについてしまうため、ブログのアーカイブページからの前後リンクは、複数の投稿者またがったものという条件に反してしまいます。これを解消するために、投稿者のアーカイブからのリンク、および、from=author がある場合の前後リンクのみ from=author がつくようにします。
functions.php の
add_filter( 'post_link', 'add_from_query_arg' );を削除し、author-[name].php のループの直前に
<?php add_filter( 'post_link', 'add_from_query_arg' ); ?>ループ後に
<?php remove_filter( 'post_link', 'add_from_query_arg' ); ?>を追加します。これによって、author-[name].php のループ内でのみ、パーマリンクに from=author がつくようになります。
また、singie.php の previous_post_link / next_post_link の直前に
<?php if ( isset( $_GET['from'] ) && 'author' == $_GET['from'] ) { add_filter( 'post_link', 'add_from_query_arg' ); } ?>直後に
<?php remove_filter( 'post_link', 'add_from_query_arg' ); ?>を追記します。これによって、from=author がついてきた場合の前後リンクにも from=author がつくようになり、このリンクから遷移した個別投稿ページの前後リンクも投稿者での絞込が効くようになります。
jim912様
お世話になります。
ご指示いただいた内容で、うまく動作することができました!
本当にありがとうございます。以下は、別トピックを立てるべきかもしれませんが、
ちょっと気になったことがありますので記述します。運用しているサイトでは、各投稿者の投稿に「blog」「news」「styles」のいずれかを付けることになっています。
single.php内で、previous_post_link / next_post_linkでは、カテゴリー内でのリンクに絞っています。
そこでもし、各投稿に投稿者名と関連づけたカテゴリーを自動で付けることができれば、
(blog-tabakaなど)
author.phpで「blog」カテゴリーに絞っておけば、
single.phpで「blog-tanaka」で絞られたprevious_post_link / next_post_linkが使えるのではないかと思いつきました。実は教えていただいた動作をチェック中に、
author.php上でクリック(「続きを読む」)する記事のカテゴリーによって、single.phpのprevious_post_link / next_post_linkで現れるリンクが異なることから、
カテゴリーで管理できないかと思いました。もし、この流れで問題ないならば、
記事を投稿する際に、投稿者名と関連づけたカテゴリーを自動で付けることは可能でしょうか。もし自動で付けることができないなら、投稿時に手動でカテゴリーにチェックを入れることでもまかなえるのでしょうが…
single.php内で、previous_post_link / next_post_linkでは、カテゴリー内でのリンクに絞っています。
そこでもし、各投稿に投稿者名と関連づけたカテゴリーを自動で付けることができれば、
(blog-tabakaなど)
author.phpで「blog」カテゴリーに絞っておけば、
single.phpで「blog-tanaka」で絞られたprevious_post_link / next_post_linkが使えるのではないかと思いつきました。ブログのアーカイブページからのリンクでもこれが適用される(投稿者で絞り込まれる)ことになりますが、その動作でよければ、この手法を使うことも可能ですね。
jim912様
ありがとうございます。
別案の方は、また改めてトピックを立てるかもしれませんが、
今回はjim912様から先に教えていただいた方法で進めてみます。またトピックを立てた際には、
よろしくお願いいたします。
トピック「投稿者アーカイブ→個別投稿ページの時のみ、ページ送りを制御したい」には新たに返信することはできません。