• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コメント欄を出力した後に返信機能を追加したい)

コメント欄への返信機能の追加方法とは?

このQ&Aのポイント
  • コメント欄に追加するためには、カスタムフィールド名を使用することができます。
  • 追加したい記事を振り分けるために、$post_idsという変数を使用します。
  • コメントの取得にはget_comments関数を使用し、コメントがない場合には'コメントなし'と表示します。

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

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

訂正 誤 LIKE 'あ' 正 LIKE '%あ%'

php_learn
質問者

お礼

すみません、コメントが締め切られてしまったので下記のURLに回答よろしくお願い致します。 https://okwave.jp/qa/q9996599.html

その他の回答 (28)

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.28

・$resultはインジェクション対策で必須なようですが、画像は$resultなしで出力しています。 解説を読んでもいまいち理解ができないのですが、それぞれにインジェクション対策は必要でしょうか? どこの解説を読まれたのかわかりませんが、$resultはインジェクションとはあまり関係ないような気がします。 $wpdb->prepare(SQL文,PHP変数)がインジェクション対策と思ってくださればいいと思います。 このSQL文にはPHP変数を直接記述せず、かわりに%dや%sと記述すること。 そうすることで%dや%sの箇所に、PHP変数をその型に合わせて安全に置きかえてくれる、というものです。 よくない例として、以下のようなSQL文を実行したとします。 $query = "SELECT * FROM {$wpdb->posts} WHERE post_title = '{$search_text}'"; $results = $wpdb->get_results($query); $search_textは利用者が検索文字として入力したものですが、なにか問題のある文字を入力したとします。 そうすると、想定外の情報が表示されたり、データが書き換えられたりすることが考えられます。 どのような文字だとそうなるのかを書くのは控えます。 それを安全にする方法が以下のような記述になります。 $sql = "SELECT * FROM {$wpdb->posts} WHERE post_title = %s"; $query = $wpdb->prepare($sql, $search_text); $results = $wpdb->get_results($query); こうすることで問題のある文字が入力されたとしても、$wpdb->prepare()が安全なSQL文にしてくれます。 もしかするとですが、インジェクション対策として、上記は第一段階で、第二段階として$resultを使うということなのかも知れません。 SQLでいろんな情報を取得して表示するとなにか問題がある(どのような問題があるかは私にはわかりません)。 SQLではIDだけを取得してそのIDに基づいて改めてWordPress関数で情報取得や表示させることで安全になる。 $sql = "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s"; ・カスタムフィールで名で検索項目を絞ることもうまくいっていない状態なので、そちらもアドバイスお願いいたします。 SQL文を調整する必要がありそうです。 SQLの実行結果は必ず確認するようにしてください。 まずは自分で書いたSQL文を実行して結果が正しいことを確認する。 次にPHPで生成したSQL文を確認して、それを実行して結果が正しいことを確認する。 実行と言うのはPHPからではなく、phpMyAdminなどでの実行です。 変数のところは間違いのないように書きかえてから実行してください。 結果が正しくないと、SQL文のどこをどう直したらいいのかもわからないですし、それをPHPで生成させるのはさらにわかりづらくなります。 PHPで生成したSQL文を確認する方法はデバッガを使うのがいいのですが、デバッガの使い方を知らないといけないので、今はやめておきます。 とりあえずPHPでechoしてブラウザで確認してください。 まずはこちらから。 "SELECT DISTINCT post_id FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key= %s IN ('single_rss_feed1') AND post_status = 'publish'" SQL文を確認するとこんな感じになります。 ここでは検索文字を「あ」だったことにします。 SELECT DISTINCT post_id FROM wp_postmeta INNER JOIN wp_posts ON post_id = ID WHERE wp_postmeta.meta_key= 'あ' IN ('single_rss_feed1') AND post_status = 'publish' WHEREの条件として、見慣れない書き方があります。 文法エラーにならないほど巧妙なので、何かしら出てきたらそれが正解だと思うかも知れませんが、IDだけだとわかりづらいので、記事タイトルなどでも表示した方がいいです。 巧妙な部分の説明は割愛します。 直すべきと思うのは、meta_keyの条件で、以下のどちらかになると思います。 WHERE wp_postmeta.meta_key='single_rss_feed1' WHERE wp_postmeta.meta_key IN ('single_rss_feed1') 検索文字を記事タイトルから検索するとしたら、以下のようになります。 AND wp_posts.post_title LIKE 'あ' 本文や抜粋からも検索するとしたら、こんな感じです。 AND (wp_posts.post_content LIKE 'あ' OR wp_posts.post_title LIKE 'あ' OR wp_posts.post_excerpt LIKE 'あ') 全体だとこんな感じです。 SELECT DISTINCT post_id FROM wp_postmeta INNER JOIN wp_posts ON post_id = ID WHERE wp_postmeta.meta_key IN ('single_rss_feed1') AND post_status = 'publish' AND (wp_posts.post_content LIKE 'あ' OR wp_posts.post_title LIKE 'あ' OR wp_posts.post_excerpt LIKE 'あ') これで結果を確認して、大丈夫でしたら、それをPHPのコードに組み込んでください。 %sの数だけ、$wpdb->prepare()のパラメータが必要ですので忘れないようにしてください。 サンプルコードとして記載はしますが、必ず上記のことをSQL実行して確認してください。 このまま貼り付けてなにかあってもSQL文に問題があるのか、PHPコードに問題があるのかわからないので、SQLは確実に問題がないことを確認しておいて欲しいからです。 SQL文の実行を1行の実行命令で書くと見づらいと思いますし、途中経過を確認しづらいので、それぞれ分けています。 $sql = " SELECT DISTINCT post_id FROM {$wpdb->postmeta} INNER JOIN {$wpdb->posts} ON post_id = ID WHERE {$wpdb->postmeta}.meta_key IN ('single_rss_feed1') AND post_status = 'publish' AND ({$wpdb->posts}.post_content LIKE %s OR {$wpdb->posts}.post_title LIKE %s OR {$wpdb->posts}.post_excerpt LIKE %s) "; echo $sql; $query = $wpdb->prepare($sql, "%$search_query%", "%$search_query%", "%$search_query%"); echo $query; $results = $wpdb->get_results($query); 階層すべてのコンテンツを取得し表示するコードについては、改めて回答させてください。

