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

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

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

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

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

・まとめかたが難しくどうすればいいのか分からないのですが 難しく考えないでください。 $queryに展開しないだけです。 こうなっているのを、 ---- $query = $wpdb->prepare($sql, $tk, $search_query, $search_query, $search_query, $posts_offset, $posts_per_page); $search_items = $wpdb->get_results($query); ---- こうするだけです。 ---- $search_items = $wpdb->get_results($wpdb->prepare($sql, $tk, $search_query, $search_query, $search_query, $posts_offset, $posts_per_page)); ---- 参考サイトの方法も試してみましょう。 1行目はもともとあるものとおなじです。 もともとの「$sql =~」から全部なくして、「$search_items =」のところが2行目です。 ---- $search_query = get_search_query(); $search_items = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_title LIKE %s", '%'.$wpdb->esc_like($search_query).'%')); ---- 私の方で試したら、それなりのものが表示されました。

php_learn
質問者

お礼

検索フォームとSQLの両方を変更した覚えがありますので、 どちらも変える必要がありそうです。 まったく違う検索フォームを考えてみます。 //検索欄 function display_search_form() { global $tn; ?> <form method="get" id="searchform" class="searchform" action="<?php echo home_url('/'); ?>"> <div class="text-block"> <div class="text-form"> <input type="text" placeholder="ブログ内を検索" name="s" class="searchfield" value="" /> <input type="hidden" name="tn" value="<?php echo $tn; ?>"> </div> <div class="form-bottom"> <input type="submit" value="Q" /> </div> </div> </form> <?php }

php_learn
質問者

補足

アドバイスありがとうございます。おそらくこのエラーは以前も経験しておりました。$search_query の値を確認したところ0となっています。 文字は認識されていますが、IDデータが空なのでデータベースではなく文字の取得の段階でエラーが起きているようです。 サイトを1から作る前にこのエラーを解消しきれずに$search_queryを使わず別の形で代用していたのを思い出しました。 もしかすると$search_queryが使えないのかもしれません。 ※確認コード $search_query = get_search_query(); var_dump($search_query); ※表示コード string(0) ""

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.70

・$sqlと$search_queryは混在できるのでしょうか? 参考サイトを確認すると$sql""で1まとめになっていて、そこに検索条件もあるような気がします。 2重で上書きされているのではないでしょうか? $sqlの外側に$search_queryを書く必要がある気がします。 質問を理解できないでいますが、 どの部分か憶測して回答すると、 参考サイトの書き方にならった方がいいとは思います。 最初に以下の書き方になった経緯はかわかりませんが、 わずかながら疑問がありました。 WordPressの仕様として、 $wpdb->prepare()に直接リテラル(数値や""で括った文字列など)を書けるのかと言う疑問です。 私が普段使っているmysqliと言うモジュールでは直接リテラルを書けないための疑問でした。 ---- $search_query = get_search_query(); ~ $query = $wpdb->prepare($sql, $tk, "%$search_query%", "%$search_query%", "%$search_query%", $posts_offset, $posts_per_page); ---- 参考サイトのような書き方をするなら以下のようにしてみてください。 ---- $search_query = get_search_query(); $search_query = "%$search_query%"; ~ $query = $wpdb->prepare($sql, $tk, $search_query, $search_query, $search_query, $posts_offset, $posts_per_page); ---- とは言っても、この疑問があったので、 私は最初から何度も元の書き方を試して、問題ないことを確認しています。 ですが、"%$search_query%"を何度も書くよりも、 $search_queryを書く方がいいのは思いますので、書き直してください。 質問者さまの聞きたいことが、 参考サイトの以下の書き方についてのことでしたら、 これはしない方がいいと思っています。 どのようなものかと言うと、関数の中に関数を書く、と言うことです。 ---- $posts = $wpdb->get_results($wpdb->prepare($sql, $post_title)); ---- 現在の質問者さまのコードにならうと、以下のように書き直せます。 ---- $query = $wpdb->prepare($sql, $post_title); $posts = $wpdb->get_results($query); ---- こちらの方がいいと思っているのは、 コードが短くなって見やすいのと、 どこからどこまでがその関数の引数なのかわかりやすいのと、 $wpdb->prepare()の結果をデバッグで確認しやすいからです。 ですが、これが問題の原因だと疑うようであれば、 関数の中に関数を書く方法もためしてみてください。

php_learn
質問者

補足

Q.参考サイトのような書き方をするなら以下のようにしてみてください。 ---- $search_query = get_search_query(); $search_query = "%$search_query%"; ~ $query = $wpdb->prepare($sql, $tk, $search_query, $search_query, $search_query, $posts_offset, $posts_per_page); ---- A.修正ありがとうございます。こちらのコードで動作すると踏んでいたのですが、ダメでした。 archive.phpは動作していますので、原因があるとしたらAND (post.post_title LIKE %s)でワードの取得に失敗していることになります。 $query = $wpdb->prepare($sql, $date_query, $date_query); Q.関数の中に関数を書く方法もためしてみてください。 ---- $query = $wpdb->prepare($sql, $post_title); $posts = $wpdb->get_results($query); ---- A.まとめかたが難しくどうすればいいのか分からないのですが、関数の中に関数を書く場合、$wpdb->prepare("SELECT *略")となってしまいます。 今の構成ですと2つテーブルの処理を書くことになってしまうのですが、 SELECT distinct ~~~ "; までの処理をすべて$wpdb->prepare()の中に入れてしまうという認識でいいでしょうか? $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_title LIKE %s", '%' . $wpdb->esc_like( '検索ワード' ) . '%' ) ); ※参考サイト https://www.560designs.com/memo/1298.html ※現在のコード $search_query = get_search_query(); $search_query = "%$search_query%"; $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_title LIKE %s) AND post.post_type = 'post' AND post.post_status = 'publish' ORDER BY post.post_date DESC LIMIT 1,10 "; $query = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_title LIKE %s", $wpdb->esc_like( '検索ワード' ) . '%' ) ); $search_items = $wpdb->get_results($query);

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.69

