• ベストアンサー
※ 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.18

画像を添付し忘れました。

php_learn
質問者

お礼

別途dell_okさんに実装を試していただきたいことがあるのですが、Font Awesomeだけではアイコンフォントの種類が足りずfontelloを以前から使用しています。 返信ボタンにも活用しようとしたのですが、以前から設置済みのファイルに追加できない状態です。 jsonファイルを保持していた場合は可能だったようですが、設置当初のファイルから削除してしまい新たに返信アイコンを含めた4種類のアイコンをダウンロードして、以前と同じ?方法で追加しようと考えたのですがうまくいきません。 実装手順をお伝えするので、確認いただけると助かります。 1,※fontelloのサイト https://fontello.com/ fontelloのサイトから、アイコンをダウンロードします。licence:SILは無料で使用できますのでそちらから選択してください。 アイコンの上に4つタブがありますので、Customize Codesからcssで表示するときのコードを変更しています。Customize Namesはデフォルトのままです。 文字の大きさは16pxでfont nameはfontelloにしています。こちらはダウンロード後のzipフォルダ内のファイルの中の名前になります。 ※参考画像 https://imgur.com/PQpodH0.jpg https://imgur.com/pK8UGoh.jpg https://imgur.com/2F9pQCJ.jpg https://imgur.com/A8uvZZP.jpg ※参考サイト https://1010uzu.com/blog/wordpress-social-button-fontello-web-font 2,ダウンロードしたzipフォルダを解凍して、中のcssとfontファイルをテーマフォルダの真下(他のファイルと同階層)に設置します。 cssとfontファイルはfunctions.phpで読み込む必要があるためfontello-iconと名付けたcssファイルを用意してその中に入れました。 階層を確認しますと下記のようになっております。sample_themeはオリジナルテーマフォルダです。 public_html/wp-content/themes/sample_theme/fontello-icon/cssまたはfont 他のファイルは必要ないので削除しても大丈夫です。 jsonファイルはフォントを追加するときに使うようなのでとっておいた方がいいかもしれません。 ※参考画像 https://imgur.com/BUg9ajt.jpg 3,functions.phpに先ほどのファイルを読み込むためのコードを設置します。 fontello.cssというのが気になると思うのですが、こちらはダウンロード前に名付けたfont nameが元となっております。 解凍後に取り出したcssとfontファイルからcssファイルの中身を見るとfontello.cssが存在しているはずです。 function add_stylesheet() { register_stylesheet(); wp_enqueue_style('reset', '', array(), '1.0', false); wp_enqueue_style('style', '', array(), '1.0', false); wp_enqueue_style('base', '', array(), '1.0', false); wp_enqueue_style( 'fontello', get_template_directory_uri() . '/fontello-icon/css/fontello.css', 'css-style', '1.0' ); } add_action('wp_enqueue_scripts', 'add_stylesheet'); 4,cssでの実装。5つほどダウンロードしているのですが、それぞれ返信、カテゴリーランキング、アーカイブでの使用になります。 display.php137行目の$out = '<ul class="category-ranking clearfix">';でカテゴリーアイコン ※左上カテゴリーランキング https://imgur.com/XVtHntN.jpg display.php192行目の $out = '<ul class="archive-list">';でアーカイブアイコン ※左サイドバーアーカイブ https://imgur.com/oVBCSbN.jpg https://imgur.com/oTsLz4e.jpg single.phpの236行目コードが長すぎるため割愛させていただきます。(返信ボタンの部分になります。) ※新しくアーカイブのアイコンの追加予定ですが失敗していて表示されていません。 ※該当ファイル https://wandbox.org/permlink/OYvF8BM0p9kpo3qe cssについてですが前提条件があります。 まずカテゴリーからになるのですが、font-family: 'fontello';とfontの指定が必要です。 content: "\e816";でダウンローの際に指定したCustomize Codes(コード番号)を使用します。 //カテゴリーランキング .cat-genre-wrap:before { font-family: 'fontello'; content: "\e816"; font-size: 12px; } //アーカイブ閉じる ul.archive-list > li:not(.acv_open)::before { font-family: 'fontello'; content: '\e814'; margin-right: 0.5em; font-size: 18px; } //アーカイブ開く ul.archive-list > li.acv_open::before { font-family: 'fontello'; content: '\e815'; margin-right: 0.5em; } アーカイブのリストにつきましては何故かcssがなく読みこまれていました。 恐らくhtml側で指定しているようです。 //返信ボタン .comment-reply-link::before { font-family: 'fontello'; content: '\'; font-size: 12px; } 返信ボタンは新たに追加したいのですが、うまくいっていないためcontent: '\';は空にしています。 ここまで長文の説明になってしまい申し訳ありません。 以前はこちらの方法で読み込めていたのですが、突然読み込めなくなってしまいました。 ファイル構成はstyle.cssがなくなっていたくらいで他は変わらない状態です。 可能であればdell_okさんにも確かめていただきたくよろしくお願いいたします。

