Cocoonフォーラム

サイト内検索
書き込みの前に以下の3点をご確認ください。
  1. 1つのトピックにつき1つの質問を書き込んでください
  2. 不具合・カスタマイズ対象ページのURLを提示高速化を無効にしてください
  3. 該当部分のキャプチャ・環境情報とともに書き込んでいただけると助かります

何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。

不具合・カスタマイズ対象ページのURL:

相談内容:

不具合の発生手順:

解決のために試したこと:

※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:

※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。

環境情報の取得方法はこちら。
https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
https://wp-cocoon.com/theme-trouble/

フォーラム利用ガイドリンク

  1. フォーラムガイドライン
  2. よくある質問と答え(FAQ)
  3. サポート対象外のケース
  4. 原因不明の不具合用トラブルシューティング
  5. トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw
  6. 真っ白画面でのエラーメッセージの確認方法
  7. ブラウザ環境チェックツール
  8. Cocoonカスタマイズ依頼

フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。

RSS記事一覧を表示するショートコード...
 
共有:
通知
すべてクリア

RSS記事一覧を表示するショートコードが更新されない

7 投稿
4 ユーザー
3 Reactions
215 表示
(@kamegomo)
New Member Registered
結合: 3週間前
投稿: 1
トピックスターター  

お世話になっております。

サイトにcocoonの「RSS記事一覧を表示するショートコード」を貼っているのですが、wordpressを6.9にアップデートした後から記事の更新がされなくなりました。

具体的には、
・TOPページなどにRSS記事一覧を表示するショートコードを貼り付け
・6.9にアップデートするまでは正常に外部RSSを取得し、記事一覧を表示
・6.9にアップデートしてからは記事が更新されず、アップデート前に取得できていた記事が最新の状態で止まったまま

アップデート前までは正常に動いていたため、おそらくこれが原因ではないかと思います。
全くの無効ではなく、記事一覧は表示されているのですが更新がされない状態です。
(私の場合はアップデート前から使っていたため上記現象ですが、今からショートコードを新たに使われる場合は、白紙?の状態などになるのかもしれません)

お手すきの際にご確認いただけますでしょうか。よろしくお願いいたします。



   
引用
mk2
(@mk2_mk2)
Illustrious Member Moderator
結合: 5年前
投稿: 9405
 

この辺りのことは、疎いのですけれど・・・。

とりあえず、以下の環境で確認しました。

WordPress 6.9
Cocoon 2.8.8.2

確認したのは、以下です。
https://news.yahoo.co.jp/rss/topics/top-picks.xml

上記が以下の時に確認しました。

 
CocoonのRSSのショートコードで、3件だけ表示させてみると、以下のような感じに。
 
これは、もっと前にテストしていたものが、どうにも残っているようで。
 
 
とりあえず、WordPress側のキャッシュの更新間隔を1秒にしてみて、以下(fetch_feed())の値を確認しました。
(直前の$feed_contentsのif文は、コメント化しました)
 
 
 
長いですから、titleとpubDateだけ抽出すると、以下のような感じで、RSSと一致しない状態でした。
'安倍氏銃撃 山上被告が初めて謝罪' (length=46)
'Thu, 04 Dec 2025 07:50:10 GMT' (length=29)

'ダイハツ 6車種23万台リコール' (length=40)
'Thu, 04 Dec 2025 08:14:36 GMT' (length=29)

'日本人iPhone離れ進む? 要因分析' (length=41)
'Thu, 04 Dec 2025 06:17:35 GMT' (length=29)

'ごみの中に158万円 分別中に発見' (length=43)
'Thu, 04 Dec 2025 08:32:51 GMT' (length=29)

'今年の車 スバル・フォレスター' (length=43)
'Thu, 04 Dec 2025 09:02:27 GMT' (length=29)

'W杯抽選 日本の対戦相手はどこに' (length=44)
'Thu, 04 Dec 2025 08:07:44 GMT' (length=29)

'紅白 ダイアンが副音声で司会' (length=40)
'Thu, 04 Dec 2025 09:00:15 GMT' (length=29)

 
 
ちなみに、同じことを「WordPress 6.8.3」ですると、以下のような感じで、RSSと一致していると思います。
(Cocoonは同じ、2.8.8.2)
'12月でもクマ警戒を 被害相次ぐ' (length=42)
'Thu, 04 Dec 2025 10:24:35 GMT' (length=29)

'5日朝厳しい冷え込み 東京3℃予想' (length=45)
'Thu, 04 Dec 2025 09:19:27 GMT' (length=29)

'高校生の扶養控除 縮小を検討' (length=40)
'Thu, 04 Dec 2025 10:25:00 GMT' (length=29)

