WordPressテーマ Cocoon のOGPタグに最新記事の日付を反映させるカスタマイズ方法

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');

コードの詳細解説

  1. fetch_feed を使用したRSSの取得:
  • RSSフィードを取得し、最新の記事の日付を Y-m-d H:i:s フォーマットで取得。
  1. 最新記事の日付を比較:
  • 複数のRSSフィードをループして処理し、最新の日付を比較します。
  1. ISO8601形式で返却:
  • RSSから取得した日付を date('c') でISO8601形式に変換して返却します。
  1. フィルターフックの適用:
  • add_filter('cocoon_ogp_modified_time', ...) を使用して、テンプレートで動的に値を変更可能にしました。

動作確認

  1. ホームページを開き、HTMLソースコードに以下のようなOGPタグが出力されていることを確認。
<meta property="article:modified_time" content="2024-12-11T12:00:00+09:00" />
  1. RSSフィード内の最新記事の日付が正しく反映されていることを確認。
  2. 他の固定ページや投稿ページでは、従来の get_seo_update_time() に基づく日付が出力されることを確認。

注意点

  • fetch_feed の利用条件:
  • fetch_feed 関数が利用可能である必要があります。利用できない場合は、SimplePieライブラリを確認してください。
  • キャッシュの影響:
  • fetch_feed はキャッシュを利用します。キャッシュのクリアが必要な場合は、wp_feed_cache_transient_lifetime フィルターを使用してキャッシュ期間を調整してください。
  • エラー処理:
  • RSSの取得に失敗した場合は、現在時刻を返す処理を追加しています。

まとめ

このカスタマイズにより、ホームページに指定した固定ページの article:modified_time に、RSSフィード内の最新記事の日付を動的に反映させることができました。この方法は、動的なコンテンツを生成する固定ページでのOGP対応に非常に有効です。

コメント

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