WordPress Custom QUERY - PullRequest
       7

WordPress Custom QUERY

0 голосов
/ 15 декабря 2011

Мне нужно выбрать из таблицы сообщений, каждое сообщение относится к одной категории и тегу. Мне нужно выбрать конкретные теги / ы и / или категории / ы. Таблица терминов имеет настраиваемое поле "menu_order", оно используется для установки порядка категорий. Я хочу сортировать сообщения по этому полю. Если я просто выберу:

SELECT * from wp_posts

LEFT
JOIN wp_term_relationships
ON ( wp_term_relationships.object_id = wp_posts.ID )

LEFT
JOIN wp_terms
ON ( wp_terms.term_id = wp_term_relationships.term_taxonomy_id )

WHERE 1=1
AND wp_posts.post_type = 'post'
AND (
wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private'
)
LIMIT 0, 20

Я получаю результат:

+----------------+----------------+----------+---------------------+
|    POST ID     |    Term name   |   order  |        type         |
+----------------+----------------+----------+---------------------+
|       2        |      Fire      |    1     |      category       |
+----------------+----------------+----------+---------------------+
|       2        |      blue      |    0     |         tag         |
+----------------+----------------+----------+---------------------+

Это просто вступление.

Если я сделаю ГДЕ $ wpdb-> term.term_id = 170 что такое TAG, у меня только один возврат.

+----------------+----------------+----------+---------------------+
|    POST ID     |    Term name   |   order  |        type         |
+----------------+----------------+----------+---------------------+
|       2        |      blue      |    0     |         tag         |
+----------------+----------------+----------+---------------------+

Мне нужно выбрать POSTS, отфильтровать по категории или тегу и затем получить TERM_ORDER из категории, прикрепленной к POST.

Таким образом, независимо от того, какие у меня результаты, порядок всегда вытягивается из связанной категории.

Поскольку я не так силен в MYSQL, это сбивает меня с толку. Любой вклад будет полезен:)

ОБНОВЛЕНИЕ ---------------------------------------- ----------

Итак, после сумасшедшего кодирования мне удалось получить то, что я хотел. Не задерживайте дыхание, поскольку это, вероятно, уродливо и медленно, но работает.

Сначала я создаю представление, в котором собраны все продукты.

$qqquery = "
CREATE VIEW samsam AS
SELECT 
ID, post_content, post_title, post_excerpt, post_status, post_name, guid, post_type, $wpdb->term_relationships.term_taxonomy_id as cat_term_taxonomy_id, tt1.term_taxonomy_id as tag_term_taxonomy_id

FROM $wpdb->posts

LEFT                
JOIN $wpdb->term_relationships
ON ( $wpdb->term_relationships.object_id = $wpdb->posts.ID )

LEFT 
JOIN $wpdb->term_relationships AS tt1 
ON ( tt1.object_id = $wpdb->posts.ID ) 

WHERE 1=1 
AND $wpdb->posts.post_type = 'post' 
AND (
$wpdb->posts.post_status = 'publish'
OR $wpdb->posts.post_status = 'private'
) 
AND (                       wp_term_relationships.term_taxonomy_id IN ( $query_cat ) // ID's of categories, seperated by coma
AND tt1.term_taxonomy_id IN (' . $add_query_tag_id . ') //ID's of POSTS seperated by coma
) 
ORDER BY $wpdb->term_relationships.term_taxonomy_id DESC
";
$wpdb->query($qqquery);

После этого я делаю запрос, в котором выбираю вид и объединяю отношения и термины, чтобы получить порядок категорий, отфильтровывая порядок> 0, затем группирую BY ID, чтобы отфильтровать дубликаты.

$querystr = "
SELECT * from samsam

LEFT 
JOIN $wpdb->term_relationships 
ON (samsam.ID = $wpdb->term_relationships.object_id) 

LEFT
JOIN $wpdb->terms
ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id) 
AND ($wpdb->terms.menu_order > 0)

WHERE menu_order > 0

GROUP BY ID

ORDER BY menu_order ASC

LIMIT $item_limit_offset, $item_limit_pp"; // first is calculation of products to skip, second is how many posts per page

$pageposts = $wpdb->get_results($querystr, OBJECT);

Что он делает:

Категория 1 (есть заказ 1) сообщение сообщение почта

Категория 3 (есть заказ 2) сообщение сообщение почта

Категория 2 (заказ 3) сообщение сообщение почта

Может быть ограничено, смещено, разбито на страницы, отфильтровано по тегам и / или категориям.

Я использовал плагин «Term Menu Order», который добавляет дополнительное поле к категориям заказов.

Хорошего дня.

1 Ответ

1 голос
/ 15 декабря 2011

Почему вы пишете здесь свой запрос?Wordpress имеет встроенные функции для извлечения данных.

http://codex.wordpress.org/Template_Tags/get_posts http://codex.wordpress.org/Function_Reference/query_posts

...