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

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

ただいまの
回答率

90.51%

  • PHP

    20388questions

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

  • WordPress

    7232questions

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

WordPressの記事ページに寄せられたコメントのソートを複数用意したい(記事ページのURLを複数作りたい)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 254

defaulTaro

score 6

お忙しい中、私の質問を閲覧いただきありがとうございます。
現在独学でWordPressを学習中なのですが、今回はWordPressの記事ページのコメント一覧の実装に伴い、複雑な問題が発生したため質問させていただきました。
もし解決できそう、または手助けになるアイディアをお持ちの方は、是非ご回答の程よろしくお願いいたします。

前提・実現したいこと

--- 前提
WordPress 4.7.8
PHP 7.0.18
使用テーマ SKT Design Agency
Comment Rating Field Pluginでコメントに評価を付けられる仕様
functions.phpでコメントにコメントの種類を選択できるプルダウンメニューを追加済み(A, B, Cの3種類)

--- 目的
①WordPressの記事ページにて、コメント一覧をコメントの種類(A,B,C)別に表示したい。
②種類別に表示したコメントを最新順と評価の高い順に画面上で切り替えたい。
③それぞれのページネーションの実装
④同一ページで表示したいのは1種類のみ(他の種類はタブで切り替えたり、別URLを生成したりして切り替えたい)

試したこと

single.phpでコメント一覧を各種類・ソート別に(3種類×ソート2種=6パターン)取得し、それぞれを表示する。
→実装してみたが、ページネーションのページ数が全件表示した際のページ数になってしまい、種類別に表示するとコメント数の整合性が取れない。
(ページネーションは10ページまで表示されているが、Aのコメントが2ページしか無い場合、3〜10ページが空白になる)

思いついた実装方法

①記事ページのURLを複数生成する。(Aの最新順、Aの評価順……Cの評価順の6種類)
→同じ記事ページのURLを複数生成できるか分からない。テンプレートもURLを判別して使い分けることができるのか分からない。

②各種類の固定ページ(Aの最新順……Cの評価順の6種類)を用意し、記事ページに記事IDを渡すリンクを作成し、その固定ページへ飛ばす。("ブログURL/固定ページ?post_id=xxx"のような形)
受け渡されたIDをもとに固定ページでコメントを取得し、ページネーションを行う。
→ページネーションのURLが正常に生成されるのか?(パラメータが消えるのではないか?)

参考サイト様

