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

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

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

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

PHP

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

Q&A

解決済

1回答

1494閲覧

ページネーション自作時の404エラーについて

try-on-re

総合スコア3

WordPress

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

PHP

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

0グッド

0クリップ

投稿2023/02/17 01:56

編集2023/02/19 08:24

実現したいこと

Wordpressサイトにてページネーションの自作をしたのですが、ページ送りリンク3(paged=3)で404エラーが発生して困っています.
これを3以上の数字でも正常なリンクとして使用したいです。

前提

記事投稿数11以上のカスタム投稿アーカイブページにて'posts_per_page'を5に設定しているのですが
1,2のページ送りリンクの生成のみで、11番目以降の古い記事へのリンクが表示されません。
'posts_per_page'を削除した場合は、2ページに振り分けられて1ページあたりの表示投稿が増えていきます。
→進展ありまして、ページ送りリンク(3以降)の生成には成功しました

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; $custom_args = array( 'post_type' => 'pressroom', 'posts_per_page' => 5, 'paged' => $paged ); $custom_query = new WP_Query( $custom_args ); ?>

同じarchiveXXX内に上記の記述があります。
2つ目のget_query_var('paged')をget_query_var('page')にした場合は2ページ目ボタンを押しても1ページ目の内容が表示されましたので、両方paged でよいと考えています。

発生している問題・エラーメッセージ

下記に記載のコードでは3ページ目以降のページ送りが出来ない状態です。
※ページ送りボタン1,2,3・・・は生成されるが3以降では404エラー、1,2は正常
表示されるリンク先はexample/category?paged=3 で、リンク先ページが生成されていません。
totalに実数を入れた場合は404エラーが発生します。

該当のソースコード

<?php if ($custom_query->max_num_pages > 1): echo '<div class="new-pagenation">'; echo paginate_links(array( 'base' => get_pagenum_link(1) . '%_%', 'format' => '?paged=%#%', 'total' => $くcustom_query->max_num_pages, 'current' => max(1, $paged), 'show_all' => False, 'end_size' => 1, 'mid_size' => 2, 'prev_next'=> True, 'next_text' => '次へ', 'prev_text' => '前へ' )); echo '</div>'; endif; ?>

試したこと

total に投稿数/5 切り上げの実数を入力して見たのですが、その場合は3ページ目以降は404エラーになりました。
wp_queryを custom_query に変更したことで、ページ送りボタンの生成には成功し、1,2,3・・・と、ページ送りボタンは生成されました。(リンク先表示はcategory?paged=3 と表示)
1,2はリンク先ページ生成されるが、3以降はクリックしても404エラー
アドレスバーに直接exanpmle.com/category?paged=3/を入力しても404エラーになります。

補足情報(FW/ツールのバージョンなど)

ページネーションプラグインやショートコードは試みましたが404エラーが頻発するのでページネーションを自作する方法を採りました。
色々と試しては見たつもりですが、見落としなどもあるかもしれませんのでお気づきの点あればコメント頂ければ幸いです。
function.php内に

add_filter('redirect_canonical','my_disable_redirect_canonical'); function my_disable_redirect_canonical( $redirect_url ) { if ( is_archive() ){ $subject = $redirect_url; $pattern = '/\/page\//'; // URLに「/page/」があるかチェック preg_match($pattern, $subject, $matches); if ($matches){ //リクエストURLに「/page/」があれば、リダイレクトしない。 $redirect_url = false; return $redirect_url; } } }

1,2は正常に使えているのに、3で異常が出る という事はループ関連でしょうか。
お気づきの点あれば別視点からご意見伺えますと幸いです。

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

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

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

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

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

tabuu

2023/02/17 03:40

まずは該当のソースコードをマークダウン形式で見やすくしてください。 そしてposts_per_pageを5に設定したとありますがどのように設定されたのでしょうか?
try-on-re

2023/02/17 03:57

こちらの使い方に慣れておらず。申し訳ありません。 posts_per_pageについては、同じarchive-category.php内の上の行に $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; $custom_args = array( 'post_type' => 'category', 'posts_per_page' => 5, 'paged' => $paged ); $custom_query = new WP_Query( $custom_args ); ?> で記載してあります。 この他、ダッシュボード設定とcustom post uiも同様に5で設定しました
guest

回答1

0

ベストアンサー

ページングはメインクエリでされます。
テンプレートではサブクエリで表示する投稿一覧が存在しようが、メインクエリで投稿の検索結果がなければ404になります。
メインクエリを書き換えましょう。

pre_get_postsis_main_queryでメインクエリかを判定し、メインクエリかつアーカイブページのリクエストであれば検索条件や表示する投稿の数を書き直します。

query_postsを使うのは無しですよ。
あとtemplate_redirectより前にやらないと意味がないので、上記の処理はarchive.phpのテンプレートとかじゃなく、functions.phpでやります。

投稿2023/02/17 04:15

KazuhiroHatano

総合スコア7802

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

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

try-on-re

2023/02/17 04:36

コメントありがとうございます。 様々なブログ等拝見しながら、function.phpに勝手にリダイレクトしないための記述は追加していますが、テンプレート側ではなくて殆どfunction.phpに書くくらいの意識でいた方が良いのでしょうか。 前段階として、特定カテゴリでの不具合に対する応急処置的な面が強かったため、該当のarchiveページばかり触ろうとしていました。
KazuhiroHatano

2023/02/17 05:01

メインクエリが確定して、テンプレートが選出された後では遅い処理というのは、functions.phpに書きます。 テーマのファイルの中ではfunctions.phpだけがメインクエリ決定前に実行されます。 メインクエリの検索条件の書き換えなどはまさしくそういうものです。 そういう処理でなければテンプレートに書くのでいいですし、ある種の処理はメインクエリが確定した後でないと動かないので、そういうのはテンプレート側でやります。
try-on-re

2023/02/17 06:16

function category( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'cat', '123' ); } } add_action( 'pre_get_posts', 'category' ); と $paged =  ~~~ をfunction.php内に記述して投稿データの取得を行って、archiveの方にはページネーションだけがあれば十分に機能するという事なのでしょうか
KazuhiroHatano

2023/02/17 08:44

メインクエリに目的の投稿が入るようにすれば、サブクエリであらためて同じ検索をする必要はないので、普通にメインクエリをループして表示すればいいです。 paginate_linksでもtotalやcurrentはメインクエリから初期値を取得するようになっているので指定する必要がなくなります。
try-on-re

2023/02/18 02:51

<メインクエリに目的の投稿が入るようにすれば、サブクエリであらためて同じ検索をする必要はないので、普通にメインクエリをループして表示すればいい  というのは、function.phpで一度メインクエリに目的のpre_get_posts 処理を済ませて、該当のarchiveページではサブクエリが不要、メインクエリの呼び出し処理を行うという理解で正しいでしょうか?  ページネーション内の記述が足りないという事なのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問