php_learn
質問者

お礼

カスタムフィールドsingle_rss_feedを設定した記事のみ表示されているので問題なく表示されているようです。ありがとうございます。 1点だけお聞きしたいのですが、今回の文はどちらに該当するのでしょうか? phpのコードの中で文字列を組み立てて生成したselect文と、phpmyadminのSQL入力画面で入力するSQL 以下の指摘があり、phpmyadminでは調べたときに多少コードが変わっていたのを思い出しました。 phpで文字を組み立てて生成したselect文の中のphpの変数などをそのまま使うことはできません。 phpの変数の中身を定数で指定するとか、変数にしたいならmysqlのユーザー変数に書き換えて記述する必要があります。

php_learn
質問者

補足

Q.$resultはインジェクションとはあまり関係ないような気がします。 $wpdb->prepare(SQL文,PHP変数)がインジェクション対策と思ってくださればいいと思います。 このSQL文にはPHP変数を直接記述せず、かわりに%dや%sと記述すること。 そうすることで%dや%sの箇所に、PHP変数をその型に合わせて安全に置きかえてくれる、というものです。 A.なるほど理解できました。ありがとうございます。 $resultで各コンテンツのテーブルを開いて、$resultでまとめて出力することでインジェクション対策を行うものだと思っておりました。例文で説明いただき助かりました。 Q.それを安全にする方法が以下のような記述になります。 $sql = "SELECT * FROM {$wpdb->posts} WHERE post_title = %s"; $query = $wpdb->prepare($sql, $search_text); $results = $wpdb->get_results($query); こうすることで問題のある文字が入力されたとしても、$wpdb->prepare()が安全なSQL文にしてくれます。 A.%Sは出力するものだという認識だったのですが、セキュリティ対策だったのですね。 Q.SQL文を調整する必要がありそうです。 実行と言うのはPHPからではなく、phpMyAdminなどでの実行です。 変数のところは間違いのないように書きかえてから実行してください。 とりあえずPHPでechoしてブラウザで確認してください。 SELECT DISTINCT post_id FROM wp_postmeta INNER JOIN wp_posts ON post_id = ID WHERE wp_postmeta.meta_key= 'あ' IN ('single_rss_feed1') AND post_status = 'publish' A.確認してみたところ何も表示されませんでした。meta_key=が正しいですね初めに%Sが検索ワードだと思っていたためカスタムフィールド名の検索 ということでmeta_key=%S IN(カスタムフィールド名)としていました。 Q.直すべきと思うのは、meta_keyの条件で、以下のどちらかになると思います。 WHERE wp_postmeta.meta_key='single_rss_feed1' WHERE wp_postmeta.meta_key IN ('single_rss_feed1') A.<?php $results = $wpdb->get_results($wpdb->prepare(" SELECT DISTINCT post_id FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key='single_rss_feed1' AND post_status = 'publish'", "%%投稿%%")); ?> 上記のように変更したところ表示されました。ありがとうございます。 Q.全体だとこんな感じです。 SELECT DISTINCT post_id FROM wp_postmeta INNER JOIN wp_posts ON post_id = ID WHERE wp_postmeta.meta_key IN ('single_rss_feed1') AND post_status = 'publish' AND (wp_posts.post_content LIKE 'あ' OR wp_posts.post_title LIKE 'あ' OR wp_posts.post_excerpt LIKE 'あ') これで結果を確認して、大丈夫でしたら、それをPHPのコードに組み込んでください。 %sの数だけ、$wpdb->prepare()のパラメータが必要ですので忘れないようにしてください。 サンプルコードとして記載はしますが、必ず上記のことをSQL実行して確認してください。 このまま貼り付けてなにかあってもSQL文に問題があるのか、PHPコードに問題があるのかわからないので、SQLは確実に問題がないことを確認しておいて欲しいからです。 SQL文の実行を1行の実行命令で書くと見づらいと思いますし、途中経過を確認しづらいので、それぞれ分けています。 A.$sqlを試したところエラー文が表示され原因がわかりました。画像では文字が小さかったのでエラー文をコピペしました。 phpで実行したところ問題なく表示されているようですが、なぜかphp my adminではエラーとなっており原因がわかりませんでした。 https://imgur.com/BbUkmqn.jpg ※エラー文 https://imgur.com/fmzLqhN.jpg ※SQL入力コード https://imgur.com/Xh1PI4q.jpg ※サイト表示画面 解析中に 16 個のエラーが見つかりました。 予期しない文字。 (near "{" at position 30) 予期しない文字。 (near "}" at position 46) 予期しない文字。 (near "{" at position 59) 予期しない文字。 (near "}" at position 72) 予期しない文字。 (near "{" at position 97) 予期しない文字。 (near "}" at position 113) 予期しない文字。 (near "{" at position 179) 予期しない文字。 (near "}" at position 192) 予期しない文字。 (near "{" at position 218) 予期しない文字。 (near "}" at position 231) 予期しない文字。 (near "{" at position 255) 予期しない文字。 (near "}" at position 268) 終端クォート " があるべきです。 (near "" at position 447) エイリアスが前に見つかっています。 (near "}" at position 46) 予期しないトークン。 (near "}" at position 46) エイリアスが前に見つかっています。 (near "}" at position 72) SQL クエリ: ドキュメント SELECT DISTINCT post_id FROM {$wpdb->postmeta} INNER JOIN {$wpdb->posts} ON post_id = ID WHERE {$wpdb->postmeta}.meta_key = 'single_rss_feed' AND post_status = 'publish' AND ({$wpdb->posts}.post_content LIKE %s OR {$wpdb->posts}.post_title LIKE %s OR {$wpdb->posts}.post_excerpt LIKE %s) "; echo $sql; $query = $wpdb->prepare($sql,"%$search_query%","%$search_query%","%$search_query%"); echo $query; $results = $wpdb->get_results($query); MySQL のメッセージ: ドキュメント #1064 - SQL構文エラーです。バージョンに対応するマニュアルを参照して正しい構文を確認してください。 : '->postmeta} INNER JOIN {$wpdb->posts} ON post_id = ID WHERE {$wpdb->postmeta...' 付近 2 行目

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.27