【検索 その12】 ・WHEREとANDは同じものなのでしょうか?WHEREは全体を示してANDはその中の要素だと認識しているのですが WHEREとANDは同じものではありません。 当時なにをどう説明したかを覚えていないため、 回答No.68で余計にまどわせることを言ったかも知れませんが、 その認識でいいと思います。 ・WHEREは2つ設定できないため、同じテーブルを2回書いてその下に加える必要がありそうです。 その目的と手順がわかりません。 具体的に、どのようにするのか、その結果がどうなるのか、がわかっていますか。 そのSQL文を書いて、phpMyAdminで実行して、希望の結果になるか、を試してみてください。 成功したら、プログラムに組み込むことを検討したらいいかと思います。 ・下記のように条件をタイトルだけに変更してみましたが、関係のない記事が出力されています。 謎ですね。 原因がまったく想像できません。 このままでは、仮に上記のテーブルを2回書く方法でも、いいことにはならないと思います。 もしかして以下のコードがなくなっていませんか。 「テスト」を固定にされた時にこの部分まで消されてそのままになっているのではないでしょうか。 ---- $search_query = get_search_query(); ----

php_learn
質問者

お礼

1つお聞きしたいのですが、$sqlと$search_queryは混在できるのでしょうか? 参考サイトを確認すると$sql""で1まとめになっていて、そこに検索条件もあるような気がします。 2重で上書きされているのではないでしょうか? $sqlの外側に$search_queryを書く必要がある気がします。 ※参考サイト https://tech.cmd08.com/wordpress-sql-wpdb ※該当コード $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_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s) ORDER BY post.post_date DESC LIMIT %d,%d "; $query = $wpdb->prepare($sql, $tk, "%$search_query%", $posts_offset, $posts_per_page);

php_learn
質問者

補足

アドバイスありがとうございます。$search_query = get_search_query();はすでに追加しているのですが、検索結果に結びつきません。 原因の特定がおそらくできました。下記のコードは記事が表示されています。 ①がエラーの原因だと思います。%sでワードの認識ができていないようです。 ②は10件取得できていますし、ワードをどれだけ変えても同じものが表示されているため原因とは考えにくいです。 ①%sのワードが読みとれていないか、AND (post.post_title LIKE '%ア%')→AND (post.post_title LIKE %s) ②最大行数分の取得が間違えているかのどちらかです。 LIMIT 1,10→LIMIT %d,%dの ※表示されているコード $search_query = get_search_query(); $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_title LIKE '%ア%') AND post.post_type = 'post' AND post.post_status = 'publish' ORDER BY post.post_date DESC LIMIT 1,10 "; $query = $wpdb->prepare($sql, $tk, "%$search_query%", $posts_offset, $posts_per_page); $search_items = $wpdb->get_results($query);

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.68

・WHEREが条件でANDがキー項目が複数ある場合とdell_okさんに教わったのですが どのような説明をしたか覚えていませんが、 「複数」と言う言葉で私が言いそうなことを想像すると、 条件が複数ある場合はANDでつなげる、とか、 条件が複数あってそのどれかを満たせばいい場合はORでつなげる、 とかだと思います。 phpMyAdminで試していただくとわかりますが、 以下のようにWHEREを連続して書くとエラーになります。 ---- WHERE meta.meta_key = %s WHERE (post.post_title LIKE %s) ---- 私の環境では問題なく動作していますし、 もともとSQL文には問題ないと思っています。 関係ないものが出ていると思われているのは、 以前も言いましたが、この部分で、 ---- AND (post.post_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s) ---- 検索している対象の項目は、 post_contentの本文と、 post_titleのタイトルと、 post_excerptの抜粋です。 このどれかに検索文字がヒットしているとしか思えません。 関係ないものと言われている記事の各項目を確認してみてください。

php_learn
質問者

補足

Q.どのような説明をしたか覚えていませんが、 「複数」と言う言葉で私が言いそうなことを想像すると、 条件が複数ある場合はANDでつなげる、とか、 条件が複数あってそのどれかを満たせばいい場合はORでつなげる、 とかだと思います。 A.回答ありがとうございます。 WHEREとANDは同じものなのでしょうか?WHEREは全体を示してANDはその中の要素だと認識しているのですが Q.phpMyAdminで試していただくとわかりますが、 以下のようにWHEREを連続して書くとエラーになります。 ---- WHERE meta.meta_key = %s WHERE (post.post_title LIKE %s) ---- A.WHEREは2つ設定できないため、同じテーブルを2回書いてその下に加える必要がありそうです。 ___________________________________________ ※該当ファイル https://wandbox.org/permlink/uD6vFvusKhXZSW2C http://www.last.cfbx.jp/?s=%E3%83%86%E3%82%B9%E3%83%88&tn=1 ※下記のように条件をタイトルだけに変更してみましたが、関係のない記事が出力されています。 この時点で$query = $wpdb->prepare($sql, $tk, "%$search_query%", $posts_offset, $posts_per_page);が原因というのはなさそうです。 あるとしたら$tkになるのですが、こちらはcategory.phpが動いているのを見ると可能性は低いように見えます。 そのほかに考えられることはありますでしょうか? ※該当ファイルのnew-search.phpは記事が検索できていますので、search.phpとのコードの違いが何かしらの影響を与えています。 ※現在表示されている画面(テストで検索していてもタイトルに関係のない記事が出力されている) https://imgur.com/kk7GYRJ.jpg $search_query = get_search_query(); $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 "; $query = $wpdb->prepare($sql, $tk, "%$search_query%", $posts_offset, $posts_per_page);

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.67

