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

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

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

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

PHP

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

Q&A

解決済

4回答

2761閲覧

WordPressのデフォルトのリライトルールを削除したい(無視したい)

Nerf.this

総合スコア14

WordPress

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

PHP

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

0グッド

1クリップ

投稿2018/01/18 10:40

編集2018/01/22 02:52

質問の閲覧ありがとうございます。
今回は、WordPressで最初から用意されている、コメントのページングに関するリライトルールを削除(または無視)する方法が知りたいのですが、調べてもわからなかったので質問させて頂きました。

###前提・実現したいこと
コメントのページングを管理する変数cpage=xxxcomment-page-xxxに変更するリライトルールを無視したい

RuleRewritesource
([^/]+)/comment-page-([0-9]{1,})/?$index.php?name=$matches[1]&cpage=$matches[2]post

###実装中のfunctions.php

php

1add_action('init', 'my_add_single_rewrite_endpoint'); 2function my_add_single_rewrite_endpoint() { 3 add_rewrite_endpoint('x1', EP_PERMALINK, 'y1'); 4 add_rewrite_endpoint('x2', EP_PERMALINK, 'y2'); 5 add_rewrite_endpoint('x3', EP_PERMALINK, 'y3'); 6}

実際に叩くURLはhttp://example.com/記事スラッグ/x1/y1/?cpage=xxxになるのですが、cpage=1の場合は期待通りコメントの1ページ目が表示されるのですが、2より大きい数値を指定するとWordPressのデフォルトのリライトルールによりhttp://example.com/記事スラッグ/x1/y1/comment-page-2/になってしまいます。

自分で追加したリライトルールに則ってページングしたいため、cpageを残したままにしたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
WordPress 4.7.8

###追記1
目標のURL(例:2ページ目)
理想
http://example.com/記事スラッグ/x1/y1/?cpage=2
現状
http://example.com/記事スラッグ/x1/y1/comment-page-2/
下記my_add_single_rewrite2()追記後
http://example.com/記事スラッグ/x1/y1/?cpage=-2%2F

*現状の設定について
functions.php

php

