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

WordPressの記事表示に問題が発生しています

このQ&Aのポイント
  • WordPressの質問(q10032703)に関連して、記事が表示されない問題が発生しています。
  • set_template_info関数は、テンプレート情報を設定するためのものです。
  • get_template_number関数は、テンプレート番号を取得するためのものです。

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

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

基本的に同じコードですのでもとのsearch.phpに戻して、 実行してみてください。 と言いましたが、問題が発生していることを確認してください。 削除したものが表示されるのと、タイトルも何も表示されないことです。

php_learn
質問者

お礼

SQLに関して勘違いがありました。申し訳ありません。 meta.meta_key = ''を変更して検索したところテーブルのデータは記事データと合致しておりました。 SELECT distinct post.* FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = 'single_rss_feed1' AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE '%イ%') ORDER BY post.post_date DESC

php_learn
質問者

補足

削除したものが表示されるのと、タイトルも何も表示されないことです。 A.回答ありがとうございます。削除したものは表示されておらず、タイトルも表示されています。 1つ気付いたことがあるのですが、get_search_query():で出力できなかったタイトルがfilter_input():で出力できています。 何かしらの法則があるようです。 例えばイで検索した際にえいてぃーんカという記事があったと仮定します。 get_search_query():の方では該当記事として出力できていませんが、filter_input():では出力できています。 いくつかこのような記事があり、SQLで検索に使用したコードでもイが含まれるのに出力されない記事があります。 get_search_query():の検索の精度は低い気がしています。 タイトルから表示されていない状態ですが、先にページナビの修正から行うのでしょうか? ※現在表示されている記事 https://imgur.com/IupD3AB.jpg ※現在のコード https://wandbox.org/permlink/VReuDuARbgCZ1OJM ※確認の際に使用したコード SELECT distinct post.* FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = 'single_rss_feed1' AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE '%イ%') ORDER BY post.post_date DESC

その他の回答 (81)

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

・RSSとページナビを修正する場合どのようにすれば良いでしょうか? 修正と言うか、あれはテストコードですので、 search.phpはもとのものに戻しておいてください。 私が疑問視していた検索文字の取得は、filter_input()に決定です。 SQL文やデータの取得方法に問題はないこともわかりました。 基本的に同じコードですのでもとのsearch.phpに戻して、 実行してみてください。 なにもしていないので問題は解決していませんが、 問題が発生している状態のコードを改めていただけますか。 display.phpとsearch.phpのみアップロードしてください。

php_learn
質問者

お礼

こちらが最新の質問になります。 期限がきれてしまいましたので、新たに質問させていただきました。 よろしくお願い致します。 https://okwave.jp/qa/q10054200.html

php_learn
質問者

補足

回答ありがとうございます。元々のコードはこちらになります。https://wandbox.org/permlink/EpfcYUSkXmSWDWOZ 検索ワードの取得部分に手を加えたのが下記コードになります。 $search_query = get_search_query();→$search_query = filter_input(INPUT_GET, 's'); 本来は下記のようにする予定ですが、動作確認のためタイトルだけに検索対象を絞っています。 AND (post.post_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s) $query = $wpdb->prepare($sql, $tk, "%$search_query%", "%$search_query%", "%$search_query%", $posts_offset, $posts_per_page);

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

結果を教えてくださってありがとうございます。 search.php内でget_search_query()が実行されるまでに破壊されているかと思って、最小コードで試していただいたのですが、どうもそうではなさそうなので、filter_input()を使うしかなさそうですね。 私の方では問題ないので、何か環境の違いによるものだとして放置します。 filter_input()での検索結果に余計なものがないのでしたら、SQLには問題ないと言うことになります。 これにパターンの条件があるべきなので、条件は絞られる一方で、余計なものは出ないですね。 削除されたと言われていた記事も表示されていませんよね。

php_learn
質問者

お礼

