Как сделать свою выборку постов в WordPress
Метки: SQL | WordPress
Вторник, 18 ноября 2008 г.
Просмотров: 5860
Подписаться на комментарии по RSS
Самым простым способом получения некоторой выборки постов в шаблоне WordPress является использование тега query_posts(). Подробно об этом написано в кодексе WordPress (по-английски), а коротко по-русски можно прочитать здесь.
Однако этот способ не всегда подходит, и разработчику приходится формировать свой SQL-запрос к базе данных WP, чтобы выбрать нужные посты. В частности, это требуется в том случае, если при создании постов используются поля, определяемые пользователем (custom fields), и их потом как-то надо использовать в выборке (например, предоставить возможность поиска по этим полям или использовать их как некие признаки, наряду с категориями).
В том же кодексе WP есть подробная статья, рассказывающая, как создать и использовать свой запрос к базе. Я расскажу об этом коротко:
1. Создаем в нашей теме шаблон, назовем его, например, searhpage.php. В верхней части кода страницы нужно прописать примерно следующее:
<php /* Template Name: Search Page */ ?>
2. Создаем в админке WP страницу (page) и называем ее, скажем, Поиск. В самом низу формы создания страницы есть подраздел "Шаблон страницы" (Page Template), там в выпадающем списке, если мы все правильно сделали на шаге 1, должен быть выбор из двух вариантов "Базовый шаблон" и "Search Page" (в точности тот текст, который мы внесли в комментарий). Выбираем Search Page и создаем страницу. Запоминаем ее адрес (slug), теперь ссылку на страницу можно вставить в любом месте навигации (в шаблоне или в постах).
3. Где-то в верхней части страницы searchpage.php формируем наш запрос. Приведу пример из кодекса:
<?php
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = 'tag'
AND wpostmeta.meta_value = 'email'
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'
ORDER BY wposts.post_date DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);
?>
4. А там, где должен находиться основной Цикл (Loop), вставляем следующие строчки:
<?php if ($pageposts): ?> <?php foreach ($pageposts as $post): ?> <?php setup_postdata($post); ?>
И это все. Теперь можно в Цикле использовать все обычные теги для отображения информации о посте. Например, вы можете спокойно задействовать необходимый фрагмент вывода из другого файла-шаблона вашей темы.
Полностью пример шаблона вы можете посмотреть на уже упоминавшейся странице кодекса.