wpdb: получение записей по таксономии SQL

20 апр. 2016 г., 11:58:14
Просмотры: 14.3K
Голосов: 6

Мне нужен список записей определенного типа (post_type) вместе с названием термина пользовательской таксономии.

Вот что у меня есть на данный момент:

SELECT p.post_name, t.name as clientName 
FROM $wpdb->posts AS p, $wpdb->terms AS t
LEFT JOIN $wpdb->term_relationships AS tr ON ('p.ID' = tr.object_id)
LEFT JOIN $wpdb->term_taxonomy AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
LEFT JOIN $wpdb->terms AS t2 ON (t2.term_id = tt.term_id)
WHERE   p.post_status = 'publish' 
    AND p.post_type = 'portfolio'
    AND tt.taxonomy = 'clients' 
ORDER BY p.post_date DESC

В чем проблема? Я получаю слишком много результатов - правильные записи, но по несколько раз с каждым клиентом. Я предполагаю, что это потому что я использую $wpdb->terms как t И как t2? Но когда я пытаюсь использовать его как t в обоих случаях, получаю ошибку:

Not unique table/alias: 't' (Не уникальное имя таблицы/алиаса: 't')

Кто может помочь?

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

Используйте WP_Query. Не вижу причин, по которым вам нужно выполнять пользовательский SQL-запрос

Pieter Goosen Pieter Goosen
20 апр. 2016 г. 12:00:12

@Pieter: Хмм, ок, как это будет выглядеть? Можно ли с помощью WP_Query фильтровать по двум таксономиям? Мне нужно фильтровать по таксономии "language", созданной плагином Polylang

Web-Entwickler Web-Entwickler
20 апр. 2016 г. 12:06:22

Вы читали это

Pieter Goosen Pieter Goosen
20 апр. 2016 г. 12:08:19

Да, спасибо, но это же не даст мне название таксономии за один раз, верно? Мне придется снова делать wp_get_post_terms() для каждого поста, что, полагаю, выльется в кучу запросов?

Web-Entwickler Web-Entwickler
20 апр. 2016 г. 14:39:34
Все ответы на вопрос 1
1

Ребята, извините, я только что нашел решение:

SELECT p.post_name, t.name as clientName 
FROM $wpdb->posts AS p
INNER JOIN $wpdb->term_relationships AS tr ON ( p.ID = tr.object_id)
INNER JOIN $wpdb->term_taxonomy AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN $wpdb->terms AS t ON (t.term_id = tt.term_id)
WHERE   p.post_status = 'publish' 
    AND p.post_type = 'portfolio'
    AND tt.taxonomy = 'clients' 
ORDER BY p.post_date DESC

Мне просто не нужно определять алиас для $wpdb->terms в предложении FROM.

20 апр. 2016 г. 12:07:16
Комментарии

Необходимо удалить одинарные кавычки вокруг p.ID

CragMonkey CragMonkey
21 апр. 2018 г. 05:24:32