昨日の質問の繰り返しになって申し訳ないのですが、 RSSとページナビを修正する場合どのようにすれば良いでしょうか? 下記のように変更してみたのですが… $sql = " SELECT post.* FROM wp_posts AS post WHERE post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE %s) ORDER BY post.post_date DESC LIMIT %d,%d "; $query = $wpdb->prepare($sql, $s,$posts_offset, $posts_per_page);

php_learn
質問者

補足

回答ありがとうございます。 削除されている記事の表示はされていません。

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

あのコードは、 問題を調査するための第一歩のものなので、 結果を教えてくださると助かります。 以下のような結果になると思っています。 ==== get_search_query():検索文字 投稿一覧 filter_input():検索文字 投稿一覧 ==== 両方の検索文字が表示されていたら、 get_search_query()は使えると言うことなので、 filter_input()にしなくてもいいと思います。 投稿一覧に、期待しているものが表示されるか、 余計なものが表示されていないか、を教えてください。

php_learn
質問者

補足

A.回答ありがとうございます。 get_search_query():(なし) 全投稿 filter_input():検索文字 検索文字投稿一覧 となっております。get_search_query():は検索文字の取得に失敗しております。 よってget_search_query():は余計なもの(全投稿)が表示されます。

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

先の回答は修正ではありません。 search.phpを部分的に書きかえるのではなくて、全体であれだけのコードにして試してください。

php_learn
質問者

補足

回答ありがとうございます。誤解しておりました。 申し訳ありません。 SQLの条件はややこしくなりそうなので今のところタイトルのみで進行していこうと考えています。 RSSとページナビから修正していきたいのですが、下記のように変更しても大丈夫でしょうか? $sql = " SELECT post.* FROM wp_posts AS post WHERE post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE %s) ORDER BY post.post_date DESC LIMIT %d,%d "; $query = $wpdb->prepare($sql, $s,$posts_offset, $posts_per_page); ※表示画面 https://imgur.com/fdu0VJZ.jpg https://imgur.com/Gx2lEgd.jpg ※該当URL http://www.last.cfbx.jp/?s=%E3%82%A2&tn=1 http://www.last.cfbx.jp/?s=%E3%82%A4&tn=2

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

単純な検索結果ページを作ってみました。 get_search_query()とfilter_input(INPUT_GET, 's')の両方で検索文字を取得しています。 get_search_query()が動作するかしないかを確認できます。 get_search_query()が動作していなくても、filter_input()が動作していればfilter_input()を優先して使えばいいと思います。 get_search_query()が動作していない場合に、filter_input()も動作していなければそれもわかります。 タイトルのみで検索しています。 パターンの条件はないので全パターンが取得されます。 表示もタイトルのみです。 ----search.php <?php $s = get_search_query(); echo "<p>get_search_query():{$s}</p>"; display_posts($s); $s = filter_input(INPUT_GET, 's'); echo "<p>filter_input():{$s}</p>"; display_posts($s); function display_posts($s) { global $wpdb; $sql = " SELECT post.* FROM wp_posts AS post WHERE post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE %s) ORDER BY post.post_date DESC "; $s = "%{$s}%"; $query = $wpdb->prepare($sql, $s); $items = $wpdb->get_results($query); echo '<ol>'; foreach ($items as $item) { echo "<li>{$item->post_title}</li>"; } echo '</ol>'; } ---- これで、期待しているものが表示されるか、余計なものが表示されないか確認してみてください。 必要に応じて、パターンの条件を追加したり、表示する項目を追加してください。 現在の状況からすると、まったく動作しない、ことも考えられます。 使用している関数は同じなので、これでまったく動作しない場合はどうにもならない気がします。

php_learn
質問者

補足

