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

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

コメント欄を出力した後に返信機能を追加したい

カスタムフィールド名をつけて記事を振り分けていきたいのですが、上手くいきませんどうすれば良いでしょうか? $nextID = $post_ids[$current + 1]; //$currentの1つあと $next2ID = $post_ids[$current + 2]; //$currentの2つあと echo '<ul>'; //1つあとの記事のコメント $args = ['post_id' => $nextID, 'number' => 1]; $comments = get_comments($args); if (empty($comments)) { $comment = 'コメントなし'; } else { $comment = $comments[0]->comment_content; } echo "<li>{$comment}</li>"; //2つあとの記事のコメント $args = ['post_id' => $next2ID, 'number' => 1]; $comments = get_comments($args); if (empty($comments)) { $comment = 'コメントなし'; } else { $comment = $comments[0]->comment_content; } echo "<li>{$comment}</li>"; echo '</ul>';

  • PHP
  • 回答数29
  • ありがとう数56

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

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

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

php_learn
質問者

お礼

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

その他の回答 (28)

  • dell_OK
  • ベストアンサー率13% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答No.19

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

php_learn
質問者

お礼

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

php_learn
質問者

補足

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

関連するQ&A

  • WordPressの質問(q10006002)の続

    前後の記事のコメント欄を標示する方法がわかりません。 <?php $team = get_post_meta($post->ID, 'team', true);//赤、青、緑のチームに分ける // 投稿オブジェクトの取得 if ('red' === $team) { $post_red = $post; // 赤(現在) $post_blue = get_adjacent_post(true, '', false); // 青(現在の次) $post = $post_blue; // 現在を青に置きかえる $post_green = get_adjacent_post(true, '', false); // 緑(現在の次:青の次) $post = $post_red; // 現在を赤に戻す } elseif ('blue' === $team) { $post_blue = $post; // 青(現在) $post_red = get_adjacent_post(true, '', true); // 赤(現在の前) $post_green = get_adjacent_post(true, '', false); // 緑(現在の次) } elseif ('green' === $team) { $post_green = $post; // 緑(現在) $post_blue = get_adjacent_post(true, '', true); // 青(現在の前) $post = $post_blue; // 現在を青に置きかえる $post_red = get_adjacent_post(true, '', true); // 赤(現在の前:青の前) $post = $post_green; // 現在を緑に戻す } /*$post_thumbnail_id = get_post_thumbnail_id($post);//画像の投稿データから画像IDを取得する ※おそらくいらない */ $red_post_thumbnail_id = get_post_thumbnail_id($post_red);//赤、青、緑の投稿データから前後の画像IDを取得する $blue_post_thumbnail_id = get_post_thumbnail_id($post_blue); $green_post_thumbnail_id = get_post_thumbnail_id($post_green); $red_post_image_src = wp_get_attachment_image_src($red_post_thumbnail_id);//赤、青、緑の投稿データから前後の画像URLを取得する $blue_post_image_src = wp_get_attachment_image_src($blue_post_thumbnail_id); $green_post_image_src = wp_get_attachment_image_src($green_post_thumbnail_id); /*$post_id = post_id ($post_red,$post_blue,$post_green);*/ ※$argsで設定済みなので多分必要ない // コメントオブジェクトの取得 $args = [ 'author__not_in' => '1', // 管理者を除く 'status' => 'approve', // 承認済み 'type' => 'comment', // コメント ]; $args['post_id'] = $post_red->ID; // 赤のID $comments_red = get_comments($args); // 赤のコメント $args['post_id'] = $post_blue->ID; // 青のID $comments_blue = get_comments($args); // 青のコメント $args['post_id'] = $post_green->ID; // 緑のID $comments_green = get_comments($args); // 緑のコメント // コメントの表示 if (empty($comments_red)) { echo '<p>コメントなし</p>'; } else { echo '<ul>'; foreach ($comments_red as $comment) { echo "<li>{$comment->comment_content}</li>"; } echo '</ul>'; } if (empty($comments_blue)) { echo '<p>コメントなし</p>'; } else { echo '<ul>'; foreach ($comments_blue as $comment) { echo "<li>{$comment->comment_content}</li>"; } echo '</ul>'; } if (empty($comments_green)) { echo '<p>コメントなし</p>'; } else { echo '<ul>'; foreach ($comments_green as $comment) { echo "<li>{$comment->comment_content}</li>"; } echo '</ul>'; }

    • ベストアンサー
    • PHP
  • RSSと投稿記事を交互に表示させたい

    内容の修正が必要ですが原因がわかりません 1.投稿に画像やカテゴリーなどが表示されず、タイトルと日付けのみ表示されている 2.RSS画像にURLがついておらず画像のみ表示されている 3.RSSの画像がない場合ダミー画像を表示させたいが書き方が調べてもわからない <?php $dbh = connect_db(); $categories = []; foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } function set_other_data($post) { // アイキャッチ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 = 'noimage.jpg'; } // カテゴリー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); } delete_old_rss($dbh);//接続オブジェクトを渡す //RSS保存 $dbh = connect_db();//① $stmt = $dbh->prepare('insert into rss_feed (title, link, date, img) values (?, ?, ?, ?) on duplicate key update title=?, link=?, date=?, img=?');//② $url1 = get_rss_site_url(); foreach ($url1 as $url) { if (($rss = @simplexml_load_file($url)) === false) { continue; } foreach ($rss->item as $item) { $dc = $item->children('dc', true); $date = date('Y-m-d H:i:s', strtotime($dc->date)); if ($date < $delete_date) { continue; } $title = $item->title; $link = $item->link; $content = $item->children('content', true); $result = preg_match('/<img[^>]*src=\"([^"]+)\"[^>]*>/i', $content->encoded, $matches); if (1 == $result) { $img = $matches[1]; } else { $img = ''; } $stmt->execute([$title, $link, $date, $img, $title, $link, $date, $img]); } } 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; } $block_per_page = 2; $rss_per_block = 18; $posts_per_block = $wp_query->post_count / $block_per_page; //RSS読み込み $rss_per_page = $block_per_page * $rss_per_block; $rss_offset = ($current_page - 1) * $rss_per_page; $sql = 'SELECT * FROM rss_feed ORDER BY date DESC LIMIT ?,?'; $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); $posts_per_page = $block_per_page * $posts_per_block; $posts_offset = ($current_page - 1) * $posts_per_page; $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, ]; $post_items = get_posts($args); //表示 for ($i = 0; $i < $block_per_page; ++$i) { echo '<h2>ブロック</h2>'; echo '<h3>RSS</h3>'; for ($j = 0; $j < $rss_per_block; ++$j) { $item_index = $i * $rss_per_block + $j; if ($item_index >= count($rss_items)) { break; } $item = $rss_items[$item_index]; echo '<ul>'; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">{$item->title}</a></li>"; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">site</a></li>"; echo "<li class=\"sitedate\">{$item->date}</li>"; if (!empty($item->img)) { echo "<li><img src=\"{$item->img}\" width=\"100\"></li>"; } echo '</ul>'; } echo '<h3>投稿</h3>'; for ($j = 0; $j < $posts_per_block; ++$j) { $item_index = $i * $posts_per_block + $j; if ($item_index >= count($post_items)) { break; } $item = $post_items[$item_index]; echo '<ul>';   echo "<li><a href=\"{$item->guid}\">{$item->post_title}</a></li>"; echo "<li>{$item->post_date}</li>"; echo '</ul>'; } }

    • ベストアンサー
    • PHP
  • WP トップページに投函した画像を表示

    トップページに最新記事を並びます。 下記のプログラムはタイトルと記事の抜粋のみです。 記事内にある画像を表示するにはどうすれば良いでしょうか? アイキャッチ画像とは別にしたいです。 宜しくお願いします。 <?php $cat = 'info'; //スラッグ $num = '5'; //記事表示数 global $post; $term_id = get_category_by_slug($cat)->term_id; $myposts = get_posts('numberposts=' .$num. '&category_name=' .$cat); if ($myposts) { echo '<ul>'; foreach($myposts as $post): setup_postdata($post); echo '<li><a href=' .get_permalink(). '>'; echo '</a>'; echo '<h4><a href='.get_permalink().'>'. the_title("","",false).'</a></h4>'; echo '<p>' .mb_substr( strip_tags( $post -> post_content ), 0, 30 ). '...</p></li>'; endforeach; echo '</ul>'; } ?>

    • ベストアンサー
    • PHP
  • Wordpressのコメント欄受付・表示について。

    WordPress 2.8.6で構築 現在全てのブログでコメント受付が非表示になっていますが、その中の1つのカテゴリのブログだけでコメント欄を表示させるのが目的です。 phpの知識が追い付かずネットでも解決方法が見つけられず、以下のcomments.phpを修正してカテゴリの設定を変更するイメージでしたが理解が追い付きません。 どなたかお詳しい方いらっしゃいますでしょうか? <?php // Do not delete these lines if (isset($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) die ('Please do not load this page directly. Thanks!'); if ( post_password_required() ) { ?> <p class="nocomments"><?php _e('This post is password protected. Enter the password to view comments.', 'kubrick'); ?></p> <?php return; } ?> <!-- You can start editing here. --> <?php if ( have_comments() ) : ?> <h3 id="comments"><?php comments_number(__('No Responses', 'kubrick'), __('One Response', 'kubrick'), __('% Responses', 'kubrick'));?> <?php printf(__('to “%s”', 'kubrick'), the_title('', '', false)); ?></h3> <div class="navigation"> <div class="alignleft"><?php previous_comments_link() ?></div> <div class="alignright"><?php next_comments_link() ?></div> </div> <ol class="commentlist"> <?php wp_list_comments();?> </ol> <div class="navigation"> <div class="alignleft"><?php previous_comments_link() ?></div> <div class="alignright"><?php next_comments_link() ?></div> </div> <?php else : // this is displayed if there are no comments so far ?> <?php if ( comments_open() ) : ?> <!-- If comments are open, but there are no comments. --> <?php else : // comments are closed ?> <!-- If comments are closed. --> <p class="nocomments"><?php _e('Comments are closed.', 'kubrick'); ?></p> <?php endif; ?> <?php endif; ?> <?php if ( comments_open() ) : ?> <div id="respond"> <h3><?php comment_form_title( __('Leave a Reply', 'kubrick'), __('Leave a Reply for %s' , 'kubrick') ); ?></h3> <div id="cancel-comment-reply"> <small><?php cancel_comment_reply_link() ?></small> </div> <?php if ( get_option('comment_registration') && !is_user_logged_in() ) : ?> <p><?php printf(__('You must be <a href="%s">logged in</a> to post a comment.', 'kubrick'), wp_login_url( get_permalink() )); ?></p> <?php else : ?> <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform"> <?php if ( is_user_logged_in() ) : ?> <p><?php printf(__('Logged in as <a href="%1$s">%2$s</a>.', 'kubrick'), get_option('siteurl') . '/wp-admin/profile.php', $user_identity); ?> <a href="<?php echo wp_logout_url(get_permalink()); ?>" title="<?php _e('Log out of this account', 'kubrick'); ?>"><?php _e('Log out &raquo;', 'kubrick'); ?></a></p> <?php else : ?> <p><input type="text" name="author" id="author" value="<?php echo esc_attr($comment_author); ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="author"><small><?php _e('Name', 'kubrick'); ?> <?php if ($req) _e("(required)", "kubrick"); ?></small></label></p> <p><input type="text" name="email" id="email" value="<?php echo esc_attr($comment_author_email); ?>" size="22" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="email"><small><?php _e('Mail (will not be published)', 'kubrick'); ?> <?php if ($req) _e("(required)", "kubrick"); ?></small></label></p> <p><input type="text" name="url" id="url" value="<?php echo esc_attr($comment_author_url); ?>" size="22" tabindex="3" /> <label for="url"><small><?php _e('Website', 'kubrick'); ?></small></label></p> <?php endif; ?> <!--<p><small><?php printf(__('<strong>XHTML:</strong> You can use these tags: <code>%s</code>', 'kubrick'), allowed_tags()); ?></small></p>--> <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p> <p><input name="submit" type="submit" id="submit" tabindex="5" value="<?php _e('Submit Comment', 'kubrick'); ?>" /> <?php comment_id_fields(); ?> </p> <?php do_action('comment_form', $post->ID); ?> </form> <?php endif; // If registration required and not logged in ?> </div> <?php endif; // if you delete this the sky will fall on your head ?>

    • ベストアンサー
    • PHP
  • SQLに条件を追加したいのですが方法が分かりません

    <?php $search_query = get_search_query(); ?> <?php global $wpdb; ?> <?php $sql = " SELECT COUNT(*) AS all_count FROM wp_posts AS post INNER JOIN ( SELECT * FROM wp_postmeta WHERE meta_key='single_rss_feed1' ) AS feed ON post.ID = feed.post_id LEFT JOIN ( SELECT * FROM wp_postmeta WHERE meta_key = '_thumbnail_id' ) AS thumbnail ON post.ID = thumbnail.post_id LEFT JOIN wp_posts AS attachment ON thumbnail.meta_value = attachment.ID LEFT JOIN ( SELECT category.object_id AS post_id, GROUP_CONCAT(category.name ORDER BY category.term_id) AS category_names, GROUP_CONCAT(category.slug ORDER BY category.term_id) AS category_slugs FROM ( SELECT sub_a.name, sub_a.slug, sub_c.object_id, sub_a.term_id FROM wp_terms AS sub_a LEFT JOIN wp_term_taxonomy AS sub_b ON sub_a.term_id = sub_b.term_id LEFT JOIN wp_term_relationships AS sub_c ON sub_b.term_taxonomy_id = sub_c.term_taxonomy_id WHERE sub_b.taxonomy = 'category' ) AS category GROUP BY category.object_id ) AS category ON post.ID = category.post_id WHERE post.post_type = 'post' AND post.post_status = 'publish' AND post.post_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s) $query = $wpdb->prepare($sql, "%$search_query%", "%$search_query%", "%$search_query%"); $results = $wpdb->get_results($query); ?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <li> <?php echo "<a href=\"{$result->post_url}\">{$result->post_title}</a>"; echo $result->post_date; echo $result->category_names; if (empty($result->comment_count)) { echo 'コメントなし'; } else { echo "{$result->comment_count}件のコメント"; } echo $result->post_excerpt; echo "<a href=\"{$result->post_url}/#more-{$result->post_id}/\">続きを読む</a>"; if (empty($result->thumbnail_url)) { $result->thumbnail_url = 'noimage.jpg'; } echo "<img src=\"{$result->thumbnail_url}\">"; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> ※追加したい条件 $categories = []; foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } function set_other_data($post) { // アイキャッチ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 = 'noimage.jpg'; } // カテゴリー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
  • WordPress PCとスマホで表示を切り替える

    PCでは記事一覧5件、スマホでは3件表示するようにしたいです。 条件分岐タグを使って、PCとスマートフォンで記事の一覧表示を切り替える方法がうまくいきませんでした。 https://handywebdesign.net/2017/11/wp-is-mobile/ 改造前のコード(問題なく表示できました) <ul> <?php $latest_posts = get_posts( array( 'posts_per_page' => 5, // 表示する記事の数 'category_name' => '投稿ID',// 投稿IDを取得 'fields' => 'ids', ) ); foreach( $latest_posts as $post ): setup_postdata( $post ); if( has_post_thumbnail() ) { $post_thumb = get_the_post_thumbnail( '', 'post_thumbnail' ); // アイキャッチがあるときはアイキャッチを表示 } else { $post_thumb = '<img src="' . get_template_directory_uri() . '/img/noimage.gif" width="100" height="100" alt="デフォルト画像" />'; // アイキャッチがないときは《noimage.gif》を表示 } $post_categories = get_the_category(); // カテゴリーを取得 $post_content = wp_trim_words( get_the_content(), 30, '…' ); // 30字分を抜粋 ?> <li <?php post_class(); ?>> <a href="<?php the_permalink(); ?>"> <div class="blogListimg"> <?php echo wp_kses_post( $post_thumb ); ?> </div> <!-- アイキャッチここまで --> <p class="post-time blogDt"><?php the_time('Y.m.d'); ?></p> <p class="post-categories blogCt"><?php echo esc_html( $post_categories[0]->name ); ?></p> <h3 class="post-title"><?php the_title(); ?></h3> <p class="post-content blogBf"><?php echo esc_html( $post_content ); ?></p> </a> </li> <?php endforeach; wp_reset_postdata(); ?> </ul> PCとスマートフォンで記事の一覧表示を切り替えるコード 参考サイトを参考にfunctions.phpにfunction is_mobile() コードを追加。 トップページのphpに以下を改造。 <?php if ( is_mobile() ) : ?> <?php $latest_posts = get_posts( array( 'posts_per_page' => 5, // 表示する記事の数 'category_name' => '投稿ID',// 投稿IDを取得 'fields' => 'ids', ) ); foreach( $latest_posts as $post ): setup_postdata( $post );  ・  ・  ・ <?php else: ?> <?php $latest_posts = get_posts( array( 'posts_per_page' => 3, // 表示する記事の数 'category_name' => '投稿ID',// 投稿IDを取得 'fields' => 'ids', ) ); foreach( $latest_posts as $post ): setup_postdata( $post );  ・  ・  ・ <?php endforeach; wp_reset_postdata(); ?> </ul> 結果は真っ白になってしまいました。 HTMLソースも真っ白です。 空白はSublime Textのテキストエディターを使っていますので、確認しております。 どこが違うか、教えてくださいますか? よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PHPのサンプルコードが意図した通りに動かない。

    かれこれ6時間眺めてますが何が駄目なのかがわかりません。 どこが悪いのか教えていただけると助かります。 このbbs.phpは 二つのインプット要素をもつHTMLフォームを含むPHPファイルで、 名前とひとことコメントを入力してsubmitすれば フォームの下部にそのコメントを 名前、コメント、日付の書式で一行づつ表示する 。。。はずだったんですが Parse error: syntax error, unexpected T_STRING in /Applications/XAMPP/xamppfiles/htdocs/online_bbs/bbs.php on line 48 らしく該当する行を眺めてみても何がいけないのかさっぱりです。 コード内にもエラーが出たら出力するコードがあるのですが どうやらこれはインタープリタ自体が吐くエラーのようで このエラーの表示時にはフォーム要素は一切表示されません。 なにがいけないのか教えてください ほとほと困り果てています <?php $link = mysql_connect(`localhost`,`root`,`takataka`); if(!$link) { die(`Can not connect database`. mysql_error()); } mysql_select_db(`online_bbs`,$link); $errors = array(); if($_SERVER[`REQUEST_MTHOD`]===`POST`) { $name = null; if(!isset($_POST[`name`]) || !strlen($_POST[`name`])) { $errors[`name`] = `input your name `; }else if(strlen($_POST[`name`]) > 40) { $errors[`name`] = `名前は四十文字以内で入力してください`; }else { $name = $_POST[`name`]; } $comment = null; if(!isset($_POST[`comment`]) || !strlen($_POST[`comment`])) { $errors[`comment`] = `Input your comment please `; }else if(strlen($_POST[`comment`]) > 200) { $errors[`comment`] = `コメントは200文字以内で入力してください`; }else { $comment = $_POST[`comment`]; } if(count($errors) === 0) { $sql = "INSERT INTO `post` (`name`,`comment`,`created_at`) VALUES (`" . mysql_real_escape_string($name) . "`,`" . mysql_real_escape_string($comment) . "`,`" . date(`Y-m-d H:i:s`) . "`); mysql_query($sql,$link); mysql_close($link); header(`Location: http://localhost/online_bbs/bbs.php`); } } ?> <html> <head>    <titlle>ひとこと掲示板</title> </head> <body> <h1>ひとこと掲示板掲示板</h1> <form action="bbs.php" method="post"> //ここが48行目になります <?php if (count($errors) > 0): ?> <ul class="error_list"> <?php foreach ($errors as $error): ?> <li> <?php echo htmlspecialchars($error,ENT_QUOTES,`UTF-8`) ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> 名前:<input type="text" name="name"/><br/> ひとこと;<input type="text" name="comment" size="60"/><br/> <input type="submit" name="submit" value="送信"/> </form> <?php $sql = "SELECT * FROM `post` ORDER BY `created_at` DESC"; $result = mysql_query($sql,$link); ?> <p><?php echo $result; ?></p> <?php if($result !== false && mysql_num_rows($result)): ?> <ul> <?php while($post = mysql_fetch_assoc($result)): ?> <li> <?php echo htmlspecialchars($post[`name`],ENT_QUOTES,`UTF-8`); ?> <?php echo htmlspecialchars($post[`comment`],ENT_QUOTES,`UTF-8`); ?> - <?php echo htmlspecialchars($post[`created_at`],ENT_QUOTES,`UTF-8`); ?> </li> <p>test</p> <?php endwhile; ?> </ul> <?php endif; ?> <?php mysql_free_result($result); mysql_close($link); ?> </body> </html>

    • ベストアンサー
    • PHP
  • WordPressの コメント欄 に関する質問です

    WordPressの コメント欄 に関する質問です コメントのURLを必須にする方法をを調査しています 名前 aaaaaaaaaaaaaaaaaaaa メールアドレス bbbbbbbbbbbbbbbbb URL  cccccccccccc を入力する箇所が下記にあります 名前とメールアドレスは必須ですが、 URLを必須にするには どのような記述にすればいいのでしょうか? -------------------------------------- <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform"> <?php if ( is_user_logged_in() ) : ?> <p><?php printf(__('Logged in as <a href="%1$s">%2$s</a>.', 'kubrick'), get_option('siteurl') . '/wp-admin/profile.php', $user_identity); ?> <a href="<?php echo wp_logout_url(get_permalink()); ?>" title="<?php _e('Log out of this account', 'kubrick'); ?>"><?php _e('Log out &raquo;', 'kubrick'); ?></a></p> <?php else : ?> <p><input type="text" name="author" id="author" value="<?php echo esc_attr($comment_author); ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="author"><?php _e('aaaaaaaaaaaaaaaa', 'kubrick'); ?> <?php if ($req) _e("(公開)", "kubrick"); ?></label></p> <p><input type="text" name="email" id="email" value="<?php echo esc_attr($comment_author_email); ?>" size="22" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="email"><?php _e('bbbbbbbbbbbbbbbb (必須)', 'kubrick'); ?> <?php if ($req) _e("(非公開)", "kubrick"); ?></label></p> <p><input type="text" name="url" id="url" value="<?php echo esc_attr($comment_author_url); ?>" size="22" tabindex="3" /> <label for="url"><?php _e('cccccccccccccccc', 'kubrick'); ?><?php if ($req) _e("(公開)", "kubrick"); ?></label></p> <?php endif; ?> ----------------------------- 全文はこちらです http://44fsdfa.blogspot.com/p/blog-page.html

    • ベストアンサー
    • PHP
  • WordPressの コメント欄 に関する質問です(2)

    WordPressの コメント欄 に関する質問です(2) コメントのURLを必須にする方法をを調査しています 名前 aaaaaaaaaaaaaaaaaaaa メールアドレス bbbbbbbbbbbbbbbbb URL  cccccccccccc を入力する箇所が下記にあります 名前とメールアドレスは必須ですが、 URLを必須にするにはどのような記述にすればいいのでしょうか? 元になる全文はこちらです http://44fsdfa.blogspot.com/p/blog-page.html 下記のように 変更しましたが、URLを入力しなくてもすんなり投稿されてしまいます URLもメールと同じように必須にするには 他にどこを見ればいいのでしょうか? -------------------------------------- <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform"> <?php if ( is_user_logged_in() ) : ?> <p><?php printf(__('Logged in as <a href="%1$s">%2$s</a>.', 'kubrick'), get_option('siteurl') . '/wp-admin/profile.php', $user_identity); ?> <a href="<?php echo wp_logout_url(get_permalink()); ?>" title="<?php _e('Log out of this account', 'kubrick'); ?>"><?php _e('Log out &raquo;', 'kubrick'); ?></a></p> <?php else : ?> <p><input type="text" name="author" id="author" value="<?php echo esc_attr($comment_author); ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="author"><?php _e('aaaaaaaaaaaaaaaa', 'kubrick'); ?> <?php if ($req) _e("(公開)", "kubrick"); ?></label></p> <p><input type="text" name="email" id="email" value="<?php echo esc_attr($comment_author_email); ?>" size="22" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="email"><?php _e('bbbbbbbbbbbbbbbb (必須)', 'kubrick'); ?> <?php if ($req) _e("(非公開)", "kubrick"); ?></label></p> <p><input type="text" name="url" id="url" value="<?php echo esc_attr($comment_author); ?>" size="22" tabindex="3" <?php if ($req) echo "aria-required='true'"; ?> /> <label for="author"><?php _e('ccccccccccccccccc', 'kubrick'); ?> <?php if ($req) _e("(公開)", "kubrick"); ?></label></p> <?php endif; ?>

    • ベストアンサー
    • PHP
  • JavaScriptのjQueryのサンプルに機能を追加したいです!

    当方jQuery初心者です。 jQueryのサンプル「Dropline Menu 7」を使っています。 現在地となるcurrentがデフォ表示で赤字にて表示されていると思います。 その他メニューをマウスオーバーすると他メニューのサブメニューが下に表示されていきます。 しかし、マウスアウトすると直ぐデフォ表示に戻ってしまいます。 そこにマウスオーバー時に現われていたサブメニューがマウスアウトしてもすぐ消えない、2~3秒程の時間表示されるようなものを設け、 その設定した時間内にマウスオーバーするとそのまま表示を継続、というような機能をこのスクリプトに追加したいです。 http://jsajax.com/jQueryDroplineMenuArticle1167.aspx いろいろと調べてみたのですがいい方法が見つかりません。 使われている JScript.js の中身はこのようになっていました。 /* ====================================================== This copyright notice must be untouched at all times. Copyright (c) 2008 Stu Nicholls - stunicholls.com - all rights reserved. ========================================================= */ $(function() { $("#dropline li.current").children("ul").css("left", "0px").show(); $("#dropline li.current").children(":first-child").css("color", "#c00") $("#dropline li").hover(function() { if (this.className.indexOf("current") == -1) { getCurrent = $(this).parent().children("li.current:eq(0)"); if (this.className.indexOf("top") != -1) { $(this).children("a:eq(0)").css("color", "#069"); } else { $(this).children("a:eq(0)").css("color", "#000"); } if (getCurrent = 1) { $(this).parent().children("li.current:eq(0)").children("ul").hide(); ; } $(this).children("ul:eq(0)").css("left", "0px").show(); } }, function() { if (this.className.indexOf("current") == -1) { getCurrent = $(this).parent().children("li.current:eq(0)"); if (this.className.indexOf("top") != -1) { $(this).children("a:eq(0)").css("color", "#000"); } else { $(this).children("a:eq(0)").css("color", "#666"); } if (getCurrent = 1) { $(this).parent().children("li.current:eq(0)").children("ul").show(); ; } $(this).children("ul:eq(0)").css("left", "-99999px").hide(); } }); }); イベントのhover(over, out)で、out部のfunction() {~} の処理内にて変更・追加すればよいのでしょうか? どなたかご教授いただけますでしょうか、お願いします!

専門家に質問してみよう