• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WordPressの質問(q10054200)の続)

WordPressの質問(q10054200):コメントにハートマークをつけていいねボタンをカウントする方法

このQ&Aのポイント
  • WordPressの質問(q10054200)について、コメントにハートマークをつけていいねボタンをカウントする方法がわからない。
  • functions.phpにfunction set_post_views_days()と3,7日間のカウンターをまとめているが、それと合体させるべきか、別に実装すべきか悩んでいる。
  • カスタムフィールド(view_good_count)でカウントし、Font Awesomeのハートマークを使用してボタンカウントを実装する予定。しかし、実装方法に関して悩んでいる。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.29

【お問い合わせ その9】 パーマリンクはカスタム構造にしなくても、 固定ページのパーマリンクを「contact」にしておくだけで大丈夫そうです。 私の環境では、入力画面以降の画面に遷移できています。 ただ、入力画面の内容が確認画面に反映されていないのと、 そのためかメール送信で以下のエラーになっています。 ~~~~ Warning: mb_send_mail(): Failed to connect to mailserver at &quot;localhost&quot; port 25, verify your &quot;SMTP&quot; and &quot;smtp_port&quot; setting in php.ini or use ini_set() in contact-sendmail.php on line 32 ~~~~ 質問者さまも同じエラーでしょうか。 エラーの調査はまだしていませんが、 エラーの際にindex.phpに遷移する方法を考えてみます。 コメントアウトについてはPHPのコードにするといいです。 <?php //送信時のデータ形式を指定する?>

php_learn
質問者

お礼

参考サイトを見てsmtp設定をPHP側で試しているのですが、メールの送信のやり方がわかりません。 テストメールをwp_mail()から送信してみるというコードをファイルに書き込んでもメールが届いていない状態です。 Hostは契約時のメール内容から、Port番号はカラフルボックスの案内から、Username、Password、From はCpanelの設定画面から確認しているのですが… 何か抜けているのでしょうか? dell_okさんと同じlocalhost環境でも試してみようかと考えております。 ※参考画像 https://imgur.com/1BgETYv.jpg https://imgur.com/jFBZorC.jpg ※接続ポート番号について https://help.colorfulbox.jp/manual/mail-spec-list/ ※実装コード add_action("phpmailer_init", "send_smtp_email"); function send_smtp_email( $phpmailer ) { $phpmailer->isSMTP(); $phpmailer->Host = "[mail.last.cfbx.jp]"; $phpmailer->SMTPAuth = true; $phpmailer->Port = 587; $phpmailer->SMTPSecure = "tls"; $phpmailer->Username = "[test@last.cfbx.jp]"; $phpmailer->Password = "[takuya7530]"; $phpmailer->From = "[test@last.cfbx.jp]"; $phpmailer->FromName = "[test]"; } ※テストメールをwp_mail()から送信(t******@gmail.comは確認用のメールアドレス) wp_mail( "t******@gmail.com", "届きましたか?", /// => サブジェクト(件名) "このメールが見れたなら設定は完ぺき!" /// => ボディ(メール内容) ); ※参考サイト 1,https://qiita.com/e__ri/items/857b12e73080019e00b5 2,https://fukuro-press.com/wordpress-send-email-with-smtp/

php_learn
質問者

補足

アドバイスありがとうございパーリンクを変更したところ遷移することができました。 確認画面の内容は飛ばされているようですね… メールも届いていないようです。 コメントアウト部分修正致しました。ありがとうございます。 メールが送れない原因を考えてみたのですがsmtpが原因ではないでしょうか? ※参考サイト https://teratail.com/questions/123222 https://fukuro-press.com/wordpress-send-email-with-smtp/

その他の回答 (28)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.8

【コメント欄 その68】 パターン1とパターン2を試してみました。 パターン1はエラーメッセージは表示されていませんが、 WordPressによって強制終了されてます。 内部的にエラーが発生しているためだと思いますが、 エラーメッセージがないため原因が不明です。 パターン2はエラーメッセージが表示されています。 引数の配列がnullのためです。 エラーの解決はひとまず置いておいて、 気になったことを確認します。 コードの雰囲気からすると、 コメントすべてをひと続きの配列にまとめたかったのですね。 これが成功したとしてそのまま表示すると、 どの記事のコメントかわかりません。 旧コードのものでは、 記事タイトルと日付が表示されて、 その下にコメントが表示されていると思います。 どの記事のコメントかわからなくても大丈夫なのでしょうか。