get_search_query()が動作していなくても、filter_input()が動作していればfilter_input()を優先して使えばいいと思います。 get_search_query()が動作していない場合に、filter_input()も動作していなければそれもわかります。 A.修正ありがとうございます。get_search_queryは確認したところ機能していないようです。filter_input()は機能しているようです。 エラー文が2つ出ております。 条件を追加する前にエラー文を調べてみて原因を考えてみます。 Warning: count(): Parameter must be an array or an object that implements Countable in /home/zblgibzx/public_html/display.php on line 474 Warning: Invalid argument supplied for foreach() in /home/zblgibzx/public_html/wp-content/themes/sample_theme/search.php on line 96 1つめはif ($item_index >= count($post_items)) { になります。 echo '<h3>投稿</h3>'; echo '<div id="entry-content">'; // 記事全体のid for ($k = 0; $k < $group_per_block; ++$k) { // ここから画像とタイトルの処理 for ($j = 0; $j < $posts_per_group; ++$j) { $item_index = $i * $group_per_block * $posts_per_group + $k * $posts_per_group + $j; if ($item_index >= count($post_items)) { break; } $item = $post_items[$item_index]; set_other_data($item); 2つめはforeach ($search_items as $post) { になります。 if (1 == $tn) { $post_items = $search_items; } elseif (2 == $tn) { $post_ids = []; $post_items = []; foreach ($search_items as $post) { if (in_array($post->ID, $post_ids)) { continue; }

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

・現在2つのエラーが発生しています。 エラーと言われるとPHPのエラーが発生しているように思ってしまうので、できれば何か違う表現でお願いします。 例えば、問題、とか。 ・1つは削除した記事がいずれかのテーブルに存在していてプラグインでも削除できない。 テーブルはwp_postだけです。 削除したと言われていますが、削除されていないような気がします。 管理画面から投稿全件を確認してみてください。 プラグインでも削除できないのは投稿(wp_post)のデータが有効なものであるからです。 有効と言うのは、post_statusが'publish'であると言う意味です。 他にも条件はあるかも知れませんが、少なくともこのデータは削除されません。 ・2つめは記事のコンテンツそのものが出力されない。 こちらはそもそもデータが取得できていないような気がします。

php_learn
質問者

補足

・2つめは記事のコンテンツそのものが出力されない。 こちらはそもそもデータが取得できていないような気がします。 A.回答ありがとうございます。申し訳ありません以後問題という表現に致します。 記事が存在しておらずwp_postも確認していますが、どちらにも存在しない記事が出力されておりました。 データの取得に関しては1点思いあたることがあるのですが、下記のようにして$search_queryを渡す必要があったのではないでしょうか? <input type="text" placeholder="ブログ内を検索" name="s" class="searchfield" value="" /> <input type="hidden" name="tn" value="<?php echo $tn; ?>"> 検索ワードはurlを確認するとわたっていましたので、そこから記事の検索に繋がっていないことが原因だと思います。 元のコードですと$post_thumbnail_id = get_post_thumbnail_id($post);となっているため、記事から出力となっています。 これは固定ページの出力には使えますが、検索ページの出力には使えないはずです。 <?PHP $search_query->have_posts()) : ?> <?PHP $post_thumbnail_id = get_post_thumbnail_id; $post->categories = wp_get_post_categories ?> ※参考サイト https://wordpress.stackexchange.com/questions/373042/custom-search-results-page-query-link-permalink-to-post-title-while-separating

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

・削除された記事が出力されている これもまた不思議ですね。 ゴミ箱へ移動(削除?)した記事は以下の条件によって取得されないはずだと思うのです。 ---- AND post.post_status = 'publish' ---- なぜなら、ゴミ箱へ移動した記事のpost_statusは trash になっているからです。 プラグインなどで整理しないといけないのは問題ですね。 ・オブジェクト生成の原因が$wpdbから$postを渡していないことだと考えたのですが、認識に間違いはありますでしょうか? そんな感じになっているようにも思えます。 でも質問者さまの言われるように、タイトルや日時が表示されるので、オブジェクトは生成されていると思います。 なんだか、不思議なことだらけですね。

php_learn
質問者

お礼