検索結果をどのように表示したいかわからなかったので、記事ごとの<ul>で項目ごとの<li>で、タイトルと画像だけ出力してみました。 処理は以前と同じ方法なので、以前と同じような表示にされたかったらそれにならってください。 要点としては、 ※1$result の post_id で記事データを取得 ※2投稿の情報を追加 ---- <?php//検索コンテンツを表示させるコード?> <?php//ここから記事表示?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <?php $item = get_post($result->post_id); // ※1 set_other_data($item); // ※2 echo '<ul>'; echo "<li>$item->post_title</li>"; echo "<li><img src=\"{$item->thumbnail}\"></li>"; echo '</ul>'; ?> <?php endforeach; ?> </ul> <?php else : ?> <p><?php echo esc_html('検索条件にヒットした募集はありませんでした。'); ?></p> <?php endif; ?> ----

php_learn
質問者

お礼

再度コードを修正してみたところ、$wpdb->prepare を使っているのに、%s などの置換する部分の指定がないことがわかりました。 $search_word = '%' ;と追加したのですが表示されないため、カスタムフィールド名の部分をすべての投稿に変えてみましたがうまくいかず、根本の参考にしたコードでもダメでした。 よく考えると、自作テーマと基盤のテーマの検索欄を同じ前提で考えていることが見当違いでした。 Ajaxであってもphpmyadminであってもpdoであっても$wpdbであっても同じ処理をすることが可能であることを再認識できましたので、検索ページの作成は可能なようです。 データベースで作成しているときと同じ手順で$wpdbで再度作成してみます。 アドバイスをいただいたのですが処理の大まかな流れは、下記のようになるようです。 $wpdb->query で実行するSQL文に「入力された値」を使い ●●したいので、$wpdb->prepare でエスケープする phpMyAdmin で実行したSQL文で結果取得できることを確認したら、そのSQL文を$wpdb->query で実行してその結果を表示するようにする。 確認してから、$wpdb->prepare に書き替えてSQL文の一部(入力値で置換する部分)をプレースホルダにしたものを第一引数に、置換したい値(変数)を第二引数にする

