Мне нужно выбрать из таблицы сообщений, каждое сообщение относится к одной категории и тегу.
Мне нужно выбрать конкретные теги / ы и / или категории / ы.
Таблица терминов имеет настраиваемое поле "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», который добавляет дополнительное поле к категориям заказов.
Хорошего дня.