WordPressの無料テーマ「Cocoon」で、OGPタグに出力される article:modified_time をカスタマイズして、RSSフィードから取得した最新記事の日付を反映させる方法を解説します。
環境情報
- WordPressバージョン: 6.7.1
- Cocoonバージョン: 2.8.2
- Cocoon Childバージョン: 1.1.3
- PHPバージョン: 8.2.22
- サーバー: エックスサーバー
カスタマイズの背景
article:modified_time は、記事や固定ページの最終更新日時を示すOGPメタタグです。しかし、特定の固定ページ(例えば、ホームページ)で複数のRSSフィードを元に表示を生成している場合、その固定ページの更新日時ではなく、フィード内の最新記事の日時を article:modified_time として出力したいケースがあります。
そこで、以下の手順でカスタマイズを行いました。
カスタマイズ手順
1. テンプレートファイルのコピー
Cocoonのテンプレートファイル header-ogp.php を子テーマにコピーして編集します。
コピー元: cocoon-master/tmp/header-ogp.php
コピー先: cocoon-child-master/tmp/header-ogp.php
2. ファイル内容の修正
以下のコードを修正しました。
修正前:
<?php if ($update_time = get_seo_update_time()): ?>
<meta property="article:modified_time" content="<?php echo esc_attr($update_time); ?>" />
<?php endif ?>修正後:
<?php if ($update_time = apply_filters('cocoon_ogp_modified_time', get_seo_update_time())): ?>
<meta property="article:modified_time" content="<?php echo esc_attr($update_time); ?>" />
<?php endif ?>この修正により、フィルターフック cocoon_ogp_modified_time を追加し、動的に article:modified_time の内容を変更できるようにしました。
3. フィルターを追加
子テーマの functions.php に以下のコードを追加し、RSSフィードから最新記事の日付を取得して article:modified_time に反映します。
/**
 * RSSフィードから最新記事の日付を取得し、article:modified_timeを調整
 */
function custom_cocoon_modified_time($update_time) {
    if (is_front_page() || is_home()) {
        // RSSフィードURL
        $feed_urls = [
            'https://examle.com/news/feed',
            'https://examle.com/blog/feed'
        ];
        $latest_time = null;
        // 各フィードをループ処理
        foreach ($feed_urls as $feed_url) {
            $rss = fetch_feed($feed_url);
            if (!is_wp_error($rss)) {
                $max_items = $rss->get_item_quantity(1); // 最新記事1件を取得
                $rss_items = $rss->get_items(0, $max_items);
                foreach ($rss_items as $item) {
                    $item_date = $item->get_date('Y-m-d H:i:s'); // 日付を取得
                    $item_timestamp = strtotime($item_date); // タイムスタンプに変換
                    // 最新の日付を比較
                    if ($latest_time === null || $item_timestamp > $latest_time) {
                        $latest_time = $item_timestamp;
                    }
                }
            }
        }
        // 最新の記事が見つかった場合、ISO8601形式で返す
        if ($latest_time) {
            return date('c', $latest_time);
        } else {
            // RSSが取得できない場合は現在時刻を返す
            return current_time('c');
        }
    }
    // その他の場合は元の値を返す
    return $update_time;
}
add_filter('cocoon_ogp_modified_time', 'custom_cocoon_modified_time');コードの詳細解説
- fetch_feedを使用したRSSの取得:
- RSSフィードを取得し、最新の記事の日付を Y-m-d H:i:sフォーマットで取得。
- 最新記事の日付を比較:
- 複数のRSSフィードをループして処理し、最新の日付を比較します。
- ISO8601形式で返却:
- RSSから取得した日付を date('c')でISO8601形式に変換して返却します。
- フィルターフックの適用:
- add_filter('cocoon_ogp_modified_time', ...)を使用して、テンプレートで動的に値を変更可能にしました。
動作確認
- ホームページを開き、HTMLソースコードに以下のようなOGPタグが出力されていることを確認。
<meta property="article:modified_time" content="2024-12-11T12:00:00+09:00" />- RSSフィード内の最新記事の日付が正しく反映されていることを確認。
- 他の固定ページや投稿ページでは、従来の get_seo_update_time()に基づく日付が出力されることを確認。
注意点
- fetch_feedの利用条件:
- fetch_feed関数が利用可能である必要があります。利用できない場合は、SimplePieライブラリを確認してください。
- キャッシュの影響:
- fetch_feedはキャッシュを利用します。キャッシュのクリアが必要な場合は、- wp_feed_cache_transient_lifetimeフィルターを使用してキャッシュ期間を調整してください。
- エラー処理:
- RSSの取得に失敗した場合は、現在時刻を返す処理を追加しています。
まとめ
このカスタマイズにより、ホームページに指定した固定ページの article:modified_time に、RSSフィード内の最新記事の日付を動的に反映させることができました。この方法は、動的なコンテンツを生成する固定ページでのOGP対応に非常に有効です。

 
  
  
  
  

コメント