Запрос пользовательского типа записи на основе ID записи и значения произвольного поля

4 февр. 2013 г., 23:33:11
Просмотры: 1.55K
Голосов: 0

Возможно, ответ уже где-то есть, но мне не удалось его найти или распознать. Вот ситуация:

У меня есть пользовательский тип записи 'region', который отображается на single-region.php. Названия регионов: Север, Юг, Восток, Запад.

Есть другой пользовательский тип записи 'news'. С ним связано произвольное поле 'news_region'. При создании новости автор должен указать значение для news_region (All, N, S, E, W).

Я хочу, чтобы на странице региона "Север" отображались все новости со значением news_region "All" ИЛИ "N".

ФИНАЛЬНАЯ РАБОЧАЯ ВЕРСИЯ (спасибо @milo за правильное направление):

// получаем заголовок страницы региона для сравнения с ключом news_region
$this_region = get_the_title($post->ID);
// запрашиваем новости с news_region All или $this_region
$args = array(
    'post_type' => 'news',
    'posts_per_page' => 4,
    'meta_query' => array(
    'relation' => 'OR',
        array(
            'key' => 'news_region',
            'value' => 'All',
            'compare' => 'LIKE'
            ),
        array(
            'key' => 'news_region',
            'value' => $this_region,
            'compare' => 'LIKE'
            )
        )
    );
$newslist = new WP_Query( $args );

ПРИМЕЧАНИЕ: изменил значения news_region на 'All, North Region, East Region, South Region, West Region' для соответствия полным названиям регионов (таким же как заголовок записи на single-region.php).

2
Комментарии

Какой код вы сейчас используете для страницы "Северный регион"?

s_ha_dum s_ha_dum
5 февр. 2013 г. 00:41:39

Сейчас я использую стандартный запрос, который выводит все новости на всех страницах регионов.

Ray Gulick Ray Gulick
5 февр. 2013 г. 14:35:40
Все ответы на вопрос 2
2

Если я правильно вас понял, вам нужен news_region meta_query с оператором сравнения IN для значения All или первой буквы названия текущего регионального поста (N, S, E, W)

// получаем первую букву названия этого регионального поста
$this_region = substr($post->post_title, 0, 1);
// запрашиваем новости с news_region All или $this_region
$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'news_region',
            'value' => array( 'All', $this_region ),
            'compare' => 'IN'
        )
    )
);
$news_posts = new WP_Query( $args );
5 февр. 2013 г. 00:45:16
Комментарии

Нет. Не пытаюсь сравнивать первые буквы. Пытаюсь показывать новостные материалы с прикреплённым пользовательским полем 'SE' (могут быть и другие регионы позже) на странице региона Southeast Region, и новостные материалы с пользовательским полем 'SW' на странице Southwest Region. Вижу подсказку о том, как заставить ваш код работать с пользовательскими полями, назначенными новостным материалам. Попробую и вернусь с результатами. Спасибо.

Ray Gulick Ray Gulick
5 февр. 2013 г. 14:34:37

Я изменил значения пользовательских полей с инициалов на полные названия регионов. Затем подумал, что смогу сравнивать их с названиями регионов на страницах регионов (North Region - это и заголовок поста страницы региона, и значение пользовательского поля news_region). Однако столкнулся с трудностями. Моя модификация вашего кода, похоже, не захватывает заголовок типа поста региона для сравнения. Добавлю код к своему первоначальному вопросу.

Ray Gulick Ray Gulick
5 февр. 2013 г. 15:06:22
0

Ответ @Milo верен, если вы хотите решить проблему с предлагаемым вами решением, но я думаю, что преобразование "Регионов" в таксономию имеет гораздо больше смысла. (Для небольшого контекста прочитайте о Проблеме XY.) Это связано с тем, что поведение вашего типа записи "Регион" в точности соответствует поведению стандартной архивной страницы таксономии. Таксономии также предоставляют более удобный интерфейс.

Кроме того, термины таксономий по умолчанию имеют поле описания. Хотя оно не включено в каждой теме, довольно легко добавить его в шаблон taxonomy-region.php (при условии, что вы создадите таксономию с именем region).

Наконец, поле описания термина по умолчанию является простым текстом, но плагин Rich Text Tags добавляет удобный WYSIWYG редактор, чтобы решить эту проблему.

5 февр. 2013 г. 01:29:28