• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:RSSをデータベースに格納できない)

RSSをデータベースに格納できない

このQ&Aのポイント
  • 昨日教えていただいたコードで格納して表示するところまで成功しました。自分の不注意でデータベースネームと違う、新規作成したテーブルに格納していたため起こったエラーでした。申し訳ありません。
  • 再度全体のコードと組み合わせてみたのですがエラーが起こり困っております。Uncaught Error: Call to a member function insert() on null
  • <?php $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf', ]; foreach ($url1 as $url) { $count = 0; $rss = simplexml_load_file($url); foreach ($rss->item as $item) { if ($count >= 8) { break; } ++$count; $title = (string) $item->title; //「$item->title」だけではうまくいかないのでstringにキャスト $link = (string) $item->link; //以下同じ $thumb = (string) $item->thumb->url; $content = (string) $item->description; $wpdb->insert('rssfeed', ['title' => $title, 'link' => $link, 'thumb' => $thumb, 'content' => $content], ['%s', '%s', '%s', '%s']); } } $results = $wpdb->get_results('SELECT * FROM rssfeed'); foreach ($results as $item) { echo $item->title.'<br>'; } ?> <?php $wpdb->show_errors(); ?>

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

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

お礼 2022/02/09 18:47 ・cronを同じサイトで複数実装してもエラーにはならないでしょうか? WordPressのCronを試してみました。 CronスケジュールひとつにCronイベントを複数登録できました。 エラーにはならいようです。

php_learn
質問者

お礼

期間をけてからの質問で申し訳ないのですが、コードを整理中に修正が必要な個所があり原因がわかりません echo "<li class=\"sitedate\">{$item->date}</li>"; で画像やカテゴリーなどは表示できるのでしょうか? 個別に指定して表示する必要があるのでしょうか? 1.投稿に画像やカテゴリーなどが表示されず、タイトルと日付けのみ表示されている 2.RSS画像にURLがついておらず画像のみ表示されている ※該当箇所 if (!empty($item->img)) { echo "<li><img src=\"{$item->img}\" width=\"100\"></li>"; } 3.RSSの画像がない場合ダミー画像を表示させたいが書き方が調べてもわからない

php_learn
質問者

補足

ありがとうございます。 引き続きコードを組んでみます…

その他の回答 (69)

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