php_learn
質問者

補足

回答ありがとうございます。昨日の朝になんとか適応できました。伝えそびれてしまい、申し訳ありません。 Font Awesomeを表示するようにするための方法が2つありまして、 1,html classからfa-の部分を消す 2,cssにfont-family: "Font Awesome 5 Free";を追加する cssに追加する方を選択いたしました。fa-の部分を削除する方法ですと、各部分ごとにcssでFont Awesomeを実装するコードを設置する必要があるためです。 現在はfa-fwという共通のclassを設定しています。<span class="fa-comment fa-fw"></span> これにより一括でcss指定することが可能です。 .comment-reply-link::before { font-family: 'fontello'; content: '\e816'; font-size: 12px; }

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

【コメント欄 その76】 ・beforeでFont Awesomeを読み込むコードを実装していないのにアイコンの空マークが表示されてしまいます。 私の方から質問者さまのサイトを見ると、 添付画像のように時計のやフォルダのアイコンが表示されています。 ここが空マークになっていると言うことですね。 開発ツールを使ってスタイルシートの確認ができます。 F12キーを押して開発ツールを表示してください。 添付画像で順をおって説明します。 赤丸枠のアイコンをクリックします。 アイコンの色が灰色から水色になります。 その状態で、ブラウザの表示内容にマウスカーソルをあてると、 その動作に追従してElementsタブのHTML要素が展開されます。 調べたい箇所にあててください。 まずは日時のアイコン(オレンジ丸枠)にあててみてください。 クラス名や::Beforeなど現在の状態が確認できます(緑枠)。 そのまま日時のアイコンをクリックすると、 HTML要素が展開された状態に固定され、 Stylesタブにスタイルシートが表示されます。(水色枠) ElementタブやStylesタブは、 ブラウザの表示領域によって配置が変動しますので、 いい感じで左右や上下の範囲を調整してください。 Stylesタブですが、 添付画像のものでは三段にわかれています。 上の段ほど優先順位が高いです。 つまり、同じクラスがあった場合は、 上の段が優先されてブラウザ表示に反映されています。 もし上書きされているスタイルがあった場合は、 二段目のcontentのように取り消し線が入っています。 例え同じ値で上書きされていても、 最後に反映されたものが上段にあれば、 この段(all.css)のスタイルではありませんよ、 と言うことを示しています。 実は、私のローカル環境でもアイコンが□(空アイコン?)になっています。 use.fontawesome.comからスタイルシートやJavaScriptもしくは画像が、 きちんと読み込めていないのかも知れませんね。

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

【コメント欄 その75】 ・返信ボタンを→を押したときに開くようにしたいのですが、どのようにすればいいのでしょうか? アンカータグの子要素にしてみてください。 「返信」の後ろに追加してみました。 「返信」が不要でしたら削除してください。 ---- 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\">返信<i class=\"fa-solid fa-turn-down-right\"></i></a>"; ----

php_learn
質問者

補足

回答ありがとうございます。表示に成功いたしました。 ホーム画面の日付け、カテゴリー、コメント数のアイコンでどうしても解決できない問題があります。 beforeでFont Awesomeを読み込むコードを実装していないのにアイコンの空マークが表示されてしまいます。cssでの記述を確認してもそのような個所はなく自力で探すことができませんでした。 またコメント数の取得にも失敗しているようです… 該当のcssなどを探す方法などdell_okさんが知っておられることはありますでしょうか? ※該当コード https://wandbox.org/permlink/4PfAc7DlICvrwc8Q

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