php_learn
質問者

補足

ありがとうございます。 現在出力してみたところ、検索条件にヒットした募集はありませんでした。と出ており、カスタムフィールドで絞り込む部分が間違っているのではないかと思っております。 やはり現在の方法では記事の取得はできないのでしょうか…

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.26

・$results を渡すだけでも動的ページの書き換えは不可能という認識でいいでしょうか? はい、その認識でいいと思います。 動的ページはJavaScriptでするのが一般的で、$resultsをどうこうすると言う話しでもなくなります。 見えない裏で、JavaScriptとPHPがひそかにデータをやりとりするので、そこで$resultsを使ってなにか処理することはありますが、そのPHPはsearch.phpやfront-page.phpではなく、別のものとなります。 「$results を渡す」と言われているのは、どこからどこへ渡すのか、私が理解できていません。 ・だとすると$wpdbでfront-page.phpと同じデザインを作るか、データベースで記事を格納して引き出しながら検索機能を実装する事になるのですが、データベースだとこれ以上重くなるのではないか不安です。どちらの方法を取るべきでしょうか? データベースに記事を格納するのは賛成できません。 格納するのは、検索した結果の記事情報ですよね。 それは検索のSELECTで済むこと、済ませることです。 と言うのも、格納する方法では、同時に複数の人が別々の文字列で検索したら、どちらかは間違った結果になってしまいます。 そうならないように工夫はできますが、それ以前に、検索のためのSELECT、格納のためのINSERT、結果表示のためのSELECT、と負荷がかかるばかりで、検索のためのSELECTが結果表示のSELECTでもあるはずなので意味のない処理です。 ・cronで軽くなることを考えると可能だとは思いますが。 検索とcronの関係がわかりません。 検索ページについては、検索文字を入力して、その結果を表示するページのことだと思っていますが、私がなにか誤解していますか。 ・また$wpdbで交互にRSSと記事を表示させることなど可能なのでしょうか? ・もし$wpdbを扱う場合、既存のRSSを使って交互に表示することが可能であるかどうか知りたいです。 これは可能だと思います。 $wpdbの使い方次第だと思います。 ちなみに、RSSのテーブルがWordPressと同じデータベース内にあるようですので、$wpdb->get_results()を使ってRSSを読むこともできます。

php_learn
質問者

お礼

一つ思いついたのはsearch.phpのコードをワード毎に表示するような記事表示方法に切り替えて、検索のリダイレクトページにそちらを指定することです。 そうする事で1部が切り替わってるように見えて、中身を全て切り替えてしまえばユーザーには分からない気がします。 RSSを切り替えたい時にも役立ちますし、何かのコンテンツを増やした時にデザインに差をつけることも出来ます。 RSSもそのまま使うこともできますし、1番有効な方法だと思われます。 ただfront-page.phpに関数を渡して、別のファイルに飛ばすことが出来ることが前提ですが、こちらの方法は可能でしょうか?

php_learn
質問者

補足

アドバイスありがとうございます。 Ajexでタグを作成していますが、とてもじゃないですが今の自分では一部の切り替えを出来る気がしません なので$wpdbを使って何とか検索ページを表示させていきたいのですが、どのように作れば良いのか仕組みがよくわかりません… 検索ページを作る場合、記事に何かしらの関数を渡して帰ってきたもので判断して一致したものを表示させるという形になるのでしょうか?

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.25

