Возился сейчас в WordPress’е с выводом постов по условию при установленном плагине Magic Fields (с ним очень удобно делать панель управления, хотя он и не без глюков). Необходимо было вывести посты за текущий месяц в определенной категории, причем по дате, сохраненной в Custom Fields (через тот самый Magic Fields). Не использовалась дата собственно поста в WordPress’е (хотя с ней проблем нет), так как требовалось выводить и на будущие даты, а в перспективе — и на совсем далекие даты в будущем. Вдобавок для обычного человека проще указать дату через красивый календарик, чем через стандартную панель WordPress’а.
И вот что получилось.
Magic Fields сохраняет дату (которую в админ-панели можно выбрать через красивый календарик) в формате 2009-09-25. Сначала получаем текущий месяц и год в таком формате:
$current_month = date('m'); $current_year = date('Y');
Затем делаем запрос через $wpdb (это способ в WordPress’е ввести SQL-запрос почти напрямую):
$myquery =" SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->term_relationships wcategory WHERE wposts.ID = wpostmeta.post_id AND wposts.ID = wcategory.object_id AND wcategory.term_taxonomy_id = '5' AND wpostmeta.meta_key = 'date' AND wpostmeta.meta_value >= '$current_year-$current_month-01' AND wpostmeta.meta_value <= '$current_year-$current_month-31' AND wposts.post_status = 'publish' AND wposts.post_type = 'post' ";
Строчка FROM здесь запрашивает нужные таблицы (посты, метаинформация и таксономия — для возможности вызова категории) и присваивает им человеческие имена (чтобы дальше писать wposts вместо $wpdb->posts:
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->term_relationships wcategory
Далее мы связываем ID поста с ID категории и указываем нужную нам (можно заменить на переменную и вообще сделать с номером категории все, что угодно):
WHERE wposts.ID = wpostmeta.post_id AND wposts.ID = wcategory.object_id AND wcategory.term_taxonomy_id = '5'
Далее указываем необходимое значение meta_key (в нашем случае date) и прописываем условия для его содержимого (ради чего и городили весь огород — в query_posts такое не прописывается):
AND wpostmeta.meta_key = 'date' AND wpostmeta.meta_value >= '$current_year-$current_month-1' AND wpostmeta.meta_value <= '$current_year-$current_month-31'
Ну и, наконец, указываем, что нам нужны только посты (а не страницы) и только опубликованные (а не ревизии, черновики и т. п.):
AND wposts.post_status = 'publish' AND wposts.post_type = 'post'
Выводим данные в массив и прогоняем по циклу:
$pageposts = $wpdb->get_results($myquery, OBJECT); if ($pageposts) {foreach ($pageposts as $post) { setup_postdata($post); ?> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?></a> <?php the_content('Read the rest of this entry »'); }} ?>
Естественно, при выводе данных можно вывести все, что хочется, а не только название и содержимое.