【コメント欄 その74】 ・返信ボタンがURLになっている スタイルシートでボタンのように見せているかも知れませんが、 返信ボタンはアンカータグです。 アンカータグ、つまり、リンクですので、 URLと言うのがリンクのことを示しているのでしたらそうです。 普通にクリックすれば、そのURLに遷移します。 コメントフォームが展開されないと言うことは、 JavaScriptが読み込まれていないか、 エラーになっていると考えられます。 ・Javascriptの読み込みに失敗している(comment-reply.min.jsをファイルに配置する必要がある?) どうもそのようですね。 ブラウザでF12キーを押すと、 開発ツール(DevTools)が表示されると思います。 そのどこかに赤丸の×が表示されると思いますので、 それをクリックしてみてください。 コンソール(Console)が表示されて、 エラーメッセージが確認できると思います。 該当URLにアクセスすると以下のメッセージがありました。 ~~~~ Failed to load resource: the server responded with a status of 404 (Not Found) comment-reply.min.js:1 ~~~~ 「見つからなかった」と言うようなメッセージなので、 「comment-reply.min.js」が見つからなかったのかなと思われます。 ・コード修正の過程でJavascriptに対応できないコード部分が発生した ここはまだなんとも言えません。 JavaScriptが読み込めるようになってから、 どうかなと言ったところですね。

php_learn
質問者

お礼

<script type="text/javascript" src='<?php bloginfo('url'); ?>/wp-includes/js/comment-reply.js'></script> 読み込みコードはこちらに変更いたしました。

php_learn
質問者

補足

アドバイスありがとうございます。コンソールを確認してみたところエラーを確認することができました。 Javascriptの読み込みコードを修正したところ、適切に動作致しました。 返信ボタンを→を押したときに開くようにしたいのですが、どのようにすればいいのでしょうか? 調べてみたのですがJavascriptでの実装方法ばかりでCSS?で分かりませんでした… アドバイスお願い致します。 ※矢印に使いたいコード <i class="fa-solid fa-turn-down-right"></i> //コメント表示処理 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>'; } }

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

【コメント欄 その73】 承認済みで登録されていて、 いつまでも表示されないとなるとなぞですね。 記事ページをコメントをメインにした簡易コードにしてみました。 これで表示されるか確認してみてください。 ----single.php <?php echo "<p>{$post->post_title}</p>"; $args = ['post_id' => $post->ID]; $comments = get_comments($args); echo '<ol>'; foreach ($comments as $comment) { echo '<li>'; echo "<p>{$comment->comment_author}</p>"; echo "<p>{$comment->comment_date}</p>"; echo "<p>{$comment->comment_content}</p>"; echo '</li>'; } echo '</ol>'; comment_form(); ---- もしこれで表示されたら、 あやしいのは、管理者を除く、です。 質問者さまが管理者として投稿されているものが、 表示されていないのではないでしょうか。

php_learn
質問者

お礼

送信が機能しないのは勘違いでした、申し訳ありません。 返信ボタンについても分からないことがあります… 以前のようにJavascriptを読み込ませているのですが、クリックする際にURLが切り変わるだけで返信することができません。 下記のコードをsingle.phpの先頭に戻してみたのですが、 効果はなさそうです… 2022/05/30日に投稿された記事のコメントの返信ボタンをクリックするとすべて同じURLに飛ばされています。 原因を考えてみたのですが、いずれかに該当しますでしょうか? 1,返信ボタンがURLになっている 2,Javascriptの読み込みに失敗している(comment-reply.min.jsをファイルに配置する必要がある?) 3,コード修正の過程でJavascriptに対応できないコード部分が発生した ※該当URL http://www.last.cfbx.jp/2022/05/30/%e6%8a%95%e7%a8%bf%e3%83%86%e3%82%b9%e3%83%883/comment-page-1/ ※該当コード <script type='text/javascript' src='http://www.last.cfbx.jp/wordpress/wp-includes/js/comment-reply.min.js?ver=5.9.3' id='comment-reply-js'></script> ※過去の質問からJavascriptのコードを戻しました。 https://okwave.jp/qa/q10006002_7.html#answers

php_learn
質問者

補足

修正ありがとうございます。 dell_okさんのコードを試してみたところ表示されました。 PCのキャッシュを削除してコメントを確認していたのですが、その場合表示されずスマホでコメントしてみたところ表示されました。 再度確認してみます。

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

【コメント欄 その72】 送信したものが表示されない、についてですが、 送信したコメントが承認済みで登録されているのかを、 管理者画面で確認できますか。 以前に送信した内容は表示されている、とのことでしたし、 送信直後は表示されなくても、 一旦一覧ページに戻って、 改めて記事ページに行くと表示されるような気がします。 問題点をはっきりしたいので聞いています。 コメントが登録されていないのか、 送信直後は表示されないがその後は表示されるのか、 いつまでたっても表示されないのか、です。

php_learn
質問者

補足

回答ありがとうございます。承認済みで登録されているようです。 キャッシュを削除して一覧ページに戻った後に記事ページに戻ってみましたが、表示されていません。 いつまでたっても表示されない状態です。

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

