Written by Anonymous
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, //拡張クラス
'site' => 0, //★サイト名出力 1:出力, 0:非出力
),
$atts,
'rss'
));
$feed_url = $url;
$feed_count = $count;
$img_url = $img;
$feed_content = '';
$feed_contents = '';
//Cache処理(かなり簡易的なもの)
$transient_id = 'ree_feed_'.md5($feed_url.'_'.$count.'_'.$img_url.'_'.$target.'_'.$desc.'_'.$date.'_'.$type.'_'.$bold.'_'.$arrow.'_'.$class);
$feed_contents = get_transient( $transient_id );
//キャッシュが存在しない場合URLから取得
if (!$feed_contents) {
// WordPress 6.9対応: SimplePieの内部キャッシュを無効化するためのコールバック関数
$feed_options_callback = function($feed) {
// SimplePieの内部キャッシュを無効化(独自のtransientキャッシュを使用するため)
$feed->enable_cache(false);
// 日付順ソートを無効化(RSS配信側の順序を尊重するため)
$feed->enable_order_by_date(false);
};
// フィード取得前にアクションを追加
add_action('wp_feed_options', $feed_options_callback);
$rss = fetch_feed( $feed_url );
// フィード取得後にアクションを削除(他のフィード取得に影響しないようにする)
remove_action('wp_feed_options', $feed_options_callback);
if ( !is_wp_error( $rss ) ) {
// ★ サイト名取得(無条件)
$site_title = trim( (string) $rss->get_title() );
if ( empty($site_title) ) {
$site_title = parse_url($feed_url, PHP_URL_HOST);
}
$maxitems = $rss->get_item_quantity( $feed_count );
$rss_items = $rss->get_items( 0, $maxitems );
foreach ( $rss_items as $item ) :
$first_img = '';
// get_content() が null を返す場合があるため、確実に文字列にしてから利用
$item_content = $item->get_content();
if ( !is_string( $item_content ) ) {
$item_content = '';
}
if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item_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());
// 上で文字列化した $item_content を再利用
$feed_text = get_content_excerpt(strip_tags($item_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">';
// ★ タイトルの後ろにサイト名(site=1なら出力)
$feed_content .= '<div class="rss-entry-card-title widget-entry-card-title card-title">';
$feed_content .= esc_html($feed_title);
if ($site == 1 && !empty($site_title)) {
$feed_content .= ' <span class="rss-entry-card-site">|' . esc_html($site_title) . '</span>';
}
$feed_content .= '</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フィードを取得できません', THEME_NAME ) . '</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($transient_id, $feed_contents, 60 * intval($cache_minute));
}
return apply_filters( 'get_rss_feed_tag', $feed_contents);
}