php_learn
質問者

お礼

補足になるのですが、以前表示されていたコードですと送信した内容が表示されております。 今は送信した内容が表示されていないためコードの違いを比較したときに$comments->commentの部分が異なるため $commentsに各フィールドごとの記事が入っていないのではないかと考えています。

php_learn
質問者

補足

回答ありがとうございます。 どの記事のコメントかわかる状態で実装したいのですが、 送信した内容が表示されないため $commentsが空になっているのではないかと推測しました。 そこでカスタムフィールドキーをまとめて出力する方法を考えています。 以前表示されていたコードに$tnを付け足して、$comments_red,$comments_blue, $comments_green,$comments_white,$comments_black, $comments_single の表示部分をまとめたものを実装したいです。 そのため$commentsにカスタムフィールドキーごとの関数を渡しています。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.7

【コメント欄 その67】 ・1つ考えがあるのですが、$comments_red,$comments_blue, $comments_green,$comments_white,$comments_blackを 1つの配列にまとめて貯めておくのはどうでしょうか? とてもいいことです。 気づいてくださってよかったです。 最初はそうしたかったのですが、 この方がわかりやすいかと思って別々の変数にしていました。 このようなものは配列にするのが普通ですので、 ぜひやってみてください。 とは言っても、 それが私が思っているような配列と同じかどうかわかりませんが。

php_learn
質問者

補足

配列にまとめてみたのですがアドバイスお願い致します。 $commentsをforeach内でダンプしてみたところ値が確認できているため、 直接的な原因である確信はありませんが表示に成功しているコードと見比べてみたときに大きな違いがあるとしたらまとめて表示している部分ではないかと考えています。 関数を配列としてまとめる際に[]に複数書くとエラーが出ると思いますので分けています。 パターン2は調べて際にコードを発見いたしました。 dell_okさんから見て表示に失敗している原因に当たりそうな点はありますでしょうか? *パターン1 $comments = []; foreach ($comments as $com) { $com[$comments_red][$comments_blue][$comments_green][$comments_white][$comments_black][$comments_single]; } *パターン2 //配列を結合する $comments = array_merge($comments_red, $comments_blue, $comments_green, $comments_white, $comments_black, $comments_single); ※該当コード https://wandbox.org/permlink/80ShyZzZVlqw0sdm ※参考サイト https://www.sejuku.net/blog/28533

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.6

コメント欄 その66】 ・コメントが取得できないのかvar_dump()で調べてみたところ$postには値が確認できたのですが、$commentは空でした。 どのタイミングでダンプされたのかわかりませんが、 変数名は正しく表記してください。 「$comments」ですか。 「$comment」ですと、 foreach ($comments as $comment) {}の中でダンプする必要があります。 取得の確認でしたら、取得直後でダンプしてみてください。 ---- if (3 === $tn) { $args['post_id'] = $post_red->ID; /* 赤のID */ $comments_red = get_comments($args); /* 赤のコメント */ var_dump($comments_red); $args['post_id'] = $post_blue->ID; /* 青のID */ $comments_blue = get_comments($args); /* 青のコメント */ var_dump($comments_blue); $args['post_id'] = $post_green->ID; /* 緑のID */ $comments_green = get_comments($args); /* 緑のコメント */ var_dump($comments_green); } elseif (2 === $tn) { $args['post_id'] = $post_white->ID; /* 白のID */ $comments_white = get_comments($args); /* 白のコメント */ var_dump($comments_white); $args['post_id'] = $post_black->ID; /* 黒のID */ $comments_black = get_comments($args); /* 黒のコメント */ var_dump($comments_black); } else { $args['post_id'] = $post_single->ID; $comments_single = get_comments($args); var_dump($comments_single); } ---- ・数日前に($post, $comments)の$commentsを追加した記憶があるのですがもしかしたらこれが原因となっているかもしれません。 display_single_comment($post, $comments)の($post, $comments)でしたら、 以前からありますので、追加されたのはここではないと思います。 ・$commentsは両方でNULLとなっており、$comments as $commentで値を空のまま渡しているようです。 $commentsがnullであればempty()がtrueで、 「コメントなし」の表示処理になるため、 $comments as $commentの処理は実行されません。 ・$commentをダイレクトに渡すことは可能でしょうか? ダイレクトの意味がわかりません。

php_learn
質問者

補足

