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

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