表題の件について、指定方法の誤りをご指摘いただきたく質問させていただきます。
お分かりの方がいらっしゃいましたら、対処をご教示いただけますと幸いです。
実現したいこと
WordPressの投稿者アーカイブ閲覧時、「選択した投稿者」と「特定の投稿者」の記事一覧を表示したい。
ページネーションもつけたい。(wp_pagenaviを使用しているが、他でもよい)
イメージとしては、飲食店のサイトで各店舗にアカウントが存在するような状況。
特定の店舗の投稿者アーカイブを閲覧した際、
指定された店舗のブログと、全店舗用のアカウントから投稿されたブログを一覧で出したい。
状況
- author.php内でWP_Queryを用いて、2つのユーザーの投稿を取得・表示。
- 表示は想定通りにできるが、2ページ目へ移動した時、noufoundになる。
- 指定した投稿者の投稿記事数は4件、サブクエリで指定した投稿者の投稿記事数は3件。ページあたりの表示件数は5件。
※下記、テスト用に作成したauthor.phpです。
php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <?php wp_head(); ?> <style> .inner { margin: 0 auto; max-width: 1100px; width: 100%;} .flex { display: flex;} #main { flex: 1; margin-right: 2em;} .post-item { margin: 1em; padding: 1em; border: 1px solid #eee;} .post-item .title { border-bottom: 2px solid #f00; font-size: 1.3em;} .btn { display: inline-block; padding: .3em 0; min-width: 10em; background: #f00; color: #fff; font-weight: 700; text-align: center; text-decoration: none;} .center { text-align: center;} #side { margin-top: 1em; width: 300px;} #side h2 { margin: 0 0 1em; padding: .3em .5em; background: #f00; color: #fff; font-size: 1em; font-weight: 700;} #side .wiget > li { margin: .5em 0; } #side .wiget > li a { text-decoration: none;} .wp-pagenavi { margin: 3em 0; text-align: center;} </style> </head> <body> <div class="inner flex"> <div id="main"> <?php $paged = get_query_var('paged', 1); // URLから投稿者のIDを取得 $url = $_SERVER["REQUEST_URI"]; $authorname = basename ( $url ); $authorname = get_user_by('login', $authorname ); $user_ID = $authorname->ID; $args = array( 'paged' => $paged, 'author__in' => array(1,$user_ID),// 全店 + 指定店舗の投稿を表示 ); $the_query = new WP_Query($args); if($the_query->have_posts()){ while($the_query->have_posts()): $the_query->the_post(); ?> <div class="post-item"> <a href="<?php the_permalink(); ?>"> <h2 class="title"><?php the_title(); ?></h2> <p><?php the_excerpt(); ?></p> </a> </div> <?php endwhile; } ?> </div><!-- #main --> <div id="side"> <h2>投稿者</h2> <ul class="wiget"> <?php wp_list_authors(); ?> </ul> </div><!-- #side --> </div> <?php wp_pagenavi(array('query' => $the_query)); ?> <?php wp_reset_postdata(); ?> <?php wp_footer(); ?> </body> </html>
推測と行った対処
ページを読み込んだ時点ではデフォルトの条件のまま(指定された投稿者のみ)読み込んでいるので、2ページ目が存在しない判定となるのではないかと思う。
→指定された投稿者の投稿件数 = 4件、ページあたりの件数は5件だから2ページ目は存在しない判定。
→指定された投稿者 = 4件と、特定の投稿者の3件を加えて7件と認識してほしい。
そこでメインクエリが発行される前に条件を書き換えようと考え、functions.php内にpre_get_postsで同様の指定を行ったが、投稿者の指定が効かなかった。
php
function get_author_posts($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( $query->is_author() ) { // URLから投稿者のIDを取得 $url = $_SERVER["REQUEST_URI"]; $authorname = basename ( $url ); $authorname = get_user_by('login', $authorname ); $user_ID = $authorname->ID; $query->set( 'author__in', array(1,$user_ID) );// 全店 + 指定店舗の投稿を表示 return; } } add_action( 'pre_get_posts', 'get_author_posts' );
そもそも、author.phpで実現しようとすることが間違いかとも考えております。
投稿者のリンクにGETで値を持たせて、固定ページで出力する方が正しいでしょうか。
対処がお分かりの方がいらっしゃいましたら、ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。
まだ回答がついていません
会員登録して回答してみよう