お礼 2022/01/30 21:05 「echo "<li><a href=\"{$item->guid}\"><span class="img-wrap">{$item->post_thumbnail}</a></span></li>"; こちらの文を以下と同じく画像がないならダミー画像を表示するようにしたいのですが、どうすればよいでしょうか?」 このような場合は、phpのechoをやめて、タグごとに改行してみます。 <li> <a href=\"{$item->guid}\"> <span class="img-wrap"> {$item->post_thumbnail} </span> </a> </li> 条件に影響を受けないものはHTMLメインで出力するように、影響を受ける箇所をifにしてみます。 <li> <a href="<?php echo $item->guid; ?>"> <span class="img-wrap"> <?php if ($item->post_thumbnail) { // 存在する echo "<img src=\"{$item->post_thumbnail}\">"; } else { // 存在しない echo '<img src="noimage.jpg">'; } ?> </span> </a> </li> こんな感じでできそうでしょうか。 以下は補足です。 あまり難しく考えなくてもいいように、私なりにちょっと説明しておきます。 このようにHTML内に<?php ?>を書くことも、 <a href="<?php echo $item->guid; ?>"> こちらのようにPHPからHTMLを書き出すことも、 <?php if ($item->post_thumbnail) { echo "<img src=\"{$item->post_thumbnail}\">"; } ?> 人間には一見違うように見えていますが、PHPは同じことをしています。 PHPは<?phpと?>の間だけ、そこに書かれている何かしらの処理をします。 上の方は、こんな風にも書けますし、 <a href=" <?php echo $item->guid; ?> "> こんな風にもかけます。 <a href=" <?php echo $item->guid; ?> "> こうなると、echo1行だけでなくて、そこにもっと他のことも書けることがわかっていただけるかと思います。 改めて、こちらを見てみましょう。 コメントはなくしました。 <?php if ($item->post_thumbnail) { echo "<img src=\"{$item->post_thumbnail}\">"; } else { echo '<img src="noimage.jpg">'; } ?> これも他の書き方ができます。 <?php if ($item->post_thumbnail) { ?> <img src="<?php echo $item->post_thumbnail; ?>"> <?php } else { ?> <img src="noimage.jpg"> <?php } ?> かなり見にくくなりますが、毎行<?php ?>にする方法です。 これをさらに変化させてHTMLメインにしてみましょう。 <img src=" <?php if ($item->post_thumbnail) { echo $item->post_thumbnail; } else { echo "noimage.jpg"; } ?> "> さっきの$item->guidの表示に似てきたかと思います。 これでPHPがなにをしているかが理解できたら、改行をなくしてみます。 <img src="<?php if ($item->post_thumbnail) { echo $item->post_thumbnail; } else { echo "noimage.jpg"; } ?>"> 1行で書けます。 見にくいので、こんなことは私はしませんが。 このような単純な文字列の切り分けをするだけなら、もう少し簡単に書けます。 PHPをより理解すると言う目的で説明はしておきますが、ぱっと見て何をしているかご自分がわかりやすい書き方にしてください。 <img src="<?php echo ($item->post_thumbnail) ? $item->post_thumbnail : "noimage.jpg"; ?>"> ifはなくなり、echoはひとつになりました。

php_learn
質問者

補足

$itemを使い代入することが可能なんですね勉強になりました。 if文を書かずつなげる方法はコードが長くなると間違いが増えそうなので参考として頭に入れておきます。

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

なるほど、そう言うことでしたか。 では、動いていたコードがあればもう一度全体を投稿できますか。 そして、どこに何を表示しようとしてエラーになったのかを教えてください。 コードが長くて全体を投稿できないようでしたら、エディタでコードを全選択して、[Shift]+[Tab]を何度か押してインデントをなくしてみてください。 それでもだめでしたら、コメントをなくしてください。

php_learn
質問者

お礼

該当箇所はこちらです。アイキャッチを取得するコードをphpで入れようとするとエラーが起こります。 <?php?>がループ内で使えないのは大体理解できたのですが。 echoに<a href="<?php echo get_permalink(); ?>"> <span class="img-wrap"> <!--画像を追加--> <?php // アイキャッチ画像の確認 if (has_post_thumbnail()) { // 存在する the_post_thumbnail(); } else { // 存在しない echo '<img src="noimage.jpg">'; } ?> </span> 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_learn
質問者

補足

for ループで処理するデータに対して<?php echo get_permalink(); ?>">を使用すると、syntax error, unexpected '?' エラーが表示されます 同様にhas_post_thumbnail the_timeなどもエラーが出ると思われます。 for文を使ってループを回す場合、wordpress本体から呼び出す関数は使えないという事でしょうか?

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

先ほど、自作されている、と言いましたが、質問者さまの現在のindex.phpの全体コードを確認していないので、もしかしたら、WordPressの従来の処理にのっとっているものだとしたら、そうも言えなくなってしまいます。 質問者さまが考えながら作られているコードと、私が提供したコードを混ぜながらやられているとは思うので、queary_postsにした場合にどうなるかどうするかはわからないため、改めて考えなおす必要があります。 質問者からの補足 2022/01/28 23:01 「1.$post_items = get_posts($args);でwordpressの値を取得していますがページナビを実装する場合、queary postsを使わずに重複を避けて実装が可能なのか」 $post_items = get_posts($args);で試したコードも実行していただいて、ページリンクを確認していただいたと思っています。 結果は重複を避けてものだったと思います。 なので、なぜこの質問が出てきたのかわかりませんが、ページナビと言うのが、プラグインのことであれば、まったく使えないかも知れません。 $post_items = get_posts($args);が使えない、使いたくない、などの理由があるのでしょうか。 「2.記事をループする場合下記の文が必要ですが、 <?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?> ループ2はRSSと記事両方<?php get_one_post();?>で括って出力させる必要があるのか」 ループ2の部分がないのでちょっとわかりません。 こちらも同じですが、使いたいデータを$post_itemsが持っていれば、記事のループは$wp~を使わなくても大丈夫です。 $post_itemsと$wp~は混合しない方がいいと思いますので、どうしても$wp~にしたいと言うのであればそれでかまいません。 $wp~は実際はどうしているのかわかりませんが、順読み的に処理していて、データがなくなるまで繰り返してなったら終わるループのようです。 終わりが先にわかっている方がループの制御がしやすいので、私は$post_itemsにしました。 query_postsとget_postsについて、お互い理解を深めておいた方がいいかも知れません。 https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_posts

php_learn
質問者

お礼

指摘をいただいたところ2通りの投稿記事表示方法がありました。 前者の方法でも取得することは可能でしょうか? 1つ目は<?php the_post(); ?>を使い、取得した「現在の投稿」に関する関数を使う 2つ目はforループで回し投稿のidを渡す方法

php_learn
質問者

補足

「1.$post_items = get_posts($args);でwordpressの値を取得していますがページナビを実装する場合、queary postsを使わずに重複を避けて実装が可能なのか」 $post_items = get_posts($args);で試したコードも実行していただいて、ページリンクを確認していただいたと思っています。 結果は重複を避けてものだったと思います。 A.RSSは重複を避けていたものだったのですが、投稿記事は試せておりません… 「2.記事をループする場合下記の文が必要ですが、 <?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?> ループ2はRSSと記事両方<?php get_one_post();?>で括って出力させる必要があるのか」 A.ループ内容は記事とRSSですね、交互に表示する場合、前回はget_one_postで表示させておりました。 for文とwordpressの組み合わせが難しく以下の部分をencoどしようとすると無理があるようです。 php仕様のものにかえて出力するべきでしょうか? <a href="<?php echo get_permalink(); ?>"> <span class="img-wrap"> <!--画像を追加--> <?php // アイキャッチ画像の確認 if (has_post_thumbnail()) { // 存在する the_post_thumbnail(); } else { // 存在しない echo '<img src="noimage.jpg">'; } ?> </span> <!--日付けを追加--> <div class="post-meta2"><div class="img-wrap3"> <?php the_time('Y/m/d'); ?></div> <!--リンククラス付きのカテゴリーを追加--> <?php $categories = get_the_category(); if ($categories) { echo '<ul>'; foreach ($categories as $category) { echo '<li class="cat1"' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>'; } echo '</ul>'; } ?>   <!--リンククラス付きのコメント数を追加--> <?php $num_comments = get_comments_number(); if ($num_comments == 0) { $comments = __('No Comments'); // } elseif ($num_comments > 1) { $comments = $num_comments . __(' Comments'); // } else { $comments = __('1 Comment'); // } $write_comments = '<span class="singlecomments"><a href="' . get_comments_link() . '">' . $comments . '</a></span>'; echo $write_comments; ?></div> <!--リンククラス付きのコメントの抜粋を追加--> <div class="img-wrap4"> <?php the_excerpt(); ?></div> <!--リンククラス付きの記事を読むを追加--> <div class="img-wrap5"> <a href="<?php the_permalink(); ?>">記事を読む</a> </div></li>"; echo '</ul>'; } }

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

教えていただいたサイトを確認してみました。 その内容は的確で納得できる page.phpは最初からあるものなので、質問者さまが作成したファイルではありません。 また、page.phpは固定ページ表示用のもので、ページネーションのためものではありません。 使えなくなる機能はあるのですが、それは一覧表示をWordPressの元にあるものにのっとった処理の場合に使えるものです。 質問者さまは一覧表示をすべて自作しているので、この機能が使えなくても問題ありません。 ページネーションそのものも自作されているからです。 なので、前の回答の通り、最新の投稿は「index.php」、固定ページは「page.php」が実行されると認識していただければ大丈夫です。 また、すべてが自作なので、どちらを使ってもそのコードに変わりはありません。

php_learn
質問者

お礼

wordpressとphpでコードの書き方が違うため記事の表示部分にwordpressの取得関数を使い取得する方法がわからず困っております。 不可能であればphpで取得しますが、foreach内でデフォルトの形でencoさせるとエラーが出ます。 もし可能ならば書き方を教えていただけると助かります。

php_learn
質問者

補足

使えなくなる機能はあるのですが、それは一覧表示をWordPressの元にあるものにのっとった処理の場合に使えるものです。 質問者さまは一覧表示をすべて自作しているので、この機能が使えなくても問題ありません。 A.了解いたしました。ご説明いただきありがとうございます。

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

WordPressのコードを初期に戻して、ページの切りかえを試してみました。 デバッガを使って追いかけてみましたが「page.php」は実行されませんでした。 「page.php」が必要との情報元のURLなどを教えていただけますか。

php_learn
質問者

お礼

自前ループで取得するしかないようなので、記事の表示を組みなおしてみます。

php_learn
質問者

補足

https://min-web.com/wordpress-pagination-selfmade-plugin/ ソースはこちらです なくても実装は出来ると書いてありましたが、使えなくなる機能があると書いてあったのでpage.phpを作りました。 get postsからqueary postsに切り替えて作っていたのでその時に作成したのだと思われます。

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

補足 2022/01/28 23:01 「4.固定ページ(index.php)の場合, 固定ページ用テンプレート:page.phpが必要だが、その場合もRSSのページ機能は引き継げるのか」 はい、引き継げます。 私のWordPressの知識がとぼしいため、調べ調べの回答ですみません。 「page.php」がなぜ必要なのか調べてみました。 固定ページとのことなので、このことかと思っています。  設定-表示設定-ホームページの表示-固定ページ 「ホームページの表示」を以下のような設定にして実行してみました。 (→ 実行されるファイル名)  最新の投稿 → index.php  固定ページ-ホームページ-固定ページを選択 → page.php  固定ページ-投稿ページ-固定ページを選択 → index.php どうも、この設定によって「index.php」か「page.php」のどちらかが実行されるようです。 ドキュメントを読んだり、WordPress本体のコードを深く追いかけたわけではないので、他の設定や投稿や固定ページのデータによって、これ以外の場合があるかも知れません。 試した方法は簡単で、それぞれのファイルを以下のようにしただけです。 index.php ---- <?php echo "index"; ---- page.php ---- <?php echo "page"; ---- それぞれの設定で実行すると、上記のような結果になった次第です。 引き継ぐと言うよりも、現在「index.php」を編集されているのを「page.php」にするだけです。 コードをまるまるコピーするといいです。 この方法を先に知っていたら、「page.php」をテスト用のコードファイルにできて楽だったかも。

php_learn
質問者

お礼

echo "<li><a href=\"{$item->guid}\"><span class="img-wrap">{$item->post_thumbnail}</a></span></li>"; こちらの文を以下と同じく画像がないならダミー画像を表示するようにしたいのですが、どうすればよいでしょうか? <a href="<?php echo get_permalink(); ?>"> <span class="img-wrap"> <!--画像を追加--> <?php // アイキャッチ画像の確認 if (has_post_thumbnail()) { // 存在する the_post_thumbnail(); } else { // 存在しない echo '<img src="noimage.jpg">'; } ?> </span>

php_learn
質問者

補足

「ホームページの表示」を以下のような設定にして実行してみました。 (→ 実行されるファイル名)  最新の投稿 → index.php  固定ページ-ホームページ-固定ページを選択 → page.php  固定ページ-投稿ページ-固定ページを選択 → index.php A.通常ですとindex.phpで最新の投稿を並べていって各記事にクリックして飛ばすような作りだと思われます。 index.phpは目次のようなファイルでpage.phpは2ページ目3ページ目と移行するときに必要なファイルのようです。

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

お礼 2022/01/28 20:10 キャストの指摘はそうですね。 他のものもしておいた方がよさそうです。 文字として扱うものには(string)を付けてください。 今回はありませんが、数値があれば(int)とか(float)とか、型に合わせて他にもいくつかあります。 日付は、日付と言ってもstrtotimeに渡すものなのでこれも文字です。  strtotime((string)$dc->date) 私は今はなぜだかキャストなしで問題ないのですが、以前はキャストする必要がありました。 あの時は$wpdbを使ってたからかも。 SimpleXMLElementオブジェクトのプロパティもSimpleXMLElementオブジェクトなので、キャストした方が無難なようです。 補足 2022/01/28 20:01 そうですね、ひとつひとつつぶしていくのが確実だと思います。 ひとつづきのtry~catchだとどこで例外が起きたのかわかりづらくなりそうです。 何行目とはメッセージに書かれてはいそうですが。 コーディング的にも入れ子が一段階増えてしまうので、よくないように思います。 その方の指摘に沿うとしたら。 私もたぶん同じように思っているのですが、データベースに関するものは続行不可能なものが多いです。 なので、executeだけをtry~catchで括る、のが最低限必要なことになってくると思います。 文字が長すぎたり、数値が大きすぎたり、でINSERTやUPDATEに失敗することがあります。 これは先にチェックして文字は切り捨てたり、数値は再入力させたりで回避できたりします。 他には、接続していたデータベースからいつの間にか切断されていたとかあるかも知れません。 そう言った意味で、つまり処理コードそのものには問題はないのだけど、データや状態によって何が起こるかわからない場合には例外処理があった方がいいと思うわけです。 PHPリファレンスのPDOExceptionに例外一覧があるかと思ったのですが見つけられませんでした。 あらかじめどのようなことが起こるか想定されているはずなので、それを未然に防げるものは防げればと思ったのですが。 PDOは仲介的な役目だと思うので、データベースからのエラーメッセージをそのまま返してくるだけなのかな。

php_learn
質問者

お礼

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]; に続いてアイキャッチカテゴリー日付けコメント数抜粋を表示したいのですが、構文がわかりません。教えてください。 //アイキャッチifの分岐の書き方がわからない echo "<li><a href=\"{$item->guid}\"><span class="img-wrap">{$item->post_thumbnail}</a></span></li>"; <span class="img-wrap"> <?php // アイキャッチ画像の確認 if (has_post_thumbnail()) { // 存在する the_post_thumbnail(); } else { // 存在しない echo '<img src="noimage.jpg">'; }?></span> //日付けdivを2つつけたいがどのように書けばいいのかわからない echo "<div class="post-meta2"><div class="img-wrap3">{$item->post_date}</div>"; //カテゴリーifの分岐の書き方がわからない echo "<ul><a href=\"{$item->guid}\"><span class="img-wrap">{$item->post_category}</a></span></ul>"; if ($categories) { echo '<ul>'; foreach ($categories as $category) { echo '<li class="cat1"' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>'; } echo '</ul>'; } //コメント数$num_comments = get_comments_number()書き方がわからない 日付けでつけたdivの終了タグ <?php $num_comments = get_comments_number(); if ($num_comments == 0) { $comments = __('No Comments'); // } elseif ($num_comments > 1) { $comments = $num_comments . __(' Comments'); // } else { $comments = __('1 Comment'); // } $write_comments = '<span class="singlecomments"><a href="' . get_comments_link() . '">' . $comments . '</a></span>'; echo $write_comments; ?></div> //記事の抜粋 echo "<div class="img-wrap4">{$item->post_excerpt}</div>"; //続きを読む echo "<div class="img-wrap5"><a href=\"{$item->guid}\"></div>";

