Open1

WordPressの管理画面で年別の絞り込み機能を提供する

childsviewchildsview

ChatGPTと一緒に作成
カスタム投稿タイプ「blog」の場合

/**
 * 年別絞り込みセレクトボックスを投稿一覧に追加します。
 */
function add_yearly_filter_dropdown($post_type)
{
    if ('blog' === $post_type) {
        $selected_year = isset($_GET['year_filter']) ? (int) $_GET['year_filter'] : 0;

        echo '<select name="year_filter">';
        echo '<option value="0">年別絞り込み</option>';

        foreach (get_years_with_posts() as $year) {
            echo sprintf(
                '<option value="%s"%s>%s</option>',
                $year,
                selected($selected_year, $year, false),
                $year
            );
        }

        echo '</select>';
    }
}
add_action('restrict_manage_posts', 'add_yearly_filter_dropdown');

/**
 * 投稿が存在する年の一覧を返します。
 */
function get_years_with_posts()
{
    global $wpdb;

    $post_type = 'blog';

    $years = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT YEAR(post_date) AS year FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'publish' GROUP BY year DESC",
            $post_type
        ),
        ARRAY_N
    );

    if ($years) {
        return array_map('intval', call_user_func_array('array_merge', $years));
    }

    return [];
}

/**
 * クエリを変更して年別の投稿を取得します。
 */
function modify_query_for_year_filter($query)
{
    if (!is_admin() || !$query->is_main_query()) {
        return;
    }

    if ($query->get('post_type') === 'blog' && isset($_GET['year_filter'])) {
        $year = (int) $_GET['year_filter'];

        if ($year > 0) {
            $query->set('year', $year);
        }
    }
}
add_action('pre_get_posts', 'modify_query_for_year_filter');