foreach ($comments as $comment) {}の中でダンプする必要があります。 $commentsがnullであればempty()がtrueで、 「コメントなし」の表示処理になるため、 $comments as $commentの処理は実行されません。 A.アドバイスありがとうございます。foreach内でダンプするんですね… どこでも確認できるのかと思っておりました。 勘違いでした、申し訳ありません。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.5

【コメント欄 その64】 ・コメントを取得する際はIDを結びつける必要はないのですね… そうですね。 もし、いいねカウントをwp_commentmetaに保持するようにした場合は、 JOINして結びつけるようになってくると思います。 ・category.phpのSQLでON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_idとテーブルカラムを結び付けたことに疑問があるのですが meta_keyを使用するために結び付けたという解釈で問題ないでしょうか? meta_keyはカスタムフィールドのためのものです。 記事テーブルは自分が属するカテゴリーのカテゴリーIDを持っていません。 なぜなら記事ひとつにつき複数のカテゴリーに属することができるからです。 いくつあるかわからないカテゴリー数分のカラムを記事テーブルに持たせるのは、 あまりよくないデータベース構造です。 よりよい方法として、別のテーブルにカテゴリーIDを持たせています。 別テーブルにあるためJOINが必要となってきます。 もし記事テーブルがカテゴリーIDを持っていれば、 JOINは 記事テーブル - カテゴリーテーブル でいいのですが、 記事のカテゴリーIDを持っているのは関連テーブルなので、 記事テーブル - 関連テーブル - カテゴリーテーブル となります。 簡単に説明しましたが、実際のWordPressの構造はもう少し複雑で、 厳密にはカテゴリーテーブルはありません。 そこをうまく説明できないのですが、 だいたいこんな感じなんだなとイメージしていただければと思います。 それで、疑問の結び付けについてですが、 それは関連テーブルとカテゴリーテーブルを結び付けているものです。 そしてカテゴリーテーブルの持つカテゴリーIDを条件にしているのです。 ---- WHERE wp_term_taxonomy.term_id = %d ---- ・display_single_commentというのがよくわからないのですが、関数になるのでしょうか? コメントを表示するための関数です。 旧コードはコメント表示の処理が画像3専用です。 ほぼ同じコードが赤青緑のみっつ分あります。 現在のコードでは、みっつ分をひとつの関数にまとめているのと、 画像1と画像2の表示にも対応しています。

php_learn
質問者

お礼

申し訳ありません。現在のコードでは、var_dump($comment)がNULLで空でした。 1つ考えがあるのですが、$comments_red,$comments_blue, $comments_green,$comments_white,$comments_blackを 1つの配列にまとめて貯めておくのはどうでしょうか? $commentsの値も空であるため、それぞれの関数から引っ張ってくるしかない気がしています…

php_learn
質問者

補足