・質問なのですが、RSSやほかのコンテンツを維持したままで記事の各コンテンツに$resultを渡すだけで検索ページとして成立させることは可能でしょうか?こちらの方法が可能であれば、タグやアーカイブにも代用が可能だと思われます。 目的物がイメージできませんが、たぶん無理だと思います。 無理と言うのは、「$resultを渡すだけ」のことにならないからです。 されたいことがページのコンテンツの動的書き換えと言うことであれば無理ではないのですが、私が協力できる範囲をこえた技術が必要です。 PHPだけでは解決しないので、「JavaScript Ajax」などで検索されるとどのようなことかがわかると思います。 これができれば、質問者さまが想像されていることができると思います。 $result 改め $results は $wpdb->get_results() で取得したもののことでしょうか。 これはSQLを実行した結果が返ってくるものです。 合体させたコードにはもともとあった SELECT DISTINCT post_id が欠落していますが、これがあったとして、取得しているものは記事IDです。 条件が一致するものが複数あれば、取得する件数は複数になります。 なのでループは必ずどこかにひとつ以上あるべきです。 参考サイトもループして記事を表示していました。 もちろん、複数あったとしても最初の1件しか表示しないのであればループは不要ですが、それは検索機能として不十分なものになると思います。 また SELECT に何を書くかで取得するものが変わってきます。 表示したい項目を可能な限りここに書いておけば、他の関数でわざわざ取得する手間も省けたりします。

php_learn
質問者

お礼

もし$wpdbを扱う場合、既存のRSSを使って交互に表示することが可能であるかどうか知りたいです。 不可能であれば、$wpdbで再びRSSを表示する方法を使って検索ページ、アーカイブ、タグを表示させる予定です。

php_learn
質問者

補足

ありがとうございます。 $results を渡すだけでも動的ページの書き換えは不可能という認識でいいでしょうか? だとすると$wpdbでfront-page.phpと同じデザインを作るか、データベースで記事を格納して引き出しながら検索機能を実装する事になるのですが、データベースだとこれ以上重くなるのではないか不安です。どちらの方法を取るべきでしょうか? cronで軽くなることを考えると可能だとは思いますが。 また$wpdbで交互にRSSと記事を表示させることなど可能なのでしょうか?

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.24

つまずいている点は何でしょうか。 今回のsearch.phpのコードはぱっと見で動きそうにないです。 コメントについて注意があります。 ひとつめ。 ----↓ //サーバーに対して指定したリソースを返すよう要求するファイル ----↑ PHPコメントのように書かれていますが、ここはHTMLとして出力されるテキストだと思われます。 この1行のコメントのためにでもPHPコードにした方がいいと思います。 ----↓ <?php //サーバーに対して指定したリソースを返すよう要求するファイル ?> ----↑ ふたつめ。 ----↓ <-- サイト内検索を行ったときのクエリ文字列を取得します --> ----↑ HTMLコメントのように書かれていますが、開始タグに!がないためテキストとして表示されてしまいます。 直すとしたらこうですが、 ----↓ <!-- サイト内検索を行ったときのクエリ文字列を取得します --> ----↑ これはこれで、ブラウザでソース表示されると見えてしまいます。 ここもPHPコメントにした方がいいと思います。 ----↓ <?php //サイト内検索を行ったときのクエリ文字列を取得します ?> ----↑ みっつめ。 ----↓ $wpdb->get_results($wpdb->prepare(" //不正なSQL文を実行することによりデータベースを不正に操作し攻撃する対策 ----↑ 文字列の生成途中にはコメントを入れることはできません。 SQL文生成の文字列には特に気を付けてください。 SQL実行エラーでSQL文が表示されたり、コメント文が表示されるとセキュリティ以前の問題になります。 もしどうしても書きたいのでしたら、SQLのコメントにしてください。 ----↓ $wpdb->get_results($wpdb->prepare(" /* 不正なSQL文を実行することによりデータベースを不正に操作し攻撃する対策 */ ----↑ SQLに直接関係のない自分用のコメントなので、このようなこともおすすめしません。 このような書き方ができる、程度でとどめて実際はしない方がいいです。 文字列生成の外で、ひとつめのように1行ずつのコメントにするか、以下のようにまとめて書くかです。 ----↓ <?php //不正なSQL文を実行することによりデータベースを不正に操作し攻撃する対策 //SELECT distinctにpost_idを指定することで重複データを除外しています (省略) ?> <?php $results = $wpdb->get_results($wpdb->prepare(" ----↑ SQL文の途中にコメントを書いたり、SQL文を変更された影響だと思いますが、$wpdb->prepare()が完結されていないためにエラーになっていると思います。 目的通りのSQLになっているかどうかはともかく、以下のように ", を追加してエラーにならないようにしてください。 ----↓ AND post_status = 'publish'", ----↑

