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対応に非常に有効です。
コメント