【コメント欄 その64】 もし、いいねカウントをwp_commentmetaに保持するようにした場合は、 JOINして結びつけるようになってくると思います。 A.回答ありがとうございます。いいねカウントについて勉強になりました。覚えておきます。 なるほどカテゴリーが複数に属しているため別のテーブルを作成してIDを持たせたのですね、解説ありがとうございます。 _______________________________________ コメントが取得できないのかvar_dump()で調べてみたところ$postには値が確認できたのですが、$commentは空でした。 数日前に($post, $comments)の$commentsを追加した記憶があるのですがもしかしたらこれが原因となっているかもしれません。 過去に表示されていたコードの方で確認すると値が確認できました。 $commentsは両方でNULLとなっており、$comments as $commentで値を空のまま渡しているようです。 $commentをダイレクトに渡すことは可能でしょうか? //コメント表示処理 function display_single_comment($post, $comments) { echo "<p>{$post->post_title}({$post->post_date})</p>"; if (empty($comments)) { echo '<p>コメントなし</p>'; } else { echo '<ol>'; foreach ($comments as $comment) { if (empty($comment->comment_author)) { $comment_author = '匿名'; } else { $comment_author = $comment->comment_author; } echo '<li>'; echo "<article id=\"div-comment-{$comment->comment_ID}\">"; echo "<p>{$comment_author}</p>"; echo "<p>{$comment->comment_content}</p>"; echo "<a class=\"comment-reply-link\" href=\"\" data-commentid=\"{$comment->comment_ID}\" data-postid=\"{$comment->comment_post_ID}\" data-belowelement=\"div-comment-{$comment->comment_ID}\" data-respondelement=\"respond\">返信</a>"; echo '</article>'; echo '</li>'; } echo '</ol>'; } } ※コードを戻したところ$commentで値を確認 object(WP_Comment)#6283 (18) { ["comment_ID"]=> string(2) "61" ["comment_post_ID"]=> string(5) "16336" ["comment_author"]=> string(0) "" ["comment_author_email"]=> string(0) "" ["comment_author_url"]=> string(0) "" ["comment_author_IP"]=> string(15) "126.211.122.174" ["comment_date"]=> string(19) "2022-05-31 13:26:10" ["comment_date_gmt"]=> string(19) "2022-05-31 04:26:10" ["comment_content"]=> string(13) "コメント1" ["comment_karma"]=> string(1) "0" ["comment_approved"]=> string(1) "1" ["comment_agent"]=> string(103) "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36" ["comment_type"]=> string(7) "comment" ["comment_parent"]=> string(1) "0" ["user_id"]=> string(1) "0" ["children":protected]=> NULL ["populated_children":protected]=> bool(false) ["post_fields":protected]=> array(21) { [0]=> string(11) "post_author" [1]=> string(9) "post_date" [2]=> string(13) "post_date_gmt" [3]=> string(12) "post_content" [4]=> string(10) "post_title" [5]=> string(12) "post_excerpt" [6]=> string(11) "post_status" [7]=> string(14) "comment_status" [8]=> string(11) "ping_status" [9]=> string(9) "post_name" [10]=> string(7) "to_ping" [11]=> string(6) "pinged" [12]=> string(13) "post_modified" [13]=> string(17) "post_modified_gmt" [14]=> string(21) "post_content_filtered" [15]=> string(11) "post_parent" [16]=> string(4) "guid" [17]=> string(10) "menu_order" [18]=> string(9) "post_type" [19]=> string(14) "post_mime_type" [20]=> string(13) "comment_count" } }

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.4

【コメント欄 その63】 コメントが表示されなくなったのを解決しないまま、 別の方法でコメントを表示しようとしていますか。 いまさらの確認ですが、 コメントが表示されないのは記事ページ(single.php)ですか。 私の環境では表示されます。 と言っても、 functions.phpとsingle.phpの両方に、 同名のdisplay_single_comment()があるためエラーになります。 処理内容は同じなのでfunctions.phpからは削除しました。 これで表示はできています。 それはそれとして。 SQLの質問に回答しようと思ったのですが、 カテゴリーのSQLをどうにか書きかえられたようで、 それに対して回答しても的を得ないかも知れませんが、 どうにか回答してみます。 ・meta_idは必要なのか? カテゴリーでは必要です。 コメント表示に関しては、いまのところ不要です。 ・comment_idとcomment_IDは同じフィールドとして結び付けられるのか? それが同じものを意図するものであれば結び付けられます。 初めて使うテーブルの構造は確認してください。https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0#.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB:_wp_commentmeta すべて小文字のcomment_idはwp_commentmetaのもので「コメントID」、 一部大文字のcomment_IDはwp_commentsのもので「コメントID」、 WordPressのデータベース構造説明上はどちらも同じものと考えてよさそうなので、 結び付けるものとして使えそうです。 ・WHERE meta.meta_keyにおいて何故meta.meta_keyとdell_okさんが命名したのか? これはカテゴリーでの話ですね。 私が命名したのは「meta」ですね。  INNER JOIN wp_postmeta AS meta テーブルwp_postmetaを別名metaで参照するようにしました。 これは先日説明したとおり省略のためです。 「meta_key」はWordPressのデータベース構造上最初からあるもので、 私が命名したわけではありません。 ちなみに、meta.meta_keyとは、 「テーブル名.カラム名」と言う書き方です。 metaがテーブル名で、meta_keyがカラム名です。 「.」は修飾子と呼ばれるもので、 このテーブル「の」このカラム、と言うような使い方です。 もう一段階あって、「データベース名.テーブル名.カラム名」と書いたりもします。 ※カラム=フィールド ・WHERE~~~= %dで取得したいフィールドはONで選択したものでもいいのか? 質問が理解できません。 一般的には、WHERE句は取得したい条件を記述するところで、 ON句はふたつのテーブルの結び付きを記述するところです。 ON句に書いたフィールドをWHERE句に書くことはありますので、 それでもいい、ことにはなります。 ただし、コメント表示のためのWHERE句は、 記事に紐づくものですので、 「コメントが属する投稿ID」を使うことになります。 WHERE wp_comments.comment_post_ID = %d ここからは、SQLを訂正していきたいと思います。 コメントのいいねはひとまず保留になりましたので、 そのカウントの取得はなしで進めます。 新しいSQLを書いた時は、必ずphpMyAdminで試してください。 と言うか、まず、phpMyAdminで書いて実行して、 必要な結果が得られたらそれをコードに持ってくるようにしてください。 コメントはテーブルwp_commentsです。 まずは全件取得してみましょう。 ---- SELECT * FROM wp_comments ---- 取得結果からcomment_post_IDをひとつ覚えてください。 comment_post_IDが同じものが複数あるものがいいです。 それを条件に指定します。 ---- SELECT * FROM wp_comments WHERE comment_post_ID = 覚えたcomment_post_ID ---- その記事のコメントだけが取得できたかと思います。 表示対象のコメントはこれだけで取得できます。 他にJOINするテーブルはありません。 表示する項目がそろっているかを確認しましょう。 もともとコメントの取得はget_comments()でやっていました。 この戻り値は、WP_Commentオブジェクトの配列となっています。 https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_comments 先ほどSQLで取得したコメントはテーブルwp_commentsです。 データベース構造で確認していただいたwp_commentsの項目と、 WP_Commentオブジェクトの項目は同じだと思います。 記事の取得では、 SQLで取得するwp_posts.*の項目が、 get_post()で取得するWP_Postオブジェクトの項目と同じだったので、 そのままWP_Postオブジェクトのような感じで使いました。 コメントも同様に使えそうです。 PHPでのSQLはこうなります。 コメントの投稿日時の逆順に取得しましょうか。 ---- SELECT * FROM wp_comments WHERE comment_post_ID = %d ORDER BY comment_date DESC ----