php_learn
質問者

補足

文字として扱うものには(string)を付けてください。 今回はありませんが、数値があれば(int)とか(float)とか、型に合わせて他にもいくつかあります。 日付は、日付と言ってもstrtotimeに渡すものなのでこれも文字です。  strtotime((string)$dc->date) A.日付けも文字に含まれるんですね参考になりました。 executeだけをtry~catchで括る、のが最低限必要なことになってくると思います。 A.excuteを囲うように指摘を受けていたことを思い出しました。 実行でエラー確認ですね。

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

例外処理(try~catch)をどうするかは、人によって考え方が違うので、正解はないような気がします。 言うと、自分が思うようにするのがいい、が正解です。 どのような時にどのように入れるかを検討していただければ、自分なりの正解がみつかると思います。 指摘してくださった方が言われるのも考えがあっての正解だと思います。 PHPのバージョンや設定によってエラーの動作はまちまちですが、例外については発生するとエラーメッセージが表示されるような初期設定になっていると思います。 なので、例外処理がなくても、「エラー確認できない」(指摘の文言のままかどうかわかりませんが)ことはないと思います。 入れるにしても、ひと続きにはせず、例外が発生しそうな要所要所に入れれば十分だと思います。 今は PDOException を使われていますが、PDO関連のクラスだと思うので、PDOに無関係な例外が起こった場合にどうなるのかわかりません。 getMessage()しか使わないのであれば大丈夫な気はします。 それならそれで Exception でいいような気もします。 PDO関連は PDOException でキャッチする、他の処理に入れる時は Exception でキャッチする、でいいのかな。 重要なのは、例外が起こったらどうするか、です。 続行可能であれば続行手続きを。 続行不可能であればメッセージや画面を表示して適切な手続きを。 PHPが例外メッセージを表示して止まった、にならないようにするためのものだと私は思っています。 PHPの例外メッセージが表示されると、閲覧者が困惑するでしょうし、場合によってはセキュリティや技術ノウハウに関するものが表示されるかも知れません。 これを回避するための例外処理であって、デバッグのためのエラー確認ではないと思っています。 最終的に公開するようになって入れても遅くないと思います。 下手に例外をキャッチすると余計にエラーがわからなくなります。 と言うのが私の正解です。