【コメント欄 その71】 ・送信フォームは下記コードになると思うのですが、SQLに渡す関数が分かりません。submitに変更するべきでしょうか? そのコードは返信用のものですね。 リンクをクリックすると返信用のフォームが展開するようにしていたと思います。 一緒に数行のJavaScriptが必要だったはずです。 送信フォームはcomment_form()で表示されていると思います。

php_learn
質問者

補足

回答ありがとうございます。開閉式の返信フォームだったのを忘れておりました。 Javascriptの読み込みも消えていましたので元に戻しておきます。 送信フォームはcomment_form()でしたか、もう少し長いコードかと勘違いしておりました。

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

訂正します。 ~~~~ 「$comments_red」と「$comments_blue」の部分が違うだけで、 他はまったく同じです。 ~~~~ 「$post_red」と「$post_blue」も違います。 これはまた話すことになるかも知れませんが、 いまは考えないでください。

php_learn
質問者

補足

了解いたしました。今は考えないようにしておきます。

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

【コメント欄 その70】 ・旧コードですとforeach ($comments_red as $comment) { となっていて、$comments_redの部分が変わっているためこの部分が原因ではないかと考えておりました。 なるほど。 「$comments_red」が「$comments」に変わっている、 と言いたかったのですね。 「$comments」はdisplay_single_comment()の第二引数です。 私の説明で意味がわからな言葉があれば聞いてくださいね。 聞かれなかった場合は、理解していただいたと思っていますので、 後になって話しが通じてないことがわかると、それまでが無駄に思えてしまいます。 どこから説明したらいいのか。 第二引数は、二番目の引数です。 引数は、関数側と、関数を呼ぶ側(以下、呼ぶ側)で、値をやりとりするものです。 新コードで呼ぶ側を見てみましょう。 二番目の引数が「$comments_red」です。 ---- display_single_comment($post_red, $comments_red); ---- 関数側は、二番目の引数に「$comments」があります。 ---- function display_single_comment($post, $comments) ---- これらは、変数の名前は違いますが、 「二番目の引数」と言う約束ごとで、 同じものとして値をやりとりしています。 つまり、呼ぶ側が「$comments_red」であっても、 関数側では「$comments」で処理すると言うことです。 呼ぶ側には「$comments_blue」など他のものがいくつもありますが、 それがなんであっても、関数側では「$comments」で処理します。 関数側に「$comments_red」や「$comments_blue」のすべてを記述していたら、 関数にまとめた意味がありません。 なぜ関数にまとめたのか、当時の説明は覚えていませんが、 旧コードの「$comments_red」と「$comments_blue」の表示処理を比べてみてください。 ----「$comments_red」 echo "<p>{$post_red->post_title}({$post_red->post_date})</p>"; if (empty($comments_red)) { echo '<p>コメントなし</p>'; } else { echo '<ol>'; foreach ($comments_red 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>'; } ----「$comments_blue」 echo "<p>{$post_blue->post_title}({$post_blue->post_date})</p>"; if (empty($comments_blue)) { echo '<p>コメントなし</p>'; } else { echo '<ol>'; foreach ($comments_blue 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>'; } ---- 「$comments_red」と「$comments_blue」の部分が違うだけで、 他はまったく同じです。 まったく同じ処理がみっつもあったので、ひとつの関数にまとめたのです。 関数側では「$comments」の名前で処理するよう命名しました。 変数の名前はなんでもかまいません。 PHPに「コメントは$commentsしろ」と言うような規則はないので、 「$a」でもかまいません(※)。 ですが「$a」とした場合、その関数だけをあとから見ると、 「$aってなに?」って思ってしまいます。 覚えていれば、それはコメントの配列だ、ぐらいのことで、 覚えていなければ、呼ぶ側を探して、何を渡しているのか調べる必要があります。 でも「$comments」ならそんなことを覚えたり調べたりしなくても、 コメントの複数形だ、コメントの配列だろうな、と想像できます。 PHPに規則はなくても、 コーディングする自分で命名の規則を決めておくといいです。 いろんなサイトからコードをコピーしていると、 そのようなことには気を使わないかも知れませんが、 自分で考えながら全部コーディングするようになってくると、 そのようなことが大事になってくると思います。 複数人でプログラム開発するチームでは、 たいてい命名規則が決められています。 個人で開発するにしても、 その時その時ででたらめに命名するより、 自分なりの命名規則をもっておいた方がいいと思います。 ただ、いろんなサイトからコピーしてくると、 みんなばらばらの命名規則だったりするので、 どうしても統一できない場合があります。 それをわざわざ名前を変更するとエラーになる恐れがあるので、 そのまま使うのが無難です。 ついでに言うと、 関数側が「$comments_red」でもかまいません(※)。 (※)かまいません、と言うのは、 それが直接の理由でエラーにはならない、と言うだけのことです。 人間が見てどう思うかと言うのは別の話しです。 もし「$comments_red」としていたら、 それこそ、新旧まったく同じコードになるので、 比較しても違いはなく、同じ動作をする、と思えるかも知れません。 ですが、呼ぶ側が「$comments_blue」で呼んでいる場合でも、 「$comments_red」の名前で処理しているコードを見ると、 これは「赤」の処理なのかと思ってしまいそうです。 ひとつの関数にまとめたのは「赤」でも「青」でも同じ処理をするからで、 つまり関数側では「赤」とか「青」とかはどうでもよくて、 「コメントたち」を決まり切った処理で任せるためのものなのです。 それならば「$comments」がふさわしい名前になるでしょう、と言うことです。 長々と質問と関係ない話しになってしまってすみません。 コードを比較して見た目の違いを見てもわからないことがあったりしますので、 その違いがどのように影響しているのか、を考えるヒントとして、 説明させていただきました。

php_learn
質問者

補足

Q.つまり、呼ぶ側が「$comments_red」であっても、 関数側では「$comments」で処理すると言うことです。 関数側では「$comments」の名前で処理するよう命名しました。 変数の名前はなんでもかまいません。 A.解説ありがとうございます。もう少しコードを引用してどの箇所かわかりやすいように説明するべきでした, 申し訳ありません。 なるほど別の関数だと考えていたのですが同じものなんですね… 命名についても覚えておきます。

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

【コメント欄 その69】 ・送信した内容が表示されないため $commentsが空になっているのではないかと推測しました。 どこの$commentsかわかりませんが、 $commentsが登場するのはdisplay_single_comment()の引数からです。 $comments配列から一要素ずつ$commentにとりだすforeach(){}の中では、 $commentが確認できたとのことだったと思いますが、 $commentが空でなければ、$commentsも空ではありません。 空になっているのはどこの$commentsでしょうか。 送信した内容は表示されないとして、 以前からあるコメントは表示されていますか。 だとしたら、送信(submit)した内容を表示する処理がないからだと思います。 旧コードにもその処理はありませんし、 コメントテーブルから取得した内容を表示しているだけなのですが、 新コードも同じ処理なのでそこに違いはないような気がします。 先日配列をまとめるコードを追加されていましたが、 2パターンともエラーになっていると思われるので、 ひとまずなくしておいてください。 ・今は送信した内容が表示されていないためコードの違いを比較したときに$comments->commentの部分が異なるため $commentsに各フィールドごとの記事が入っていないのではないかと考えています。 旧コードにも新コードにも「$comments->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); } ---- 画像1、画像2、画像3それぞれには対応していますが、 期待通りの動作になるまでは、まず画像1だけで確認してください。