php_learn
質問者

補足

Q.コメントが表示されなくなったのを解決しないまま、 別の方法でコメントを表示しようとしていますか。 A.回答ありがとうございます。$comment->comment_IDでコメントの表示処理はすでにsingle.phpにあるため取得できない原因がわかりませんでした。 そこでデータベース(SQL)から直接引っ張ることを考えています。 コメントが表示されないのは記事ページ(single.php)です。 display_single_comment()はsingle.phpにのみ書かれていますので、不思議です… コメントIDは同じものとして考えておきます。ありがとうございます。 INNER JOIN wp_postmeta AS metaを見落としておりました、略称ということですね。 いきなりmetaと出てきたように見えたので違和感がありました。 テーブル名.カラム名覚えておきます。説明ありがとうございます。 ____________________________________________________________________________ Q.・WHERE~~~= %dで取得したいフィールドはONで選択したものでもいいのか? 質問が理解できません。 A.参考のcategory.phpのコードになるのですが、WHERE wp_term_taxonomy.term_id = %d となっておりまして、 term_idというカラムを選択する基準が分からなかったため、categoryに関係するテーブルでONに選択されていないものが当てはまるのではないかと考えておりました。 全然関係ないのですね。 新しいSQLは試してから考えるように致します。 確認してみたところ表示することができました。category.phpみたいに複数のテーブルをJOINする必要はないんですね。 コメントを取得する際はIDを結びつける必要はないのですね… category.phpのSQLでON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_idとテーブルカラムを結び付けたことに疑問があるのですが meta_keyを使用するために結び付けたという解釈で問題ないでしょうか? ---- $sql = " SELECT post.* FROM wp_posts AS post INNER JOIN wp_term_relationships ON post.id = wp_term_relationships.object_id INNER JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE wp_term_taxonomy.term_id = %d AND post.post_type = 'post' AND post.post_status = 'publish' AND meta.meta_key = %s ORDER BY post.post_date DESC LIMIT %d,%d "; ---- ※下記は新たな質問になります。 __________________________________________ 過去にコメントが表示されていたときのコードと現在のコードを比較してみたときに1点だけ追加されているコードを見つけたのですが、 display_single_commentが機能していないようです。 $args移行を入れ替えてもコメント送信した内容が表示されているため、他のファイルに問題があることはなさそうです。 display_single_commentというのがよくわからないのですが、関数になるのでしょうか? /* コメントオブジェクトの取得 */ $args = [ 'author__not_in' => '1', /* 管理者を除く */ 'status' => 'approve', /* 承認済み */ 'type' => 'comment', /* コメント */ 'orderby' => '',/* 順番 */ ]; ※表示されていない方が現在のコードになります。表示されている方が旧コードになります。 https://wandbox.org/permlink/pfFp68HNVxJnTpES /* コメントの表示 */ if (3 === $tn) { display_single_comment($post_red, $comments_red); display_single_comment($post_blue, $comments_blue); display_single_comment($post_green, $comments_green); } elseif (2 === $tn) { display_single_comment($post_white, $comments_white); display_single_comment($post_black, $comments_black); } else { display_single_comment($post_single, $comments_single); }

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.3