php_learn
質問者

お礼

もう1点理解できていない点があるのですが、以下の指摘文をいただきました。 キャストするのは$titleのみ文字が出力できないためという認識なのですが、その他のデータも同様なのでしょうか? $title等は、SimpleXMLElementでしょう。 stringにキャストしておくべき。

php_learn
質問者

補足

executeに対してtry~catchで括っていないので、もしエラーが発生していても捕捉できていないという指摘があったのですが、初期はデータベースの接続確認として実装したつもりでした。 エラーをすべて出力するよりも1つ1つつぶしていくほうが確実だという事ですね。

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

index.phpはいろいろ考えて変更してみました。 私の方ではこんな感じになっています。 ※コメントがおもな変更です。 ---- <?php require_once 'rss_db.php'; //古いデータを削除 //※先に実行する $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保存 $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]); } } //表示設定 $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); //表示 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>"; //※画像URLがあれば表示 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>'; } } //ページリンク $pages = ceil($wp_query->found_posts / $posts_per_page); for ($i = 1; $i <= $pages; ++$i) { if (1 == $i) { $page_text = '<<'; } elseif ($i == $pages) { $page_text = '>>'; } else { $page_text = $i; } echo "<a href=\"?page={$i}\">[{$page_text}]</a>"; }

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

追加していただいた読み込みのSQLは「//表示部分」のコメントの直後に追加してください。 ---- //表示部分 $sql = 'SELECT * FROM rss_feed ORDER BY date DESC'; $stmt = $dbh->prepare($sql); $stmt->execute(); while ($item = $stmt->fetch(PDO::FETCH_OBJ)) { ---- エラーはページリンクでWordPressのオブジェクトを使っているためです。 なのでページリンクはなくして試してください。 私の言う「テスト用」を誤解されていないでしょうか。 テストサーバーのことではなく、テスト用のコードファイルのことで、テーマの「index.php」とは別に、まったく違うフォルダで実行しているものです。 なのでWordPressに関係するものはまったく使えません。 テスト用のコードファイルで実行して成功したら、必要な処理コードを「index.php」に反映する、と言う手順でやっています。

php_learn
質問者

補足

表示部分につきましては勘違いしておりました。 ありがとうございます。 index.php以外にファイルを作ってそちらにコードを書いて読み込ませるという事ですね。

関連するQ&A