php_learn
質問者

お礼

送信フォームは下記コードになると思うのですが、SQLに渡す関数が分かりません。submitに変更するべきでしょうか? ※送信フォーム 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>"; //コメント表示処理(該当箇所) 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>'; } } ?>

php_learn
質問者

補足

Q.空になっているのはどこの$commentsでしょうか。 以前からあるコメントは表示されていますか。 (submit)した内容を表示する処理がないからだと思います。 A.空ではなかったのですが、function display_single_comment($post, $comments){}内の foreach ($comments as $comment)が旧コードと違うため$commentsに値が入っていないのではないかと考えておりました。 以前に送信した内容は表示されております。 検索ボタンのようなコードが必要なんですね?だとすると旧コードで何故コメントが表示されたのか些か疑問です。 dumpは試していて、中の値は確認済みなのですが以前は表示されていたものが表示されなくなった原因がコードの違いだと思っていましたので、 submitした内容を表示する処理が必要だとは考えてもいませんでした。 旧コードですとforeach ($comments_red as $comment) { となっていて、$comments_redの部分が変わっているためこの部分が原因ではないかと考えておりました。 /* コメントの表示 */ echo "<p>{$post_red->post_title}({$post_red->post_date})</p>"; if (empty($comments_red)) { echo '<p>コメントなし</p>'; } else { echo '<ol>'; foreach ($comments_red 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>'; }