WordPressのカスタムフィールドから最も古い年と最新の年を取得する方法

WordPressで投稿に日付情報を持つカスタムフィールドを設定している場合、そのデータを活用して最も古い年と最新の年を取得することができます。本記事では、データベースから効率的に取得し、キャッシュを活用する方法について解説します。

1. なぜカスタムフィールドの日付データを取得するのか?

WordPressでは、カスタム投稿タイプやカスタムフィールドを使用して様々なデータを管理できます。例えば、以下のようなケースで日付情報を管理することが考えられます。

  • イベントの開催日
  • 商品リリース日
  • 歴史的な記録の公開日

これらのデータから「最も古い年」と「最新の年」を取得することで、データ範囲を把握したり、フィルタリング機能を実装したりするのに役立ちます。

2. 投稿データから最古・最新の年を取得する方法

データベースから最小・最大の日付を取得

WordPressの postmeta テーブルから、特定のカスタムフィールド (event_date など) の最小値と最大値を取得します。

function get_oldest_and_latest_year() {
    global $wpdb;
    
    $results = $wpdb->get_row("SELECT
        MIN(meta_value) AS oldest_date,
        MAX(meta_value) AS latest_date
        FROM {$wpdb->postmeta}
        WHERE meta_key = 'event_date'
        AND meta_value IS NOT NULL
        AND meta_value != ''");
    
    if ($results && !empty($results->oldest_date) && !empty($results->latest_date)) {
        return [
            'oldest_year' => date('Y', strtotime($results->oldest_date)),
            'latest_year' => date('Y', strtotime($results->latest_date))
        ];
    }
    
    return null;
}

この関数を実行すると、最も古い年と最新の年を配列で返します。

キャッシュを活用してパフォーマンスを向上

頻繁に変わらないデータである場合、WordPressの transient を使用することでデータベースアクセスを減らし、サイトのパフォーマンスを向上させることができます。

function get_cached_oldest_and_latest_year() {
    $cache_key = 'custom_oldest_latest_year';
    $cached_data = get_transient($cache_key);
    
    if ($cached_data !== false) {
        return $cached_data;
    }
    
    $years = get_oldest_and_latest_year();
    if ($years) {
        set_transient($cache_key, $years, DAY_IN_SECONDS * 7); // 1週間キャッシュ
    }
    
    return $years;
}

この get_cached_oldest_and_latest_year() を使用すると、データは1週間キャッシュされ、無駄なクエリを減らすことができます。

3. 投稿の追加・更新・削除時にキャッシュをクリア

投稿データが変更された際にキャッシュを削除し、次回アクセス時に最新のデータを取得できるようにします。

投稿の保存・更新時にキャッシュを削除

function clear_oldest_latest_year_cache_on_save($post_id, $post) {
    if ($post->post_type === 'custom_post_type') {
        delete_transient('custom_oldest_latest_year');
    }
}
add_action('save_post', 'clear_oldest_latest_year_cache_on_save', 10, 2);

投稿の削除時にキャッシュを削除

function clear_oldest_latest_year_cache_on_delete($post_id) {
    $post = get_post($post_id);
    if ($post && $post->post_type === 'custom_post_type') {
        delete_transient('custom_oldest_latest_year');
    }
}
add_action('before_delete_post', 'clear_oldest_latest_year_cache_on_delete');

これにより、投稿データが変更されたときに最新のデータが反映されます。

4. フロントエンドでの使用例

取得した最古・最新の年を表示するには、以下のようにします。

$years = get_cached_oldest_and_latest_year();
if ($years) {
    echo "最も古い年: " . $years['oldest_year'] . "<br>";
    echo "最新の年: " . $years['latest_year'];
} else {
    echo "データがありません";
}

5. まとめ

  • WordPressの postmeta テーブルから MIN()MAX() を使用して最古・最新の日付を取得
  • transient を活用してキャッシュし、パフォーマンスを向上
  • 投稿の追加・更新・削除時にキャッシュを削除し、最新データを反映
  • フロントエンドで取得したデータを表示

コメント

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