【コメント欄 その62】 ・コメントを送信しても表示されないようです。 コメントの承認が、手動か自動か覚えていませんが、承認されていないのではないでしょうか。 ・返信ボタンを押したときにURLに下記コードが追加されております。 comment-page-1/#comment- おそらくですが。 これは送信したコメント表示域まで移動(スクロール)するためのもののようです。 コメント投稿直後は送信内容を確認できるようにするためだと思われます。 但し、これはあくまで送信内容であって、コメントデータではない(データベースから取得していない)と思います。 なぜなら承認されていなくても表示されるからです。 そのままそのURLで再描画すると、そのコメントは消えます。 もしコメントデータだとすると、承認されていなくても1回だけ表示できるようにしているのかも知れません。 上記のことは標準のテーマで確認できます。 なにかおかしいと思ったら、標準のテーマで試してみてくださいね。 標準ではこうなる、と言うのがわかってから、自作テーマでの、違いを見つけて、違うことをするとか、同じことをするとか、を考える必要がある場合があります。 質問者さまのテーマでは、この「送信内容を表示する」処理がありません。 必要なら追加することになります。 その場合は、送信内容を表示するか、コメントデータを取得して表示するか、になると思います。 送信内容つまり$_POSTの内容を取得する方法か、「#comment-」の後ろがコメントIDだと思いますので、これでデータベースから取得する方法です。 「#comment-」以外にも簡単にコメントIDがわかるかも知れません。 いずれにしてもコメントの送信先であるwp-comments-post.phpから調べる必要があるような気がします。

php_learn
質問者

お礼

SQLの理解がまだ浅いためcategory.phpを参考に自分なりに考えながらコードを書いてみたのですがどうでしょうか? 質問がいくつかありまして、アドバイスお願い致します。 1,meta_idは必要なのか? 2,comment_idとcomment_IDは同じフィールドとして結び付けられるのか? 3,WHERE meta.meta_keyにおいて何故meta.meta_keyとdell_okさんが命名したのか? 4,WHERE~~~= %dで取得したいフィールドはONで選択したものでもいいのか? ※参考コードをもとに作成したもの $sql = " SELECT comment.* FROM wp_commentmeta AS commentmeta INNER JOIN wp_comments ON comment.id = wp_comments.comment_post_ID INNER JOIN wp_commentmeta(commentmeta) ON wp_commentmeta(commentmeta).comment_id = wp_comments.comment_ID ON comment.id = meta_id WHERE wp_commentmeta(commentmeta).comment_id = %d AND comment.post_type = 'post' AND comment.post_status = 'publish' AND meta.meta_key = %s ORDER BY comment.post_date DESC LIMIT %d,%d ※参考コード $sql = " SELECT post.* FROM wp_posts AS post INNER JOIN wp_term_relationships ON post.id = wp_term_relationships.object_id INNER JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE wp_term_taxonomy.term_id = %d AND post.post_type = 'post' AND post.post_status = 'publish' AND meta.meta_key = %s ORDER BY post.post_date DESC LIMIT %d,%d

php_learn
質問者

補足