・先にお聞きしたいのですが説明の際に下記のURLを用いることがあるのですが、dell_okさんの環境ではどちらも表示されますでしょうか? はい、どちらも同じ記事が表示されています。 ひとつ目のURLをブラウザのアドレスバーに貼り付けて表示すると、ページが表示されるとともにアドレスバーの文字も「ア」表記になります。 読める文字にしてくれるのはChromeの仕様なのかも知れません。

php_learn
質問者

補足

確認ありがとうございます。説明の際にURLが見れないのではないかと心配しておりました。

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.66

・ページナビのSQL文のpost.post_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s で抜粋かコンテンツの一部から共通の項目が存在しているのではないかと考えました。 ページナビのSQLは件数のみを取得していて記事は取得していないので関係ありません。 前にも言った通りページナビのリンク(URL)は問題があるのでで、ページナビのリンクはクリックしないでください。

php_learn
質問者

お礼

※正常に表示されたコードで調べてみたところ検索ワードに該当する記事が表示されました。 コンテンツやカテゴリーが原因ではなく検索欄を通すのが原因のようです。 meta.meta_key = %s か AND (post.post_title LIKE %s)が記事の取得に制御をかけていることが想定されるのですが、AND()が記事の締め付けにつながっているのではないでしょうか? WHEREが条件でANDがキー項目が複数ある場合とdell_okさんに教わったのですが、おそらく下記のようにする必要がありそうです。WHEREを設定する場合1つに付きFROMで1テーブルの指定が必要だと思うのですが、どうするのがいいでしょうか? まとめ方が良くわかりません。アドバイスお願い致します。 WHERE meta.meta_key = %s WHERE (post.post_title LIKE %s) _________________________ ※正常に表示されたコード $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 "; $query = $wpdb->prepare($sql, $tk, "%$search_query%", $posts_offset, $posts_per_page);

php_learn
質問者

補足

解答ありがとうございます。すべて同じコンテンツが表示されるのは勘違いでした。アという記事を10件用意してみたところテストという記事は出力されていません。 9件に調節してみたところ1件他の記事が補充されていないため、検索結果が10件未満でも心配の必要は今のところなさそうです。 先にお聞きしたいのですが説明の際に下記のURLを用いることがあるのですが、dell_okさんの環境ではどちらも表示されますでしょうか? http://www.last.cfbx.jp/?s=%E3%82%A2&tn=1 http://www.last.cfbx.jp/?s=ア&tn=1 ※表示画面 https://imgur.com/B3nWeTg.jpg new-search.phpの方では該当の記事のみ出力されていて、search.phpの方では該当記事+関係ない記事が出力されています。 見比べながらどこが間違えているのか考え中です。 https://wandbox.org/permlink/uD6vFvusKhXZSW2C

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.65

count() のエラーはSQL文の変数とパラメータの数があっていないためです。 以下の部分を削除してみてください。 ---- LIMIT %d,%d ----

php_learn
質問者

補足

1つ前の回答を誤認していました。申し訳ありません。 SQLを直接php my adminで検索したときは、AND (post.post_title LIKE '%テスト%')に該当する記事のみ出力されたのですが、 サーバーで実行すると関係のない記事が出力されています。 自分で原因を考えてみたのですが、ページナビのSQL文のpost.post_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s で抜粋かコンテンツの一部から共通の項目が存在しているのではないかと考えました。 http://www.last.cfbx.jp/?cp=2&tn=1 $sql = " SELECT COUNT(*) AS count 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_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%"); $results = $wpdb->get_results($query); ※表示されている記事 https://imgur.com/eDZj0OV.jpg https://imgur.com/t3l7aHC.jpg('テスト'とタイトルが一致しない記事が表示されている) ※SQLで調べたときに表示されている項目(投稿テストのみ取得されている) https://imgur.com/OEamigy.jpg

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.64

・※確認用コード(meta.meta_key = ''のところはパターンごとに変化します。) このSQLの準備処理の関数の引数はどうなっていますか。 $query = $wpdb->prepare(引数); と、それはそれで気になるのですが、適切でないと想像してます。 なので、いっそのこと以下の部分を削除して、パラメータ不要のSQLにした方が安全な気がしました。 LIMIT %d,%d 関数のところは、これだけに。 $query = $wpdb->prepare($sql);

php_learn
質問者

補足