誤解を生んでしまっていたら申し訳ないです。 現在2つのエラーが発生しています。1つは削除した記事がいずれかのテーブルに存在していてプラグインでも削除できない。 2つめは記事のコンテンツそのものが出力されない。 オブジェクトに関しては勘違いだと思っていたのですが、エラー文やコードの修正から間違いないと思います。 var_dump($search_query);で確認したときに、なぜ0と表示されているのにコンテンツが出力されているのか疑問でしたが、おそらくURLだけが切り替わっています。 <input type="text" placeholder="ブログ内を検索" name="s" class="searchfield" value="" /> <input type="hidden" name="tn" value="<?php echo $tn; ?>"> dell_okさんに以前お伝えしていた画像だけが出力されていないものは過去に削除した記事に関するエラーですので1つめのエラーに該当します。混乱させてしまい申し訳ありません。 以前該当のエラー箇所を削除したときにその下のカテゴリーとコメント数でも同様のエラーが表示されたとお伝えしました。 これは記事のコンテンツの取得に失敗していると伝えてくれているものだと思われます。 ここにタイトルがないのはfunction{}内に処理が書かれていないからです。 ※該当エラー Warning: Creating default object from empty value in /home/zblgibzx/public_html/display.php on line 617 対策としてarryを用いる方法を考えたのですが、どうでしょうか? $argsは必要ないと思いますが、こちらの方法ですと'post_status' => 'publish'を加えることによって削除した記事の出力が制御できるような気がします。 現在のエラーを改善した後になるのですが。 $search_query = new WP_Query()がデータベースからの記事表示で使えるのか疑問でしたが、$argsでも使用されていることを見ると使えるように見えます。 ※参考サイト https://wordpress.stackexchange.com/questions/373042/custom-search-results-page-query-link-permalink-to-post-title-while-separating https://dezanari.com/wordpress-only-search-page-posts/

php_learn
質問者

補足

回答ありがとうございます。 タイトルや日時も実際のところ表示されてないです… (検索が行われずホーム画面がそのまま表示されてます) オブジェクトの生成に失敗していますので、$postを$search quearyから渡すか$wpdbから渡すかどちらかになると思うのですが、どうでしょうか?

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

もしかしてphpMyAdminで実行したのでしょうか。 もしそうであれば。 PHPコードに記述するSQLの書き方と、phpMyAdminで実行する書き方は違います。 これまで両方を何度もやってきたので、書き方を比べてphpMyAdminで実行できるSQL文にしてください。

php_learn
質問者

お礼

タイトルや日時が表示されているので、データ取得は問題なさそうです。 エラーメッセージからわかることは、オブジェクトが初期化されていない、とかですが、タイトルや日時が表示されると言うことは、オブジェクトは生成されているので、不思議な現象です。 A.過去の回答から抜粋させていただいたのですが、stringを確認すると、string(0) ""となっていましたので、おそらくの原因はオブジェクトの生成に失敗していることだと思いました。 オブジェクト生成の原因が$wpdbから$postを渡していないことだと考えたのですが、認識に間違いはありますでしょうか? ここで強引に's'という関数を取得しています。 $search_query = get_search_query();→$search_query = filter_input(INPUT_GET, 's');

php_learn
質問者

補足

もしかしてphpMyAdminで実行したのでしょうか。 もしそうであれば。 PHPコードに記述するSQLの書き方と、phpMyAdminで実行する書き方は違います。 これまで両方を何度もやってきたので、書き方を比べてphpMyAdminで実行できるSQL文にしてください。 A.回答ありがとうございます。dell_okさんの過去の回答をみて修正して確認いたしました。 php my adminでは出力されていない削除された記事が出力されている為エラーが起きているようです。 削除した記事がどのデータテーブルに格納されているか調べてそのテーブルからデータを定期的に削除するしかなさそうです… SELECT distinct post.* FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = 'double_rss_feed2' AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE '%テスト%') ORDER BY post.post_date DESC

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

エラーの画像を見てみると、表示されているIDが(16451)と()です。 ID16451とセットの記事を読み込んでいないように見えます。 画像2なので、ID16451にはwhiteを設定しておかないといけないと思いますがどうなっていますか。

php_learn
質問者