【コメント欄 その62】 Q.コメントの承認が、手動か自動か覚えていませんが、承認されていないのではないでしょうか。 質問者さまのテーマでは、この「送信内容を表示する」処理がありません。 必要なら追加することになります。 いずれにしてもコメントの送信先であるwp-comments-post.phpから調べる必要があるような気がします。 A.回答ありがとうございます。コメントは自動承認にしているためその可能性はなさそうです。 なるほど深層階層ファイルから元の原因をたどるのですね、データベースからたどる必要性があるのか考えてみたのですが、カスタムフィールドの兼ね合いから $argsを使うことになることが予想されますので、データベースから取得するしかなさそうですね。 一時的に表示されているコードを見てみたのですが、$comment->comment_IDで取得されていました。 以前dell_okさんが赤、青、緑の順番でコメントを表示テストされて作成されていたことがあったと思います。 その際はコメントの投稿も返信も成功していたと思うのですが、今は表示できていません。 SQLでコメントを取得するコードを考えてみます。 //コメント表示処理 function display_single_comment($post, $comments) { echo "<p>{$post->post_title}({$post->post_date})</p>"; if (empty($comments)) { echo '<p>コメントなし</p>'; } else { echo '<ol>'; foreach ($comments as $comment) { if (empty($comment->comment_author)) { $comment_author = '匿名'; } else { $comment_author = $comment->comment_author; } echo '<li>'; echo "<article id=\"div-comment-{$comment->comment_ID}\">"; echo "<p>{$comment_author}</p>"; echo "<p>{$comment->comment_content}</p>"; echo "<a class=\"comment-reply-link\" href=\"\" data-commentid=\"{$comment->comment_ID}\" data-postid=\"{$comment->comment_post_ID}\" data-belowelement=\"div-comment-{$comment->comment_ID}\" data-respondelement=\"respond\">返信</a>"; echo '</article>'; echo '</li>'; } echo '</ol>'; } } ※過去にコメントフォームを1から作成したときの質問 https://okwave.jp/qa/q10006002_7.html#answers

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

・プラグインを導入してみたのですが、コメントの横にボタンが出現しなかったためどうしようかと考えておりました。 プラグインを試すときは、WordPress提供のテーマなどでやってみてくださいね。 質問者さまの場合は完全自作で、テンプレートタグをあまり使っていないため、プラグインがすぐに使えない場合が多いと思います。 自作するにしても、テンプレートタグ経由にするのが本来なのかも知れません。 私がWordPressに詳しくないため、その辺がうまくできていないのだと思います。

php_learn
質問者

お礼

wp-comments-post.phpは下記のようなコードが書かれております。 https://wandbox.org/permlink/KN88CDabtiZtsf5n

php_learn
質問者

補足

回答ありがとうございます。 テーマを通すと出現するのですが、自作テーマでは実装できそうになさそうでした。 いいねボタンは実装せずに進めていこうと思います。 コメント欄を触ってみて気が付いたのですが、送信と返信に問題が生じておりました… コメントを送信しても表示されないようです。 カスタムフィールドは修正したのですが、コメントの順番にも修正が必要なのでしょうか? 返信ボタンを押したときにURLに下記コードが追加されております。 comment-page-1/#comment- ※該当コード https://wandbox.org/permlink/zchjsYcQMtZMR2GD ※該当URL http://www.last.cfbx.jp/2022/06/09/%e6%8a%95%e7%a8%bf%e3%83%86%e3%82%b9%e3%83%8810/comment-page-1/#comment-81

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.1

【コメント いいね その1】 ・いいねボタンをプラグインで探してみたのですが、コメント1つ1つにハートマークを設置できるものがないため、自作で考えてみます。 プラグイン「WP ULike」でいいと思いますよ。 画像は気に入ったものをアップロードできます。 コメントひとつひとつに設置できます。 どのような動作をするかは、 テーマ「Twenty Twenty-Two」などで試してみてください。 あとはそれを自分のテーマで表示すればいいので、 その方法と言うか書き方さえわかればすみます。 テンプレートかタグで簡単にできそうな気がするのですが、 まだそこまでは調べていません。 自作されるのはかまいませんが、 2度押しできなくするとか、 submitしない非同期の処理は大変です。 PHPとJavaScriptの両方で処理が必要です。 私はJavaScriptに詳しくないので、ゼロから作れません。 参考サイトを見ましたが、 どのような処理をしているのか、 そのJavaScriptのソースコードを読んでみないとわかりません。 それがわかったとしても、 PHP側の処理は見れないので、想像で作るしかありません。 いきなり実装されているようですが、 どのような仕組みで実現できるかがわかっていますか。

php_learn
質問者

補足

回答ありがとうございます。 確かにdell_okさんのおっしゃる通りですね… なんでも自作してみてダメだったらプラグインにしようかと考えていたのですが、2重クリック防止にajaxが必要だったのを忘れておりました。 プラグインを導入してみたのですが、コメントの横にボタンが出現しなかったためどうしようかと考えておりました。 詳しく設定等はみていませんでしたので、他の方のサイトを参考にプラグインでの実装を考えてみます。