php_learn
質問者

お礼

RSSの部分を切り分ける場合デザインが崩れるためそのまま表示させる必要があるのですが、$wpdbでfront-page.phpと同じデザインにするのはかなり大変そうです。

php_learn
質問者

補足

//サーバーに対して指定したリソースを返すよう要求するファイル A.上記のものはsearch.php全体の説明ですね。わかりずらく申し訳ないです。 <?php //サイト内検索を行ったときのクエリ文字列を取得します ?> A.勉強になります。ありがとうございます。 <?php //不正なSQL文を実行することによりデータベースを不正に操作し攻撃する対策 //SELECT distinctにpost_idを指定することで重複データを除外しています (省略) ?> <?php $results = $wpdb->get_results($wpdb->prepare(" A.訂正ありがとうございます。 $wpdbで記事を出力していましたが、page-front.phpのような表示をしたい場合、データベースに記事を登録してそこから検索して出力させるほうが簡単な気がします。 アーカイブやタグにも使用する場合DBに格納して表示したほうがいいでしょうか?

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.23

single_rss_feedには重複したデータがすでに登録されているためにユニークにしようとして失敗しているようです。 データをいったんすべて削除してからユニークにしてみてください。

php_learn
質問者

お礼

search.phpとfront-page.phpを単純に合体させると以下のようになりました。 見本のコードを見るとおそらく、各記事のコンテンツに$resultを渡して検索結果を表示させているようです。 質問なのですが、RSSやほかのコンテンツを維持したままで記事の各コンテンツに$resultを渡すだけで検索ページとして成立させることは可能でしょうか?こちらの方法が可能であれば、タグやアーカイブにも代用が可能だと思われます。 $wpdbで記事を取得してRSSと交互に出力する方法もあるかもしれませんが、関数を渡すのみで代用できるのであれば$wpdbを扱う必要がないように思われます。 ループではないようなのでforeachはいらないと思いますので$resultの部分のみ記事の各関数に渡す予定です。 また渡すときは$result->$item->post_dateなどでechoの部分に付け加えればいいのでしょうか? https://wandbox.org/permlink/Q27lR7kUo7gmvdkE

php_learn
質問者

補足

ありがとうございます。表示することができました。 RSSについてなのですが投稿ページを作成してないので取得まで出来ていないようです。 先に検索欄を作成していきたいのですが、つまずいている点がありアドバイスお願いいたします。 元々のコードではセキュリティ対策として検索欄が未入力の際に返すようにしていたのですが、それだけでは不十分な気がしています。 下記サイトを参考に作成しました。ページングについて不安なのですが、作成済みのページナビと関連付けることは可能でしょうか? search.phpとdouble-search.phpとtriple-search.phpでカスタムテンプレートを分けようと考えております。 初めは最近検索されたワードを設定するつもりでしたが、記事と結びつけることが難しくカスタムフィードごとの検索単体に作り替えております。 ※参考サイト https://oku-log.com/blog/wp-search/ https://lindsay.chunk.jp/wordpress_customize/freeword-search/ serch.php //サーバーに対して指定したリソースを返すよう要求するファイル <form method="get" class="single1-search" action="<?php echo esc_url( home_url( '/' ) ); ?>" >//トップページのURLを取得する、URLをエスケープした文字を返します <input type="hidden" name="post_type" value="post">//ユーザーに見えない隠しフィールドを設置する,valueは、カスタム投稿タイプ名のスラッグに置き換えてください。通常はpost? //テキスト入力欄を生成 <input type="text" placeholder="<?php if(!is_search()){ echo 'テストから探す';} ?>" value="<?php if(is_search()){ echo get_search_query();} ?>" class="test-searchbody" name="s"> <button type="submit" class="test-searchbutton"></button> </form> <?php $search_query = get_search_query(); ?><--サイト内検索を行ったときのクエリ文字列を取得します--> <?php global $wpdb; ?><--データベースでSQL実行--> <?php $results = $wpdb->get_results($wpdb->prepare(" //不正なSQL文を実行することによりデータベースを不正に操作し攻撃する対策 SELECT DISTINCT post_id //SELECT distinctにpost_idを指定することで重複データを除外しています FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID //$wpdbオブジェクトを利用して、postmetaテーブルのすべてのカラムを検索し、次の2つの条件を満たす行をオブジェクトの配列で取得 WHERE {$wpdb->postmeta}.meta_key IN ('single_rss_feed1') AND meta_value LIKE '{$search_word}'//すべてだとWHERE meta_value LIKE '{$search_word}' AND post_status = 'publish' //公開済みの場合はpublish "%$search_query%"));//もとはWHERE meta_value LIKE '%s'だったから%が必要? ?> ______________________________________________________________ page-front.php <!--検索に使用されるページのセクションを識別するために使用,actionはリダイレクトさせたいページ?--> <form role="search" method="get" id="searchform" class="searchform" action="http://example.com/"> <div class="hole"> <div class="left"> <label class="screen-reader-text" for="s">キーワード検索</label> </div> <div class="right"> <input type="text" value="" name="s" id="s" placeholder="例)年齢不問"/> <button type="submit" id="searchsubmit"><i class="fa fa-search"></i> 検索</button> </div> </div> </form>

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.22