お礼

最新の回答になります。加えて伝え忘れたことがあるのですが、オブジェクトの取得に失敗していると思う根拠があります。 異なるワードで検索しても同じ結果で表示されると以前に回答していたのですが、これは画像1タイトル1、画像2タイトル1、画像3タイトル1のコンテンツがそのまま表示されているだけで検索結果はvar_dump($search_query);で確認した通り0件でした。 string(0) "" エラー箇所を削除してもその下でエラーが起きているため共通項の$postからはそのまま記事を引いてこれないのではと考えています。 ※該当コード 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_learn
質問者

補足

回答ありがとうございます。確認してみますと過去に削除した記事でした。 削除したコンテンツがずっと出力されているようです。 もう1つ気になることがあるのですが、下記コードをSQLで試してみたところエラー文が表示されています。 構文のエラーと表示されているのですが、何かしらの問題があるのでしょうか? SELECT distinct post.* FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = %s AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE %s) ORDER BY post.post_date DESC LIMIT %d,%d ※エラー文 静的解析: 解析中に 5 個のエラーが見つかりました。 予期しないトークン。 (near "%" at position 267) 予期しないトークン。 (near "d" at position 268) 予期しないトークン。 (near "," at position 269) 予期しないトークン。 (near "%" at position 270) 予期しないトークン。 (near "d" at position 271) SQL クエリ: ドキュメント SELECT distinct post.* FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = %s AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE %s) ORDER BY post.post_date DESC LIMIT %d,%d MySQL のメッセージ: ドキュメント #1064 - SQL構文エラーです。バージョンに対応するマニュアルを参照して正しい構文を確認してください。 : '%s AND post.post_type = 'post' AND post.post_status = 'publish' AND (post....' 付近 9 行目

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

・サイトを1から作る前にこのエラーを解消しきれずに$search_queryを使わず別の形で代用していたのを思い出しました。 もしかすると$search_queryが使えないのかもしれません。 そんなことがあったのですね。 フォームの変更を試してみてください。 ところで「$search_queryが使えない」と言う表現は正しくありません。 $search_queryは変数でここでのこれにはなんの問題も責任もありません。 使えていないのはget_search_query()の関数の方と言うべきです。 いえ、使えていないと言うよりも、期待した結果を取得してくれない、と言った方が正しいです。 この関数にもおそらく問題や責任はありません。 それゆえに、そこに至るまでの準備ができていないと言うことで、フォームを作り直す、ということになったのでしょうし。 とにかく使えないのは、変数ではなく関数の方だと認識していただければと思います。

php_learn
質問者

補足

※変更分(画像1のみ出力されている) $search_query = filter_input(INPUT_GET, 's'); アドバイスありがとうございます。 $search_queryを変更することで画像1は半ば強引に出力することができましたが、画像2タイトル1,画像3タイトル1でエラーが復活しております。 画像1タイトル1を確認するとstring(3) "ア"と表示されていますので、3件のみ問題なく出力できていて他は該当なしと判断されています。 該当エラー文を確認すると未定義の変数($post)にプロパティを追加しているとのことですが、 データベースからのデータと投稿データは同列に使えないのではないでしょうか? 以前も似たようなエラーに遭遇した記憶があります。 $wpdb->$postのようにしてDBから直接投稿データを取得するしていないことが原因ではないかと考えたのですがdell_okさんの意見がお聞きしたいです。 ※該当箇所 $post->thumbnail = $image_src[0]; ※該当エラー Warning: Creating default object from empty value in /home/zblgibzx/public_html/display.php on line 617 ※該当ファイル https://wandbox.org/permlink/m1XROxQiCkxF4Mt5 ※表示画面(画像1タイトル1) https://imgur.com/kyWlFgE.jpg https://imgur.com/Gr5d4Ob.jpg ※表示画面(画像2タイトル1) https://imgur.com/0lby2gA.jpg ※表示画面 http://www.last.cfbx.jp/?s=%E3%82%A2&tn=1

関連するQ&A