'ガス漏れで22カ所以上で火災 山口' (length=45)
'Thu, 04 Dec 2025 09:57:21 GMT' (length=29)

'箱ワナの扉閉める 妨害行為相次ぐ' (length=46)
'Thu, 04 Dec 2025 09:20:25 GMT' (length=29)

'駿河屋サイト 3万件超の漏えいか' (length=44)
'Thu, 04 Dec 2025 09:42:19 GMT' (length=29)

'閉園の動物園 ライオンが双子出産' (length=46)
'Thu, 04 Dec 2025 10:52:55 GMT' (length=29)

'小宮山悟監督が力投 早慶OB戦' (length=39)
'Thu, 04 Dec 2025 11:15:09 GMT' (length=29)

 
 
「WordPress 6.9」側で、以下を追加して、WordPress側の内部キャッシュを無効にしてみしたのですが。
(ソートも無効にしてしまいましたが・・・)
add_action('wp_feed_options', function($feed) {
    $feed->enable_cache(false);
    $feed->enable_order_by_date(false);
});

すると、取得した内容が、RSSと一致するんですよね。
(「WordPress 6.8.3」とも一致する)

 

WordPressの関数fetch_feed()で取得した内容が、上記の状態ですから。
(Cocoonのバージョンが同じで、WordPressのバージョン違いで、内容が違いますし)

WordPress側の不具合かなと、思うのですけれど。



   
わいひら reacted
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 3986
 

WordPress 6.9でRSS関連について変更がされているようです。

https://make.wordpress.org/core/2025/11/17/miscellaneous-developer-focused-changes-in-6-9/?utm_source=chatgpt.com

●発生のアルゴリズム

以下の流れなのでは?

トランジェント管理(set_transient)

$transient_id にRSSのHTMLを保存。
設定した時間(例:1分)で期限切れになる。

期限切れになると fetch_feed() が呼ばれる

このとき $feed_contents は存在しないため、RSSを再取得しようとする。
しかしfetch_feed()内部では SimplePieがキャッシュしている。
デフォルトでは 12時間キャッシュ

そのため、実際のHTTPリクエストは行われず、SimplePie が保持している古いデータ が返る。
結果として、トランジェントは更新されても、表示されるRSS内容は古いままになる。

結果、rssショートコードで指定したオプションcache_minuteが反映されない。


●Cocoon側での対策案

