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

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

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

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

PHP

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

Q&A

解決済

1回答

451閲覧

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

kvan

総合スコア41

WordPress

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

PHP

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

0グッド

0クリップ

投稿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

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Document</title> 8 <?php wp_head(); ?> 9 <style> 10 .inner { margin: 0 auto; max-width: 1100px; width: 100%;} 11 .flex { display: flex;} 12 #main { flex: 1; margin-right: 2em;} 13 .post-item { margin: 1em; padding: 1em; border: 1px solid #eee;} 14 .post-item .title { border-bottom: 2px solid #f00; font-size: 1.3em;} 15 .btn { display: inline-block; padding: .3em 0; min-width: 10em; background: #f00; color: #fff; font-weight: 700; text-align: center; text-decoration: none;} 16 .center { text-align: center;} 17 18 #side { margin-top: 1em; width: 300px;} 19 #side h2 { margin: 0 0 1em; padding: .3em .5em; background: #f00; color: #fff; font-size: 1em; font-weight: 700;} 20 #side .wiget > li { margin: .5em 0; } 21 #side .wiget > li a { text-decoration: none;} 22 23 .wp-pagenavi { margin: 3em 0; text-align: center;} 24 </style> 25</head> 26<body> 27 <div class="inner flex"> 28 <div id="main"> 29 <?php 30 $paged = get_query_var('paged', 1); 31 32 // URLから投稿者のIDを取得 33 $url = $_SERVER["REQUEST_URI"]; 34 $authorname = basename ( $url ); 35 $authorname = get_user_by('login', $authorname ); 36 $user_ID = $authorname->ID; 37 38 $args = array( 39 'paged' => $paged, 40 'author__in' => array(1,$user_ID),// 全店 + 指定店舗の投稿を表示 41 ); 42 $the_query = new WP_Query($args); 43 if($the_query->have_posts()){ 44 while($the_query->have_posts()): $the_query->the_post(); 45 ?> 46 <div class="post-item"> 47 <a href="<?php the_permalink(); ?>"> 48 <h2 class="title"><?php the_title(); ?></h2> 49 <p><?php the_excerpt(); ?></p> 50 </a> 51 </div> 52 <?php 53 endwhile; 54 } 55 ?> 56 57 </div><!-- #main --> 58 <div id="side"> 59 <h2>投稿者</h2> 60 <ul class="wiget"> 61 <?php wp_list_authors(); ?> 62 </ul> 63 </div><!-- #side --> 64 </div> 65 66 <?php wp_pagenavi(array('query' => $the_query)); ?> 67 <?php wp_reset_postdata(); ?> 68 69 <?php wp_footer(); ?> 70</body> 71</html>

推測と行った対処

ページを読み込んだ時点ではデフォルトの条件のまま(指定された投稿者のみ)読み込んでいるので、2ページ目が存在しない判定となるのではないかと思う。
→指定された投稿者の投稿件数 = 4件、ページあたりの件数は5件だから2ページ目は存在しない判定。
→指定された投稿者 = 4件と、特定の投稿者の3件を加えて7件と認識してほしい。

そこでメインクエリが発行される前に条件を書き換えようと考え、functions.php内にpre_get_postsで同様の指定を行ったが、投稿者の指定が効かなかった。

php

1function get_author_posts($query) { 2 if ( is_admin() || ! $query->is_main_query() ){ 3 return; 4 } 5 6 if ( $query->is_author() ) { 7 // URLから投稿者のIDを取得 8 $url = $_SERVER["REQUEST_URI"]; 9 $authorname = basename ( $url ); 10 $authorname = get_user_by('login', $authorname ); 11 $user_ID = $authorname->ID; 12 13 $query->set( 'author__in', array(1,$user_ID) );// 全店 + 指定店舗の投稿を表示 14 return; 15 } 16} 17add_action( 'pre_get_posts', 'get_author_posts' );

そもそも、author.phpで実現しようとすることが間違いかとも考えております。
投稿者のリンクにGETで値を持たせて、固定ページで出力する方が正しいでしょうか。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

投稿者アーカイブ(author.php)にこだわる必要がなかったので、固定ページにしました。

GETにユーザー名を持たせて、サブクエリを発行する形です。
(ユーザー名が露出する点はセキュリティ上よろしくないと思いますので、後々改善します)

◆functions.php

php

1function my_query_vars( $vars ) { 2 $vars[] = 'authorName'; 3 return $vars; 4} 5add_filter( 'query_vars', 'my_query_vars' );

◆page-author-archive.php

php

1<?php 2 // URLから投稿者のIDを取得 3 $url = get_query_var('authorName'); 4 $authorname = basename ( $url ); 5 $authorname = get_user_by('login', $authorname ); 6 $user_ID = $authorname->ID; 7 8?> 9 10<!DOCTYPE html> 11<html lang="en"> 12<head> 13 <meta charset="UTF-8"> 14 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 15 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 16 <title><?php the_author_meta( 'display_name', $user_ID) ?></title> 17 <?php wp_head(); ?> 18 <style> 19 .inner { margin: 0 auto; max-width: 1100px; width: 100%;} 20 .flex { display: flex;} 21 #main { flex: 1; margin-right: 2em;} 22 .post-item { margin: 1em; padding: 1em; border: 1px solid #eee;} 23 .post-item .title { border-bottom: 2px solid #f00; font-size: 1.3em;} 24 .btn { display: inline-block; padding: .3em 0; min-width: 10em; background: #f00; color: #fff; font-weight: 700; text-align: center; text-decoration: none;} 25 .center { text-align: center;} 26 27 #side { margin-top: 1em; width: 300px;} 28 #side h2 { margin: 0 0 1em; padding: .3em .5em; background: #f00; color: #fff; font-size: 1em; font-weight: 700;} 29 #side .wiget > li { margin: .5em 0; } 30 #side .wiget > li a { text-decoration: none;} 31 32 .wp-pagenavi { margin: 3em 0; text-align: center;} 33 </style> 34</head> 35<body> 36 <div class="inner flex"> 37 <div id="main"> 38 39 <?php 40 $paged = get_query_var('paged', 1); 41 42 $args = array( 43 'paged' => $paged, 44 'author__in' => array(1,$user_ID),// 全店 + 指定店舗の投稿を表示 45 ); 46 $the_query = new WP_Query($args); 47 if($the_query->have_posts()){ 48 while($the_query->have_posts()): $the_query->the_post(); 49 get_template_part('template/loop'); 50 endwhile; 51 } 52 ?> 53 54 </div><!-- #main --> 55 <div id="side"> 56 <h2>投稿者</h2> 57 <ul class="wiget"> 58 <?php 59 $users = get_users(); 60 foreach($users as $user){ 61 echo '<li><a href="'.home_url('/author-archive/?authorName=').$user->user_login.'">'.$user->display_name.'</a></li>'; 62 } 63 ?> 64 </ul> 65 </div><!-- #side --> 66 </div> 67 68 <?php wp_pagenavi(array('query' => $the_query)); ?> 69 <?php wp_reset_postdata(); ?> 70 71 72 <?php wp_footer(); ?> 73</body> 74</html>

皆様、ありがとうございました。

投稿2022/05/05 12:09

kvan

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問