Vladimir Gromadin aka kryzander

Владимир Громадинvladimir@gromadin.com

$wpdb и запрос постов с Custom Fields по условию из определенной категории // HardSoftWeb // 17.10.2009

Возился сейчас в 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 »'); }}
?>
  

Естественно, при выводе данных можно вывести все, что хочется, а не только название и содержимое.

Click on a tab to select how you'd like to leave your comment

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Календарь
Апрель 2024
ПнВтСрЧтПтСбВс
« Авг  
1234567
891011121314
15161718192021
22232425262728
2930