function get_rss_feed_tag( $atts ) {
  include_once(ABSPATH . WPINC . '/feed.php');
  extract(shortcode_atts(
    array(
      'url' => 'https://ja.wordpress.org/feed/', //取得するRSSフィードURL
      'count' => '5', //取得する数
      'img' => NO_IMAGE_RSS, //画像が取得できなかった場合のイメージ
      'target' => '_blank', //ブラウザの開き方(target属性)
      'cache_minute' => '60', //キャッシュ時間(分)
      'desc' => '1', //説明文表示 1 or 0
      'date' => '1', //日付表示 1 or 0
      'type' => '', //表示タイプ
      'bold' => 0, //タイトルを太字にするか
      'arrow' => 0, //矢印を出すか
      'class' => null, //拡張クラス
    ),
    $atts,
    'rss'
  ));

  $feed_url = $url;
  $feed_count = $count;
  $img_url = $img;
  $feed_content = '';
  $feed_contents = '';

  // ★キャッシュ時間を整数化してトランジェントキーに含める
  $cache_minute_int = intval($cache_minute);
  $transient_id = 'ree_feed_'.md5($feed_url.'_'.$count.'_'.$img_url.'_'.$target.'_'.$desc.'_'.$date.'_'.$type.'_'.$bold.'_'.$arrow.'_'.$class.'_'.$cache_minute_int);
  $feed_contents = get_transient( $transient_id );

  //キャッシュが存在しない場合URLから取得
  if (!$feed_contents) {

    // ★fetch_feed の内部キャッシュ時間をショートコード設定に同期
    $feed_cache_lifetime = 60 * $cache_minute_int;
    $filter_function_hook_id = function( $seconds ) use ( $feed_cache_lifetime ) {
      return $feed_cache_lifetime;
    };
    add_filter( 'wp_feed_cache_transient_lifetime', $filter_function_hook_id, 10, 2 );

    $rss = fetch_feed( $feed_url );

    remove_filter( 'wp_feed_cache_transient_lifetime', $filter_function_hook_id, 10, 2 );
    
    if ( !is_wp_error( $rss ) ) {
      $maxitems = $rss->get_item_quantity( $feed_count );
      $rss_items = $rss->get_items( 0, $maxitems );
      foreach ( $rss_items as $item ) :
        $first_img = '';
        if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches )) $first_img = $matches[1];
        if ( !empty( $first_img ) ) :
          $feed_img = esc_attr( $first_img );
        else:
          $feed_img = $img_url;
        endif;
        $feed_url = $item->get_permalink();
        $feed_title = $item->get_title() ?? '';
        $feed_title = str_replace(["\r\n", "\r", "\n"], '', $feed_title);
        $feed_date = $item->get_date(get_site_date_format());
        $feed_text = get_content_excerpt(strip_tags($item->get_content()), get_entry_card_excerpt_max_length());

        $feed_content .= '<a href="' . esc_url($feed_url) . '" title="' . esc_attr($feed_title) . '" class="rss-entry-card-link widget-entry-card-link a-wrap" target="'.esc_attr($target).'"'.get_rel_by_target($target).'>';
        $feed_content .= '<div class="rss-entry-card widget-entry-card e-card cf">';
        $feed_content .= '<figure class="rss-entry-card-thumb widget-entry-card-thumb card-thumb">';
        $feed_content .= '<img src="' . esc_url($feed_img) . '" class="rss-entry-card-thumb-image widget-entry-card-thumb-image card-thumb-image" alt="">';
        $feed_content .= '</figure>';
        $feed_content .= '<div class="rss-entry-card-content widget-entry-card-content card-content">';
        $feed_content .= '<div class="rss-entry-card-title widget-entry-card-title card-title">' . esc_html($feed_title) . '</div>';
        if ($desc) {
          $feed_content .= '<div class="rss-entry-card-snippet widget-entry-card-snippet card-snippet">' . esc_html($feed_text) . '</div>';
        }
        if ($date) {
          $feed_content .= '<div class="rss-entry-card-date widget-entry-card-date">
          <span class="rss-entry-card-post-date widget-entry-card-post-date post-date">' . esc_html($feed_date) . '</span>
        </div>';
        }
        $feed_content .= '</div>';
        $feed_content .= '</div>';
        $feed_content .= '</a>';
      endforeach;
    } else {
      $feed_content = '<p>RSSフィードを取得できません</p>';
    }

    $atts = array(
      'type' => $type,
      'bold' => $bold,
      'arrow' => $arrow,
      'class' => $class,
    );
    $card_class = get_additional_widget_entry_cards_classes($atts);
    $feed_contents = '<div class="rss-entry-cards widget-entry-cards'.$card_class.' no-icon">' . $feed_content . '</div>';

    // ★set_transient の期限に整数化したキャッシュ時間を使用
    set_transient($transient_id, $feed_contents, 60 * $cache_minute_int);
  }

  return apply_filters( 'get_rss_feed_tag',  $feed_contents);

}

 



   
わいひら reacted
返信引用
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 8年前
投稿: 18149
 

@kamegomo

ご連絡いただきありがとうございます。
近い環境で動作確認するためにもRSSのURLをご提示いただくことはできますでしょうか。
可能であればよろしくお願い致します。



   
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 4年前
投稿: 3986
 

@yhira さん

テストだけなら、以下で可能です。
rssショートでcache_minute=1とし、自サイトをURL指定。
自サイトを更新するが、1分経過してもRSS表示に変化がないことが確認できます。



   
わいひら reacted
返信引用
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 8年前
投稿: 18149
 

投稿者:: @chu-ya

rssショートでcache_minute=1とし、自サイトをURL指定。
自サイトを更新するが、1分経過してもRSS表示に変化がないことが確認できます。

これは僕も確認しました。
ただ@kamegomo さんが建てられたトピックなので、そのRSSだけでも合わせて動作確認時に、同様の状態になるかを確認できた方がいいかなと思いました。



   
返信引用
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 8年前
投稿: 18149
 

Cocoonのtransientを使用するという形の方がシンプルに思ったので、そのように、修正させていただきました。
https://github.com/xserver-inc/cocoon/commit/1a0a50e3988b633b009b5eb7a8c36c4b9a5c921e

修正版はこちら。
------------------------------------------------
https://github.com/xserver-inc/cocoon
開発中の最新ファイルをダウンロードする場合は、上記ページのダウンロードボタンからzipファイルをダウンロードしてください。

WordPressでの手動アップデート方法はこちら
https://wp-cocoon.com/manual-update-of-cocoon-theme/
------------------------------------------------



   
返信引用
共有:

問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。

また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。

「いいね!」機能はフォーラム登録者のみが利用できる機能です。

CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。

フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。

最近の書き込みはこちら。

詳細なカスタマイズ依頼をするならこちら。

タイトルとURLをコピーしました