1add_filter('init', 'my_add_single_rewrite1'); 2add_filter('init', 'my_add_single_rewrite2'); 3add_filter('init', 'my_add_single_rewrite3'); 4 5function my_add_single_rewrite1() { 6 add_rewrite_endpoint('x1', EP_PERMALINK, 'y1'); 7 add_rewrite_endpoint('x2', EP_PERMALINK, 'y2'); 8 add_rewrite_endpoint('x3', EP_PERMALINK, 'y3'); 9} 10 11function my_add_single_rewrite2() { 12 global $wp_rewrite; 13 $wp_rewrite->comments_pagination_base = '?cpage='; 14} 15 16function my_add_single_rewrite3( $array ) { 17 add_rewrite_rule('smart-custom-fields/[^/]+/attachment/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 18 add_rewrite_rule('smart-custom-fields/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?smart-custom-fields=$matches[1]&cpage=$matches[2]', 'top'); 19 add_rewrite_rule('smart-custom-fields/[^/]+/([^/]+)/?cpage=([0-9]{1,})/?$', ' index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 20 add_rewrite_rule('media/[^/]+/attachment/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 21 add_rewrite_rule('media/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?media=$matches[1]&cpage=$matches[2]', 'top'); 22 add_rewrite_rule('media/[^/]+/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 23 add_rewrite_rule('feature/[^/]+/attachment/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 24 add_rewrite_rule('feature/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?feature=$matches[1]&cpage=$matches[2]', 'top'); 25 add_rewrite_rule('feature/[^/]+/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 26 add_rewrite_rule('.?.+?/attachment/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 27 add_rewrite_rule('(.?.+?)/?cpage=([0-9]{1,})/?$', 'index.php?pagename=$matches[1]&cpage=$matches[2]', 'top'); 28 add_rewrite_rule('[^/]+/attachment/([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top'); 29 add_rewrite_rule('([^/]+)/?cpage=([0-9]{1,})/?$', 'index.php?name=$matches[1]&cpage=$matches[2]', 'top'); 30 add_rewrite_rule('[^/]+/([^/]+)/?cpage=([0-9]{1,})/?$ ', 'index.php?attachment=$matches[1]&cpage=$matches[2] ', 'top'); 31};

###追記2
Debug Barで確認したページリクエスト
ローカル(MAMP)

Request: 記事スラッグ/x1/y1 Query String: name=記事スラッグ&cpage=2&y=y2 Matched Rewrite Rule: ([^/]+)/x1(/(.*))?/?$ Matched Rewrite Query: name=記事スラッグ&y=y1

サーバー(functions.phpに追加後)

Request: 記事スラッグ/x1/y1 Query String: name=記事スラッグ&cpage=-2%2F&y=y2 Matched Rewrite Rule: ([^/]+)/x1(/(.*))?/?$ Matched Rewrite Query: name=記事スラッグ&y=y1

サーバー(functions.phpに追加前)

Request: 記事スラッグ/x1/y1/comment-page-2 Query String: name=記事スラッグ&y=y1%2Fcomment-page-2 Matched Rewrite Rule: ([^/]+)/x1(/(.*))?/?$ Matched Rewrite Query: name=記事スラッグ&y=y1%2Fcomment-page-2

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

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

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

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

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

guest

回答4

0

ベストアンサー

テストしてみて結果がでたのでこちらで確認お願いできますか?

add_action('init', function(){ global $wp_rewrite; add_rewrite_endpoint('x1', EP_PERMALINK, 'y1'); add_rewrite_endpoint('x2', EP_PERMALINK, 'y2'); add_rewrite_endpoint('x3', EP_PERMALINK, 'y3'); $wp_rewrite->comments_pagination_base = '?cpage='; add_rewrite_rule('(.?.+?)/?cpage=([0-9]{1,})', 'index.php?pagename=$matches[1]&cpage=$matches[2]', 'top'); }); add_filter( 'user_trailingslashit', function( $string, $type_of_url ){ if ( $type_of_url === 'commentpaged' ) { if (preg_match( '{(.?.+?)/?cpage=/([0-9]{1,})/}', $string)) { return ''; }else{ $result = $m[1].'/?cpage='.m[2]; var_dump($result); return $result; } } return $string; }, 10, 2);

投稿2018/01/23 14:14

backn

総合スコア25

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

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

Nerf.this

2018/01/24 02:54

何度も丁寧にありがとうございます…! このコードを試したところ、ローカルのMAMPでは$mが見つからずにエラーを吐いていたのですが、試しにサーバーに上げたところ無事ページング出来ました!本当にありがとうございます! 感謝と敬意を込めてベストアンサーにさせていただきます。 ソースを見ていくと、質問の追記1のリライトルール追記で失敗した理由は、コメントのページング関連の処理の中で呼び出されるuser_trailingslashitでcomments_pagination_baseの後にハイフンを付けていたからだと理解しました。 ローカルで何故$mがundefinedだったのかはMAMPでWordPressを扱う際の仕様だと思うので別途調べようと思います… また、initにフックさせているfunctionの方のadd_rewrite_ruleをコメントアウトしても同じ動作をしたのですが、こちらはどのような場面を想定したリライトルールなのでしょうか?
backn

2018/01/24 03:19

解決できてよかったです。$mなかったのは、すいません。 (preg_match( '{(.?.+?)/?cpage=-([0-9]{1,})/}', $string, $m))かな? 確認の為、wp-include内を確認しつつ'-'の部分を書き換えてたりしたので ソースコード間違ってるかもです。。 ちゃんと動くか分からないまま回答してすいません。 add_rewrite_ruleやrewrite_rulesを書き換えたときは、 管理画面から設定⇒パーマリンク設定から「設定を保存」もしくは $wp_rewrite->flush_rules();で更新されます。 リライトルールは上記時にDBのwp_optionsのrewrite_rulesが更新されます。 コメントアウトしても動作したのは、すでにリライトルールが更新されていたからだと思います。 逆にリライトがおかしい場合は、どのページでもいいので print_r(get_option( 'rewrite_rules' )); でリライトルールを表示してリライトルールがおかしくないか ちゃんと動作するように合わせるといいと思います。 リライトルールで設定していても canonicalでURLが自動補完されてしまうので user_trailingslashitでそれを無効にするというやり方でした。 redirect_canonicalあたりを調べるといいかと思います。 Wordpressの中身をすべて知っているわけでもないので、すいません。 力になれてよかったです。
guest

0

wordpressで似たような件で悩みこちらに辿り着いたので力になると思ったのですが
ダメでした、すいません。

私の場合
/pagename/comment-page-XX/

/pagename/comments/XX/
に変更したソースになります。

ページャーはwp_commentpagenaviで出力してます。

//function.php //コメントページのスラッグを変更 add_action('init', function(){ global $wp_rewrite; $wp_rewrite->comments_pagination_base = 'comments'; }); add_filter('rewrite_rules_array',function ($rules){ $newrules = array(); $newrules['(.?.+?)/comments/([0-9]{1,})/?$'] = 'index.php?pagename=$matches[1]&cpage=$matches[2]'; $newrules['(.?.+?)/comments/([0-9]{1,})/?$'] = 'index.php?pagename=$matches[1]&cpage=$matches[2]'; $newrules['game/[^/]+/attachment/([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?attachment=$matches[1]&cpage=$matches[2]'; $newrules['game/([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?game=$matches[1]&cpage=$matches[2]'; $newrules['game/[^/]+/([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?attachment=$matches[1]&cpage=$matches[2]'; $newrules['.*wp-(atom|rdf|rss|rss2|feed|commentsrss2).php$'] = 'index.php?feed=old'; $newrules['comments/feed/(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?&feed=$matches[1]&withcomments=1'; $newrules['comments/(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?&feed=$matches[1]&withcomments=1'; $newrules['comments/embed/?$'] = 'index.php?&embed=true'; $newrules['.?.+?/attachment/([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?attachment=$matches[1]&cpage=$matches[2]'; $newrules['(.?.+?)/comments/?([0-9]{1,})/?$'] = 'index.php?pagename=$matches[1]&cpage=$matches[2]'; $newrules['[^/]+/attachment/([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?attachment=$matches[1]&cpage=$matches[2]'; $newrules['([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?name=$matches[1]&cpage=$matches[2]'; $newrules['[^/]+/([^/]+)/comments/?([0-9]{1,})/?$'] = 'index.php?attachment=$matches[1]&cpage=$matches[2]'; return $newrules + $rules; }); add_filter( 'get_comments_pagenum_link', function( $result ){ if (preg_match( '{(.?.+?)/comments-([0-9]{1,})/}', $result, $m)) { $result = $m[1] . '/comments/' . $m[2].'/'; return $result; } return $result; }, 10, 2); add_filter( 'user_trailingslashit', function( $string, $type_of_url ){ if ( $type_of_url === 'commentpaged' ) { if (preg_match( '{(.?.+?)/comments-([0-9]{1,})/}', $string, $m)) { $result = $m[1] . '/comments/' . $m[2].'/'; return $result; }else{ return ''; } } return $string; }, 10, 2);

/wp-includes/cannonical.php
/wp-includes/class-wp-rewrite.php
/wp-includes/link-template.php

この辺のソースを
'comments_pagination_base'で検索すれば
流れがわかるかと思います。

user_trailingslashitで末尾にスラッシュがない場合つけてた気もするので
?cpage=-2%2F
と出力されるのはuser_trailingslashitで末尾にスラッシュが付与されたからだと思います。

そして%2Fとなってるのはその末尾がURLエンコードされているためだと思います。

また勝手にコメントページがリダイレクトされるのは私もすごく悩みました。
下記で解説されている方が参考になりましたので、ご確認ください。
https://aulta.co.jp/2017/08/15/3805.html

get_commentsで表示してて
?cpage=(Wordpressのページング機能)にこだわらないのであれば

add_filter( 'query_vars', 'add_query_vars', 10, 1 ); function add_query_vars($vars) { $vars[] = 'cm'; return $vars; }

?cm=XX等でURLクエリパラメータ追加して
自分でページング処理しちゃってもいいのかなとも思います。

間違ってたらごめんなさいー><

投稿2018/01/23 13:45

編集2018/01/23 16:27
backn

総合スコア25

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

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

0

こうしておけばどうでしょう?

global $wp_rewrite; $wp_rewrite->comments_pagination_base = 'cpage';

投稿2018/01/18 14:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Nerf.this

2018/01/19 01:52 編集

回答ありがとうございます。 回答していただいた方法を参考に、functions.phpに以下を追記しました。 add_filter('init', 'my_override_paging_rule'); function my_override_paging_rule() { global $wp_rewrite; $wp_rewrite->comments_pagination_base = '?cpage='; } で無事 `comment-page` の部分は変更出来たのですが、WordPressに元々あるリライトルールが `([^/]+)/comment-page-([0-9]{1,})/?$` であるため、URLを叩くと `http://example.com/x1/y1/?cpage=-2%2F` とページ数の部分にハイフンがついてしまいました。 これにより-2ページ目(コメントが全件表示されている状態)が表示されるという事象が発生しています。 この部分を直すにはリライトルールを上書きすれば良いのでしょうか? 現時点だと、リライトルールを上書きする場合のやり方と、ページ数が `2` ではなく `2%2F` となっていることが分かっていない状態です。
Nerf.this

2018/01/19 03:37

返信ありがとうございます。 `comment-page-xxx`とルール定義されているリライトルールの全てのパターンを、ハイフン抜きのものをadd_rewrite_rule()で追加したのですが、挙動が変わりませんでした… 例 ルール:([^/]+)/?cpage=([0-9]{1,})/?$ リライト:index.php?name=$matches[1]&cpage=$matches[2] ポジション:top ルールを追加しただけなのでデフォルトのルールはもちろん残ったままなのですが、既存のルールより優先度を高く設定したのにも関わらず、今まで通り、`?cpage=-2%2F`と表示されてしまいます。 これはリライトルールの追加が上手くいっていないのでしょうか? ちなみにcomments_paging_baseはしっかり`?cpage=`に変更されています。
退会済みユーザー

退会済みユーザー

2018/01/19 04:54

それらの設定に必要なコード全てを質問に追記してもらえますか?
Nerf.this

2018/01/19 05:08

只今追記いたしました。よろしくお願いいたします。
guest

0

こちらを追記でリダイレクトは止まりますでしょうか?

add_filter( 'user_trailingslashit', function( $string, $type_of_url ){
if ( $type_of_url === 'commentpaged' ) {
if (preg_match( '{?cpage=}', $string)) {
return $string;
}else{
return '';
}
}
return $string;
}, 10, 2);

ページングもおかしくなっていると思うので、こちらも

add_filter( 'get_comments_pagenum_link', function( $result ){
if (preg_match( '{(.?.+?)/?cpage=-([0-9]{1,})/}', $result, $m)) {
$result = $m[1] . '/?cpage=' . $m[2];
return $result;
}
return $result;
}, 10, 2);

投稿2018/01/23 05:32

編集2018/01/23 05:33
backn

総合スコア25

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

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

Nerf.this

2018/01/23 08:41

回答ありがとうございます!! ご教授頂いたコードをfunctions.phpに追記したところ、2ページ目以降で、 `http://example.com/記事スラッグ/x1/y1/` となってしまいました。 ぱっと見て、このコードが何をしているのか分からなかったのですが、少し調べた限りですとコメントのページングの際のURLの末尾を変更する物だと解釈しました。 1つ目でコメントのページングをしたいページかを判定し、2つ目で目的のURLに切り替えるのだと思っています。 そして、正しいパラメータがセットされなかった原因は、恐らくコメントの最大ページ数がセットされていないので値が正しくセットされないのかな、と予想してみましたがいかがでしょうか? 実は記事スラッグの後ろに `x1/y1` と付けているのは、コメントに追加したメタ情報を元に出し分ける為のもので、例えばx, yの後ろの数字が違うと、get_commentsにそれぞれ違うオプションを設定して取得したコメントをwp_list_commentsで表示する仕組みになっています。 詳しい原因が分からないのでなんとも言えないのですが、このような場合はどういった解決策がありますでしょうか…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問