転職会議(http://jobtalk.jp/)
こちらのサイトの各企業様に寄せられた口コミ一覧が、とてもキレイで見やすかったので、自分でも実装してみたいと思いました。

追記・修正

functions.phpでコメントにコメントの種類を選択できるプルダウンメニューを追加済み(A, B, Cの3種類)

正しくはラジオボタンでした。
また、こちらの実装方法については以下の通りです。

add_filter( 'comment_form_defaults','change_comment_form');
function change_comment_form($default) {
    $commenter = wp_get_current_commenter();

    //コメントの種類
    $default['fields']['email'] .= '<p class="comment-form-author">
        <label>コメントの種類</label>
        <input type="radio" name="contentDetail" value="種類A" id="contentKind01" checked/>
        <label for="contentKind01">'. __('種類A') . '</label>
        <input type="radio" name="contentDetail" value="種類B" id="contentKind02" />
        <label for="contentKind02">'. __('種類B') . '</label>
        <input type="radio" name="contentDetail" value="種類C" id="contentKind03" />
        <label for="contentKind03">'. __('種類C') . '</label>
        </p>';

    return $default;
}


wp_commentmetaテーブルに、meta_key="contentDetail"に紐付いてmeta_valueが入っている状態です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • aozuki

    2017/12/13 13:10

    > functions.phpでコメントにコメントの種類を選択できるプルダウンメニューを追加済み これはどういう形でコメントに紐付いているんですか?comment_typeカラムに特定の値が入ってるんですかね?

    キャンセル

回答 2

checkベストアンサー

+3

URLパラメータを与えて、ってのは(個人的に)あまり望ましくないですね。
WordPressはindex.phpに一度集めて、全てをパラメータで管理しているわけですから。

予め全てのコメントを記事に読み込んでおき、コメント種類別に分け、jQueryでタブ化させるというのが現実的かなーと思います。
get comments()が記事ごとのコメントを取得でき、同時にmeta_key,meta_valueも指定して取得できるようなので、思ったより冗長にはならなさそうです。

$args = array(
  'post_id' => get_the_ID(),
  'meta_key' => 'contentDetail',
  'meta_value' => '種類A'
);
$comments = get_comments($args);


※動作テストはしてません

ページングに関しては、同じくget_comments()の引数にnumber(取得数),offsetを通常のページングと同じ要領で渡してやれば出来ない事はなさそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/18 19:19

    回答いただきありがとうございます!
    反応が遅れてしまい申し訳ありません。

    回答の内容は、コメントのページネーションをpaginate_links()を使用せず手動で設定する、ということだとお見受けしました。
    確かに手動で設定し、ページネーションのリンクごとタブで切り替えてしまえば今回の実装は可能な気がします!

    キャンセル

+1

>記事ページのURLを複数生成する

個別ページに子ページのURLを作ることはできます、
できますがadd_rewrite_rule();使ったことないとなると道のり長いです

やろうとしてることについて必要になるフックと関数だけ列挙しときます

フック
query_vars
parse_comment_query
(template_include)

関数
add_rewrite_rule();

add_rewrite_rule();で個別ページのURL/コメントの種類/のパーマリンク設定を追加
query_varsでコメントの種類のURLパラメータもクエリ変数に指定できるようにして
parse_comment_queryでそのクエリ変数が指定されていればmeta_queryを追加する
って感じでしょうか

template_includeフィルタはコメントの種類ごとに表示内容が全然違うので
テンプレートファイル自体を切り替えたいとかいう場合に使います


add_rewrite_rule();は正規表現による
URLを書き換え設定を追加します
正規表現を知らないと道のりはさらに長く険しく…

add_rewrite_rule(
  'mypost_type/([0-9]+)/(\w+)/',
  'index.php?post_type=mypost_type&p=$matches[1]&page_type=$matches[2]',
  'top'
);

これで、例えば
http://example.com/mypost_type/63/hoge/

http://example.com/index.php?post_type=mypost_type&p=63&page_type=hoge
にリダイレクトされるようになります

第3引数のtopは書き換えルールの優先順位を先頭にってことです
wordpressの固定ページとかのリライトルールがほとんどのパターンを引っ掛けてしまうので
ここは割とtop以外の選択肢がないです

add_rewrite_tag()はadd_permastruct()とセットで使うもので
add_rewrite_rule()に渡す引数の生成の設定をする関数です

管理画面のパーマリンク設定でカスタムURLの設定にも使いたいとか
いろんなパーマリンクで同じ書き換えルールのパーツを使うというときに使います

他のカスタム投稿タイプやページタイプでも同様に子ページを作れるようにしときたい
とかいうような場合はadd_rewrite_tag()+add_permastruct()でやっておくのもいいです

特定のカスタム投稿でしか使わないとかなら
add_rewrite_rule()でやっといた方が手間が少ないです

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/18 19:39

    回答いただきありがとうございます!
    反応が遅れてしまい申し訳ありません。

    回答の内容は私が実装してみたい内容にマッチしているのですが、挙げていただいた関数, フックについて調べてみたところ、理解に時間がかかりそうな内容でして、いくつものサイトやページを参考に試してみたのですが、上手く実装出来ませんでした…

    (以下、前提としてパーマリンクをpost titleにしているものとします。)
    add_rewrite_rule()の認識としては、example.com/postTitle/?my_var1=newpage&my_var2=detail というリクエストを送信すると、example.com/postTitle/newpage/detail というURLにリダイレクトさせることができるものだと思っております。

    また、送信するパラメータ(query string?)については、WordPressが認識できるよう自分で設定するもの(add_rewrite_tag?add_filter('query_vars')?)であることもわかりました。

    この内容が正しく設定出来ておらず、debug barで調べると、rewrite ruleが自分で設定したもので無いもの(デフォルト設定)が適用されていました。

    詰まっている内容の大部分は、恐らく
    ① add_rewrite_rule()の引数のそれぞれの役割があまり理解出来ていない。
    ② ①で使用する正規表現が分からない。
    ③ query_varsの設定が正しいのかが分からない
    の3つでは無いかと考えています。

    こちらについて何か詳しい資料か、助言がもしありましたら是非頂戴したいです。
    長くなってしまいましたが、よろしくお願いいたします。

    キャンセル

  • 2017/12/19 18:21

    回答ありがとうございます。
    リライトルールについて様々な方法を頂き、大変助かりました。
    しかし、私がまだこの領域に触れたばかりで、完全に納得し実装に漕ぎつけるまでもう少し時間がかかりそうですので、一旦自分で勉強し、分からないことをもう少し細分化し、改めて質問を作成したいと思います!

    何度も丁寧に対応していただき本当にありがとうございました!

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    20388questions

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

  • WordPress

    7232questions

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

  • トップ
  • PHPに関する質問
  • WordPressの記事ページに寄せられたコメントのソートを複数用意したい(記事ページのURLを複数作りたい)