・※確認用コード(meta.meta_key = ''のところはパターンごとに変化します。) このSQLの準備処理の関数の引数はどうなっていますか。 $query = $wpdb->prepare(引数); と、それはそれで気になるのですが、適切でないと想像してます。 なので、いっそのこと以下の部分を削除して、パラメータ不要のSQLにした方が安全な気がしました。 LIMIT %d,%d 関数のところは、これだけに。 $query = $wpdb->prepare($sql); A.回答ありがとうございます。検索の部分はごっそり削除していました。検索欄のワードを指定していればそのまま表示できるかと考えていまして。 下記のようにコードを修正してみたところエラーが発生しております。 display.phpにおいてWarning: count(): Parameter must be an array or an object that implements Countable in /home/zblgibzx/public_html/display.php on line 6 該当のエラー箇所はこちらです。if (0 === count($post_items)) { ※対象ファイル https://wandbox.org/permlink/ewiJwAtdkvDaEIiU エラー対策としてif (is_array($pages)) { を加えたところ部分的なエラーは解消したのですが、配列のデータが入っていないというエラーが出てきました。 Warning: Invalid argument supplied for foreach() in /home/zblgibzx/public_html/display.php on line 13 ※エラー対策として追加したコードについて https://growcal.jp/wordpress/warning-count/ ※修正後のコード $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 = 'single_rss_feed1' AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE '%テスト%') ORDER BY post.post_date DESC LIMIT %d,%d "; $query = $wpdb->prepare($sql); $search_items = $wpdb->get_results($query);

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.63

ページナビに問題があるのはわかっていて放置していましたので、今はページナビを使用しないでください。 ここを直すのは最後でいいと思います。 なぜ放置していたかと言うと、記事の取得に変更が入る恐れがあったからです。 特に、検索とカテゴリーはこれまで何度かSQLを変更してきたかと思います。 ページに表示する記事取得のSQLに変更があれば、ページナビのSQLも同様に変更する必要があります。 前者は現在ページに表示する件数分だけのもので、後者は全ページの件数分のもの、と言う範囲の違いはありますが、JOINするテーブルや抽出するWHEREの条件などは基本的に同じになるであろうからです。 前者を直すたびに後者も直せばいいだけのことではありますが、完全に正解だと言えないないものを毎回反映させるのはどうかなと思っています。 SQLとは別に、ページナビには付加する必要があるパラメータもあります。 現在がどのページであるかを判定するなどして、パラメータを付加する必要があるのですが、これも、他のページ遷移が確定しない間は、その都度直すのもどうかなと思っています。 そう言うわけで、ページナビはまだ使わない直さないでいいと思っています。 まずは1ページ目が正しく表示されることを優先しましょう。

php_learn
質問者

補足

アドバイスありがとうございます。1ページ目の検索がうまくいくように修正致します。

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (743/5656)
回答No.62

【検索 その11】 ・single_rss_feedのテストとつけられた記事が出力されております。 それらが表示されるべきデータですね。 こちらからアクセスしてみましたが、「投稿」のところに何も表示されていないですね。 このままでは、取得できていないのか、取得したものが表示されていないのか、判断できないですね。 確認用のコードを作ってみました。 display.phpの先頭に以下のコードを追加してください。 取得した記事データをテスト表示するものです。 ---- const TEST_MODE = true; function test_display_posts() { global $post_items; if (0 === count($post_items)) { echo '<h1>データなし</h1>'; return; } echo '<table>'; foreach ($post_items as $item) { set_other_data($item); echo '<tr>'; echo "<td>{$item->ID}</td>"; echo "<td>{$item->post_title}</td>"; echo "<td>{$item->guid}</td>"; echo "<td><img src=\"{$item->thumbnail}\"></td>"; echo '</tr>'; } echo '</table>'; } ---- それと、search.phpの表示のところも以下のようにしてください。 ---- // 表示 if (TEST_MODE) { test_display_posts(); } else { if (1 == $tn) { display_rss_post_1(); } else { display_rss_post_2(); } } ---- データに問題やエラーがなければ、「データなし」が表示されるか、取得したデータが表示されるかのどちらかです。 確認が済んだら、1行目のところの true を false にしておいてください。 ---- const TEST_MODE = false; ---- この ture と false を切り替えることでテスト表示と本番表示を切り替えできます。 検索ページ以外でも表示処理のところを変えれば使えます。 ---- if (TEST_MODE) { test_display_posts(); } else { 元の表示処理 } ----

php_learn
質問者

お礼

【検索 その11】 こちらからアクセスしてみましたが、「投稿」のところに何も表示されていないですね。 このままでは、取得できていないのか、取得したものが表示されていないのか、判断できないですね。 A.修正ありがとうございます。double_rss_feed2とtriple_rss_feed3で試してみたところエラーは発生しておらず検索が適切に動作しておりません。 テストと関係ない記事が表示されており、別のワードに変更しても同じものが表示されます。 画像3タイトル1のページにテストと名付けたコンテンツを3つ配置して検索をかけると表示されたのは0件でした。 10件配置しても検索が空でした。 single_rss_feed1も同様に空なのですが、何故か検索ページの2ページ目は表示されます。 1ページ目もページナビを介して戻るとURLが変わりコンテンツが出力されます。 原因がわからないのでアドバイスいただけると助かります。 http://www.last.cfbx.jp/ 検索コンテンツがどのワードで調べても同じ項目が出力される問題はあいまい検索と通常の検索のコードの違いか、 記事の内容からも検索を入れていることが原因として考えられますので、後ほど修正してみます。 ※single_rss_feed1 https://imgur.com/6oYpwSu.jpg https://imgur.com/VOoAQkx.jpg ※double_rss_feed2 https://imgur.com/XMmMyWn.jpg https://imgur.com/zHBSmoq.jpg ※triple_rss_feed3 http://www.last.cfbx.jp/画像3タイトル1/ https://imgur.com/2TlDPOB.jpg(画像3タイトル1ページでテストで検索) https://imgur.com/B1AldwN.jpg(画像3タイトル1のコンテンツ) ※確認用コード(meta.meta_key = ''のところはパターンごとに変化します。) $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 = 'double_rss_feed2' AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE '%テスト%') ORDER BY post.post_date DESC LIMIT %d,%d ";

php_learn
質問者

補足

No.59の回答になります。 Q.私が使っているプラグインは「WP-Optimize」です。 いろいろと不要っぽいデータを削除してくれます。 A.アドバイスありがとうございます。インストールして使わせていただきます。 Q.まずは重複しているかどうかを確認してみてはいかがでしょうか。 記事IDを表示するようにして、同じ値のものが表示されているかどうかを確認してみてください。 画像の横か下に記事IDをカッコ括りで表示します。 関係ないもの、が表示されることについては、改めて確認方法を提案したいと思います。 A.アドバイスありがとうございます。1つだけ大きな発見があったのですが、ダイレクトに検索したときとページナビを使い2ページめまで開いてから1ページ目に戻った時のURLが違います。 2ページ目から1ページ目にさかのぼった時にはエラーが消えていてコンテンツが表示されています。 ※2ページ目はエラーなく表示されています。1ページ目は2ページ目から1ページ目に戻るとエラーが消えていて、URLも変わっています。 まずはここから修正した方が良さそうです。 現在大きく分けて3つ問題があります。1つめは検索ワードと関係ない記事が出力されている(どのワードで検索しても同じ記事が出る)。2つめはページナビをはさんだ時とダイレクト検索でURLが違う。 3つめは記事が重複で出力されている。 1つめはあいまい検索に原因がありそうです。検索基準を限定して厳しくしてみます。2つめの原因はよくわかりません。3つめは関係ない記事の対処としてデータの削除が必要になります。 ※http://www.last.cfbx.jp/画像2タイトル1/から検索した場合 https://imgur.com/47NtpKk.jpg ※2ページ目から1ページ目に戻った場合 https://imgur.com/EjhDuOq.jpg ※記事の重複 https://imgur.com/TdapfKo.jpg ※ダイレクト検索 http://www.last.cfbx.jp/?s=テスト&tn=2 ※ページナビをはさんで検索 http://www.last.cfbx.jp/画像2タイトル1/?cp=2&tn=2

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • wordpressで投稿記事を3パターン表示したい

    投稿記事を3ファイルに分けて表示したいのですが、うまくいかず全てpage.phpとして表示されます。振り分けることができないのですが、アドバイスよろしくお願いします。 前提として page.php page-secound.php page-third.phpの3ファイルがあり固定ページのテンプレートにしている。 <?php /* Template Name: 画像2タイトル1 Template Post Type: page */ ?> <?php /* Template Name: 画像3タイトル1 Template Post Type: page */ ?> 以下のカスタムフィールド名を各記事に割り振っております。 single_rss_feed1 duuble_rss_feed 2 triple_rss_feed 3 ※1つ目の方法 <!--index.phpの文頭に書くコード--!> <?php if(get_post_meta($post->ID,'single_rss_feed1',true) == 'A'): ?> <?php include(('main-first.php') == 'A'); ?> <?php elseif (get_post_meta($post->ID,'duuble_rss_feed2',true) == 'B'): ?> <?php include(('page-secound.php') == 'B'); ?> <?php elseif (get_post_meta($post->ID,'triple_rss_feed3',true) == 'C'): ?> <?php include(('page-third.php') == 'C'); ?> <?php else: ?> <?php endif; ?> _______________________________ ※2つ目の方法 <!--functions.phpに書くコード--!> function custom_template_include($template) { global $post; if (!is_page()) return $template; if (get_post_meta($post->ID, ' duuble_rss_feed 2')) $new_templete = locate_template(array('sub-secound.php')); if (get_post_meta($post->ID, ' triple_rss_feed 3')) $new_template = locate_template( array( 'sub-third.php' )); if (!empty($new_template)) return $new_template; return $new_template; }

    • ベストアンサー
    • PHP
  • WordPressの質問(q10113307)の続

    「保存するファイル名につかってはいけない」とのことなのですが、user_add_check.phpの<input type="hidden" name="image_name" value="<?= $user_image['name'] ?>">を使う事はアウトなようです。 自分なりに参考サイトを見て考えてみたのですが、$_SESSION['image']['data']が機能しているのか分からない状態です。 自信がないため2パターン考えてみました。 ※参考サイト https://qiita.com/ryouya3948/items/66294cb445663f2a9d95 user_add.php(要らないもの?) <h2>新規登録</h2> <form method="post" action="user_add_check.php" enctype="multipart/form-data"> <input type="text" name="name" class="user_name_input" placeholder="ユーザー名"> <input type="file" name="image" id="my_image" accept="image/*" multiple> <input class="btn btn-outline-info" type="button" onclick="history.back()" value="戻る"> <input class="btn btn-outline-dark" type="submit" value="登録"> </form> user_add_check.php(入力画面) <?php session_start(); //ファイルの内容を全て文字列に読み込む $_SESSION['userfile']['data'] = file_get_contents($_FILES['userfile']['tmp_name']); //アップロードされたファイルの種類を確認--送られてくる MIME タイプは信用できない--メッセージ全体を偽装できる $_SESSION['userfile']['type'] = exif_imagetype($_FILES['userfile']['tmp_name']); $_SESSION['userfile']['type'] = mime_content_type ($_FILES['userfile']['tmp_name'] ); //画像であるかどうかをexif_imagetype()を使って判別--画像のみ分ける必要があるのか不明 //$_SESSION['userfile']['type'] = exif_imagetype($_FILES['image']['tmp_name']); ?> <img src="image.php"> <form method="post" action="user_add_done.php"> <input type="hidden" name="name" value="<?= $user_name ?>"> <input type="hidden" name="image_name" value="<?= $user_image['name'] ?>"> <input type="button" class="btn btn-outline-info modal_close" onclick="history.back()" value="戻る"> <input type="submit" class="btn btn-outline-dark" value="OK"> </form> image.php(確認画面 バイナリーデータ確認) <?php $load_name = $ext session_start(); switch ($file_ext == $_SESSION['userfile']['type']) { case IMAGETYPE_JPEG: header('content-type: image/jpeg'); break; case IMAGETYPE_PNG: header('content-type: image/png'); break; case IMAGETYPE_GIF: header('content-type: image/gif'); break; case MIME_TYPE_PDF: header('content-type: application/pdf'); break; case MIME_TYPE_MP4: header('content-type: video/mp4'); break; } ?> <?php $load_name = $ext session_start(); switch ($file_ext == $_SESSION['userfile']['type']) { //jpegを表示 case IMAGETYPE_JPEG: header('content-type: image/jpeg'); echo $_SESSION['image']['data']; break; //pngを表示 case IMAGETYPE_PNG: header('content-type: image/png'); echo $_SESSION['image']['data']; break; //pdfを表示 case MIME_TYPE_PDF: header('content-type: application/pdf'); echo( substr( $_SESSION['image']['data'], 0, 5 ) ); break; //mp4を表示 case MIME_TYPE_MP4: header('content-type: video/mp4'); echo( substr( $_SESSION['image']['data'], 4, 4 ) ); break; } ?> ___________________________________________________________ image.php(確認画面 バイナリーデータ確認) <?php function get_file_ext($ext) { //MIMEタイプを取得 $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime_type = finfo_file($finfo, $_SESSION['image']['data']);/*$GET['image']['data']*/ if (FILE_EXT_PNG == $ext && 'image/png' == $mime_type) { } elseif (in_array($ext, [FILE_EXT_JPEG, '.jpg']) && 'image/jpeg' == $mime_type) { $ext = FILE_EXT_JPEG; } else { // バイナリー文字列確認 $contents = file_get_contents($_SESSION['image']['data']); if (FILE_EXT_PDF == $ext && 'application/pdf' == $mime_type && '%PDF-' == substr($contents, 0, 5)) { } elseif (FILE_EXT_MP4 == $ext && 'video/mp4' == $mime_type && 'ftyp' == substr($contents, 4, 4)) { } else { $ext = null; } } return $ext; } ?> user_add_done.php(表示画面 保存拡張子) $_SESSION['image']これを使う //文字列をファイルに書き込む関数 file_put_contents('./image/',$_SESSION['image']);

    • ベストアンサー
    • PHP
  • WordPressの質問(q10165331)の続

    URLを連番にすべきかuuidにすべきか迷っているのですが、どちらが良いと思われますでしょうか? 一連番号のIDを避けるべきなのであればメジャーなサイトはすべてランダム文字列になっているはずではないかという意見とURLが予測しやすいと攻撃しやすいという意見があるようです。 IDを付ける際にBase58を使う、N 進数の文字列を使うなどuuid意外にも色んな方法があるようで、どうすべきか分かりません、アドバイスお願い致します。 $url = home_url('質問表示画面?'.$row->ID); ※idをautoincrementしない方が良い理由 https://zenn.dev/praha/articles/3c84e3818891c3 ※ユーザIDを連番にしてURLに使っても問題ない https://teratail.com/questions/364664 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11270700181 ※短縮URLの付け方 https://sousaku-memo.net/php-system/71 https://co.bsnws.net/article/256 ※htmlspecialcharsでIDをエスケープ http://lovee7.blog.fc2.com/blog-entry-34.html 質問一覧表示(single-que_list.php) 回答可能なページ(single-complete.php) <?php /* Template Name: que_list 固定ページ: 質問一覧画面 */ get_header(); $sql = 'SELECT * FROM sortable'; $query = $wpdb->prepare($sql); $rows = $wpdb->get_results($query); $upload_dir = wp_upload_dir(); foreach ($rows as $row) { $url = home_url('質問表示画面?'.$row->ID); $pattern = $upload_dir['basedir'].'/attach/'.$row->ID.'_0.*'; $files = glob($pattern); if (empty($files)) { $view = '<img src="ダミー画像パス">'; } else { $info = pathinfo($files[0]); $attach_url = $upload_dir['baseurl'].'/attach/'.$info['basename']; $ext = $info['extension']; switch ($ext) { case 'jpeg': case 'png': $view = '<img style="height: 50px;" src="'.$attach_url.'">'; break; case 'mp4': $view = '<video style="height: 50px;" src="'.$attach_url.'">'; break; case 'pdf': $view = '<iframe style="height: 50px;" src="'.$attach_url.'"></iframe>'; break; default: $view = ''; break; } } echo '<div><a href="'.$url.'">'.$row->unique_id; echo '<div>'.$row->namae.'</div>'; echo '<div>'.$view.'</div>'; echo '<div>'.mb_strimwidth($row->message, 0, 38, '・・・').'</div>'; echo '</a></div>'; } ?>

    • ベストアンサー
    • PHP
  • WordPressの質問(q10155839)の続

    var_dump($row);で確認したところ登録結果画面と質問表示画面でNULLが表示されております。 コードをたどったところ質問表示画面の$sql = 'SELECT * FROM sortable WHERE URL=%s';で取得に失敗しているのではないかと考えたのですが、エラー原因は分かりますでしょうか? ※データベースにURLは格納されております。 https://imgur.com/5RmSq2Y.jpg ※該当コード $url = substr($_SERVER['REQUEST_URI'], -36); $sql = 'SELECT * FROM sortable WHERE URL=%s'; $query = $wpdb->prepare($sql, $url); $rows = $wpdb->get_results($query); var_dump($row); if (empty($rows)) { echo '質問がみつかりません'; exit; } ________________________________________________________________________ Q.テーブルにカラムを追加して保存するようにしてみてください。 A.アドバイスありがとうございます、下記コードでIPアドレスは保存できるようですが、入力画面、確認画面、表示画面どのタイミングで追加すべきでしょうか? $ip_address = $_SERVER["REMOTE_ADDR"]; //文字列形式から数値 に、数値から文字列形式に変換 $ip_long = ip2long($ip_address); -- ipアドレスのテーブル CREATE TABLE tbl_ips ( `ip` INT(10) NOT NULL ); $sql = "INSERT INTO tbl_ips ( ip ) VALUES ( INET_ATON( $ip ) );" Q.こんな感じになります。 メッセージの一部、については以前やったことがあると思いますので、$row->messageから取得するようにしてみてください。 A.アドバイスありがとうございます、メッセージの一部を取得というコードを考えてみました。1点質問があるのですが、<a href="'.$url.'"></a>を名前、画像、メッセージ全体に1つだけかけたい場合どのようなコードにすればよいのでしょうか? ---- <?php /* Template Name: 質問一覧画面 */ get_header(); $sql = 'SELECT * FROM sortable'; $query = $wpdb->prepare($sql); $rows = $wpdb->get_results($query); $upload_dir = wp_upload_dir(); foreach ($rows as $row) { $url = home_url('質問表示画面?'.$row->URL); $pattern = $upload_dir['basedir'].'/attach/'.$row->ID.'_0.*'; $files = glob($pattern); if (empty($files)) { $view = '<img src="ダミー画像パス">'; } else { $info = pathinfo($files[0]); $attach_url = $upload_dir['baseurl'].'/attach/'.$info['basename']; $ext = $info['extension']; switch ($ext) { case 'jpeg': case 'png': $view = '<img style="height: 50px;" src="'.$attach_url.'">'; break; case 'mp4': $view = '<video style="height: 50px;" src="'.$attach_url.'">'; break; case 'pdf': $view = '<iframe style="height: 50px;" src="'.$attach_url.'"></iframe>'; break; default: $view = ''; break; } } echo '<div><a href="'.$url.'">'.$row->namae.'</a></div>';    echo '<div>'.$view.'</div>'; echo '<div>'.mb_strimwidth($row->message, 0, 38, "・・・").'</div>'; } ---- 昨日教えて頂いた質問掲示板 登録結果画面のタイトルから飛べるページをリンク先として考えておりました。 http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%80%80%e7%99%bb%e9%8c%b2%e7%b5%90%e6%9e%9c%e7%94%bb%e9%9d%a2/

    • ベストアンサー
    • PHP
  • PHPで一部サイトからRSS情報を取得できない

    PHPを使用して、他のサイトからRSS情報を取得し、 DBにデータを格納する、というような処理をするバッチを作成しています。 SimplePieという無料のライブラリを使用し、 下記のようなファンクションを作成しました。 /* ================= * * RSS情報を最大5件取得 * =================*/ function get_rss_info($feed_url) { // 戻り値 $rss_list = array(); // RSSデータを取得 $feed = new SimplePie(); $feed -> enable_cache(false); $feed -> set_feed_url($feed_url); $feed -> init(); $feed->handle_content_type(); // 過去記事を最大5記事まで取得 $feedItems = $feed -> get_items(0, 5); foreach($feedItems as $item) { // ※自作クラスです $rss = new RSS(); $rss->rss_id = $item -> get_id(); $rss->rss_title = $item -> get_title(); $rss->published_date = $item -> get_date('Y/m/d H:i:s'); $rss->rss_url = $item -> get_permalink(); $rss->rss_text = $item -> get_description(); array_push($rss_list, $rss); } return $rss_list; } 上記のファンクションで、アメブロなどのRSS情報は取得できますし、 一部WordPressサイトのRSS情報も問題なく取得することが出来ました。 しかし、一部のWordPressサイトでは、上記のファンクションを通しても 1つもRSS情報を取得することが出来ず、 配列も空のままで返却されてしまっております。 Feedlyなどの外部サービスで情報が取得できているので、 私のプログラムが悪いのだとは思っているのですが・・・ 自分なりに調査をしてみたのですが、 全く糸口を掴むことができませんでした。 お知恵を貸していただければと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • FlashからPHPへの変数の渡し方について

    初めまして。beterugiusと申します。 ご質問したいのですが、 まず、上下2フレームのindex.phpファイルがあります。 FLASHファイル(top_image.fla)は、シングルフレームのjpegイメージ(三枚の画像をPhotoShopで合成して、一枚のイメージにしてある。)です。 その.flaファイルを書き出した、.swfコンテンツ上をマウスが移動 すると、コンテンツ上のどの部分にマウスがあるかで、下フレームのTHMLが切り替わるようにしたいので、top_image.swf から、index.phpに対して、GETメソッドでページ番号の変数自身を 渡したいのですが、実際にFLASHコンテンツ上をマウスで動かしてみると、ブラウザのアドレス欄に、GETメソッドのクエリー文字列の「?」 だけは追加されているのですが、肝心の変数が渡されておらず、 下フレームのHTMLも切り替わりません。 どうすればちゅんと動くのか、どなたかご回答いただけないでしょうか? -------------------------------------------------------------- 「top_image.fla」 var sendObj:LoadVars = new LoadVars(); var page:Number; function onMouseMove(){ var x:Number = top_image._x; // グラフィックの中心座標 var y:Number = top_image._y; if( 0 <= y && y <= 316 ){ if( 0 <= x && x <= 255 ){ page = 1; sendObj.send("../php/index.php", "page", "GET"); } else if( 256 <= x && x <= 512 ){ page = 2; sendObj.send("../php/index.php", "page", "GET"); } else if(513 <= x && x <= 766 ){ page = 3; sendObj.send("../php/index.php", "page", "GET"); } } } -------------------------------------------------------------- 「index.php」 <html> <head><title>ActionScript2.0</title> <meta http-equiv="content-type" content="application/x-www-form-urlencoded"> </head> <frameset rows="350,*"> <frame name="top" src="../html/top.html"> <?php // Action ScriptからのPOSTデータの取得 $page = $_GET['page']; switch($page){ case 1: print("<frame name='bottom' src='../html/bottom1.html'>"); break; case 2: print("<frame name='bottom' src='../html/bottom2.html'>"); break; case 3: print("<frame name='bottom' src='../html/bottom3.html'>"); break; } if(is_null($page)){ // $page変数の中身がNULL(未定義)の場合 print("<frame name='bottom' src='../html/blank.html'>"); } ?> </frameset> </html> -------------------------------------------------------------

    • ベストアンサー
    • Flash
  • functionsでどこまで括るのが正解なのか

    RSSを取得→格納→表示→定期的にキャッシュをphpで行っております。 index.phpにすべて記載したところfunctions.phpを利用したほうが良い、require_onceでpage.phpなどからindex.phpに読み込むようご指摘をいただいたので、コードを考えてみたのですがどの範囲までfunctionで括るのが正解なのかわかりません。 意見がわかれておりまして、役割によって分けるべきという方と、page.phpのみfunctions.phpを使いそのほかはrequire_onceで読み込めばいいという方と、すべてrequire_onceで読み込めばいいという方の3パターンありました。 どの方法が1番適切でしょうか?コードは以下になります。 <?php //別ファイルにして読み込む場合 function db($hlxclitx_wp1){//DB名を引数として受け取る $dbname //DB接続 try { $pdo = new PDO(“mysql:dbname=”$hlxclitx_wp1”_name;host=”localhost”;charset=utf8″,”hlxclitx_wp1”,”E.HrypHWxNmltXgC5eS26”)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; }catch (PDOException $e) { echo $e->getMessage(); return $db = null; } } // カテゴリーIDをキーにしたカテゴリー配列を生成 function get_category_name_by_id($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); } //古いデータを削除 //※先に実行する //ものがないものはfunctons.phpに書いても使えないので、require_onceでまとめて読み込む認識 function delete_date_pdo($delete_date) { $sql = 'DELETE FROM rss_feed WHERE date < ?'; $stmt = $dbh->prepare($sql); $delete_date = date('Y-m-d H:i:s', strtotime('-1 week')); //※削除対象日付 $stmt->execute([$delete_date]); } //RSS保存 function save_url_rss($stmt){//本来は値がほしいところでfunction{}するのだろう長さの加減がわからず $url1 = [ 'http://nns2ch.net/index.rdf', 'http://aqua2ch.net/index.rdf', 'https://worldfn.net/index.rdf', ]; $stmt = $dbh->prepare('insert into rss_feed (title, link, date, img) values (?, ?, ?, ?) on duplicate key update title=?, link=?, date=?, img=?'); 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)); //※削除対象日付より古いRSSは保存しない 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]); } } } function one_page_count($post_items){ //表示設定 $current_page = $_REQUEST['page'] ?? 1; //現在ページ $block_per_page = 2; //ページあたりブロック件数 $rss_per_block = 18; //ブロックあたりRSS件数 $posts_per_block = 5; //ブロックあたり投稿件数 //RSS読み込み $rss_per_page = $block_per_page * $rss_per_block; //ページあたりRSS件数 $rss_offset = ($current_page - 1) * $rss_per_page; //RSSオフセット $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); } ?>

    • ベストアンサー
    • 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
  • Wordpressでのphp(投稿ナビを非表示に)

    WordpressでWebサイトを制作中です。 トップページに最新の投稿が表示できるようにしたのですが、その下に自動的に挿入されるページナンバー(次のページへの遷移)が動作しません。 (画像の、1,2,3、、、、13 のナンバーの部分です) 恐らく、Wordpressの「投稿」ページではなく、固定ページであるトップページにこの機能を組み込んだためかと思うのですが、特にページナンバーを表示させる必要がないため、ページナンバーだけを削除あるいは非表示にしたいのですが、phpの該当部分を削除すればいいのでしょうか? phpの知識がないために、お教えください。 Wordpressのファイル「page-home.php」の中に記述されてある中で、恐らく該当部分は以下かと思うのですが、この中で、どの部分を削除すればいいのでしょうか? 部分的に何度か削除してアップロードして試してみたのですが、不思議なことに、どの部分を削除しても、ページナンバーは消えません。 --------------------------------------------------- <!--LATEST POSTS--> <?php if(of_get_option('latstpst_checkbox') == "1"){ ?> <?php $args = array( 'post_type' => 'post', 'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1)); query_posts($args); ?> <?php get_template_part(''.$zn_lays = of_get_option('layout_images', 'layout1').''); ?> <?php } else { ?> <?php } ?> <!--LATEST POSTS END--> -------------------------------------------------------- ちなみに、Wordpressは最新のバージョン 4.9.5–ja、 テンプレートの「Ttheron_lite」を利用しています。 情報として不足部分がありましたら、申し訳ありません。 ご指摘くださいましたら、情報を追加いたします。 なお、ブラウザに表示後にHTMLソースから、ナンバー部分に相当しそうな 部分のクラスに対して、 display: none; をstyle.cssに記述することも試してみたのですが、 やはり表示は消えません。 参考:http://evm-label.com/2015/05/wp_postnavi_hide01/ HTMLソースでは、この部分のようです。 <div class="thn_paginate"><span class='amp_title'>Pages:</span><a href='...../wp/' class='amp_page amp_current'>1</a><a href='...../wp/page/2/' class='amp_page'>2</a><a href='...../wp/page/3/' class='amp_page'>3</a><a href='...../wp/page/4/' class='amp_page'>4</a><a href='...../wp/page/5/' class='amp_page'>5</a><a href='...../wp/page/6/' class='amp_page'>6</a><a href='...../wp/page/7/' class='amp_page'>7</a><span class='amp_gap'>...</span><a href='...../wp/page/13/' class='amp_page'>13</a><a href='...../wp/page/2/' class='amp_next'>&raquo;</a></div> <div class="hidden_nav"></div> リンクのURL部分は、サイト公開前のために、伏せています(問題ありますでしょうか?) よろしくお願いいたします。

    • 締切済み
    • PHP
  • エスケープ処理

    どうも初めまして。 switch文を用いてページを振り分けてますが、 この場合$_GETはhtmlspecialcharsでエスケープ処理するべきでしょうか?それともSQL構文が入力されることも考えられるのでmysql_real_escape_string()も使うべきなのでしょうか? ああ混乱してます><; どなたか、よろしくお願いします if(isset($_GET['page'])){ $page = $_GET['page']; }else{ $page = "home"; } switch ($page) { case 'home': require ("home.php"); break; ~同じようなのが複数~略 default: echo "ページが見つかりませんでした"; break; }

    • ベストアンサー
    • PHP