質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

【WordPress】投稿者アーカイブで2つの投稿者の記事一覧を表示した際、2ページ目が404になる

kvan
kvan

総合スコア32

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1回答

0評価

0クリップ

213閲覧

投稿2022/05/05 08:06

編集2022/05/05 12:47

表題の件について、指定方法の誤りをご指摘いただきたく質問させていただきます。
お分かりの方がいらっしゃいましたら、対処をご教示いただけますと幸いです。

実現したいこと

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で値を持たせて、固定ページで出力する方が正しいでしょうか。

対処がお分かりの方がいらっしゃいましたら、ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。