$current_pageが0のためにエラーになっているようです。 ---- //ページ番号チェック if (ctype_digit($_REQUEST['page'])) { $current_page = (int) $_REQUEST['page']; } else { $current_page = 1; } if ($current_page > $wp_query->max_num_pages) { $current_page = $wp_query->max_num_pages; } ---- $_REQUEST['page']が0で呼ばれているのかも知れません。 あまりいい方法ではありませんが、上記コードの下に以下のコードを追加してみてください。 ---- if (empty($current_page)) { $current_page = 1; } ---- そのエラーとは関係ありませんが、すべての項目をキーにしておいてください。

php_learn
質問者

お礼

画像はこちらになります。 テーブル構造は3つとも同じ状態です。 https://imgur.com/QwlKFmO.jpg https://imgur.com/wvBcl8U.jpg https://imgur.com/1fnhjL3.jpg https://imgur.com/pIZ3dMs.jpg

php_learn
質問者

補足

修正いただきありがとうございます。 エラーを解消することができました。 現在double_rss_feedとtriple_rss_feedのRSSが空で取得ができていない状態です。 single_rss_feedのtitleとimgでユニークキーを設定していたら重複していますというエラーが出ています。 昨日のエラー、テーブル名の変更が原因でしょうか? //※テーブル名の変更 $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT); $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT); $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ); $group_per_block = 5; //ブロックあたり投稿グループ件数

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.21

画像が表示されないのは、サムネイルURLの設定をしているset_other_data()が呼ばれていないためのようです。 以下のように呼ぶようにしてみてください。 ---- $item = $post_items[$item_index]; set_other_data($item); //タイトルの保存は省略 ----

php_learn
質問者

お礼

回答が分かれてしまいすみません。こちらの回答が最新になります。 あれから考えてみたのですが、問題なく表示できそうなのでアドバイスお願いいたします。 検索欄をflont-page.phpに設置します。そこでワードが入力されたらsearch.php(http://●●●/search/)にリダイレクトさせます。 リダイレクトしたsearch.phpはRSSなどのコードは同様に設置した状態で、記事の部分のみ$wpdbを使い$resultsから記事のカテゴリー、アイキャッチ、タイトル、日付け、コメント数、抜粋、続きを読むなどを出力します。 この方法が不可能であれば、検索欄を箱として扱いそこから取得したデータに関数を付けて、search.phpの検索後の表示ページで入力されたワードから該当する記事を出力する方法も考えました。 <?//phpリダイレクトさせるコード?> <form role="search" method="get" id="searchform" class="searchform" action="http://example.com/search/"> <div class="hole"> <div class="left"> <label class="screen-reader-text" for="s">キーワード検索</label> </div> <div class="right"> <input type="text" value="" name="s" id="s" placeholder="例)年齢不問"/> <button type="submit" id="searchsubmit"><i class="fa fa-search"></i> 検索</button> </div> </div> </form> _________________________ <?php//検索コンテンツを表示させるコード?> <?php//ここから記事表示?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <li> // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'wp-content/uploads/2020/11/rss_300.jpg'; } </li> <?php endforeach; ?> </ul> <?php else : ?> <p><?php echo esc_html('検索条件にヒットした募集はありませんでした。'); ?></p> <?php endif; ?> 画像のほかにもタイトルや日付けなど表示したいのですが$resultをどのように渡せばよいのかわからず、書けませんでした。 教えていただけると助かります。よろしくお願いいたします。 画像に$resultを渡す方法がわかれば同様にかけると思います。 // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); }

php_learn
質問者

補足

修正いただきありがとうございます。 画像を表示することができました。 なぜtriple_rss_feedでRSSを取得できないのかわからなかったため一度データベースを削除して、接続の部分もDB_NAME、DB_PASSWORDを変更してみたところ、接続の時点で構文エラーが表示されました。 ※エラー文 Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-26,26' at line 1 in wp-content/themes/sample_theme/front-page.php:184 Stack trace: ______________________________________________________________ 該当ファイルはfront-page.phpでエラーが起きている箇所は下記になります。$stmt->execute();でエラーが起きているのですが、考えられる原因はありますでしょうか? //※テーブル名の変更 $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT); $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT); $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ); $group_per_block = 5; //ブロックあたり投稿グループ件数 title以外のキーが外れた状態で、single_rss_feedだけRSS取得できている状態です。 https://imgur.com/CdTKSUv.jpg

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.20

・処理が再び重くなりページの読み込みができず、 triple_rss_feedのRSSが取得できない状態になっております。 3つの処理をまとめるのは限界があるのでしょうか? 私の方でも重くなったことがありますが、おそらく無限ループのような感じになっているのだと思います。 3つの処理はこの程度ではまだごく簡単な方なので、限界には達していないと思います。 他のテンプレートでは遅くならないのではないでしょうか。 現在の、functions.phpと重くなっているPHPファイルをまたgitにでも上げていただければ、それで確認してみます。

php_learn
質問者

お礼

さかのぼって質問してしまい申し訳ありません。 最新の質問になります。 現状下記のコードで画像、タイトル、リンクは表示されているのですが、カテゴリー、日付け、コメント数、抜粋、続きを読むは出力出来ていない状態です。 $resultはインジェクション対策で必須なようですが、画像は$resultなしで出力しています。 解説を読んでもいまいち理解ができないのですが、それぞれにインジェクション対策は必要でしょうか? SELECT,FROM,WHERE,ANDで$wpdbテーブルを選択して表示しているのですが、各コンテンツ(カテゴリー)は階層が違うようでSELECT,FROM,WHERE,ANDを複数必要になることが想定されるのですが、検索すると複数設置しているものは見かけませんでした。 そこでmeta_key(カスタムフィールド)から階層すべてのコンテンツを取得して表示しているのではないかというコードを発見したのです自信がないです。 確認いただくことは可能でしょうか? カスタムフィールで名で検索項目を絞ることもうまくいっていない状態なので、そちらもアドバイスお願いいたします。 最終的にはfront-page.phpと同じデザインにしていくつもりなのですが、'per_page' =>数字でコンテンツの数は指定できるようなのでpostを使わなければ、大幅にコードの改変は必要ではないようです。 現在実装しているコード https://wandbox.org/permlink/PzNE1VSvGe53XaOK 階層すべてのコンテンツを取得し表示するコード https://wandbox.org/permlink/vcvx0Z1nBR6WcQLy

php_learn
質問者

補足

アドバイスありがとうございます。 コードは下記のものを修正したときに間違えがあったためタイムアップになっていたようです。 front-page.phpの$posts_per_page = $block_per_page * $group_per_block; //ページあたり投稿件数 5×2の10件画像は1なので$posts_per_group省略 コード修正の時にエラーではなくタイムアップが表示されるため同様に重たい状態ではあるようです。 front-page.phpで画像が表示されていないのですが原因がわかりません。以前は表示されていたので投稿ページのphpが作成されていないことが原因だとは考えにくいのですが… 確認お願いいたします。 echo "<li><a href=\"{$item->guid}\"><img src=\"{$item->thumbnail}\"></a></li>";echo "<li><img src=\"{$item->thumbnail}\"></li>"; page-third.phpのデータベースが機能しておらず格納されていないためpage-secound.phpと念のため比較していただきたいのですが、見たところコードの間違えはないようです。 最終的にレンタルサーバーのcronを使い取得と格納をcronに行ってもらい処理をもう一段階軽くすることも考えていますが、こちらは人気タグや検索欄やアーカイブなどが終わり、コメント欄の返信機能まで作り終えたあとに実装していく予定です。 人気タグと返信機能でデータベースを扱う可能性があるためそちらとまとめてcron化して自動取得をしてもらい、全体の処理を軽くする予定です。 https://wandbox.org/permlink/V1OvpuwqdyEsFwyc

  • dell_OK
  • ベストアンサー率13% (776/5747)
回答No.19

echo "<li>{$item->post_excerpt}</li>"; これは抜粋を表示しているので、もしかしたら抜粋が入力されていないのではないでしょうか。

php_learn
質問者

お礼

処理が再び重くなりページの読み込みができず、 triple_rss_feedのRSSが取得できない状態になっております。 3つの処理をまとめるのは限界があるのでしょうか?

php_learn
質問者

補足

回答ありがとうございます 一応、記事にテストと書き込んでいるのですが表示されておりません。 コードを再度確認中です

関連するQ&A