Получение записей по ID термина через пользовательский запрос

20 июн. 2014 г., 18:23:57
Просмотры: 129K
Голосов: 21

Я хочу получить пользовательские записи, используя пользовательский запрос. Моя таксономия - recipe_tx и термины (Beef - Говядина), (Chicken - Курица) и т.д.

Я пробовал использовать

SELECT p.* FROM wp_posts p, wp_term_taxonomy tt, wp_term_relationships tr 
WHERE p.ID=tr.`object_id` 
AND tt.`term_id`=tr.`term_taxonomy_id` 
AND (p.post_type = 'recipe_cpt')
AND p.post_status = 'publish'
AND tt.`term_taxonomy_id` = 37

но безуспешно.

Может кто-то помочь, как получить записи WordPress по их term_id.

Если ID говядины равен 37, то я хочу получить все записи с term_id = 37

Спасибо

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

Вот Codex, на который ссылается jdm2112: Отображение записей с помощью пользовательского SQL-запроса. Он меня опередил...

eyoung100 eyoung100
20 июн. 2014 г. 19:35:42
Все ответы на вопрос 3
2
46

Пробовали ли вы использовать класс WP_Query? Возможно, вам будет проще использовать встроенные инструменты вместо создания запроса с нуля. Что-то подобное должно сработать:

<?php
$args = array(
'post_type' => 'recipe_cpt',
'tax_query' => array(
    array(
    'taxonomy' => 'recipe_tx',
    'field' => 'term_id',
    'terms' => 37
     )
  )
);
$query = new WP_Query( $args ); ?>

ПРИМЕЧАНИЕ: Обратите внимание, что tax_query по своей структуре является массивом массивов. Многие проблемы с таксономическими запросами возникают из-за упущения этой детали.

ПРИМЕЧАНИЕ: Исправлена опечатка в значении field выше, где 'id' заменено на 'term_id'.

20 июн. 2014 г. 19:32:30
Комментарии

как я могу найти записи с использованием LIKE в этом случае?

Azeem Hassni Azeem Hassni
20 июн. 2014 г. 23:35:08

Обратите внимание, что возможные значения для field это term_id, name, slug или term_taxonomy_id. Смотрите https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

Marian Marian
22 нояб. 2017 г. 11:00:59
1

Я знаю, что вопрос уже решён, но если кто-то пытается достичь того же с помощью чистого SQL-запроса, можно попробовать следующее:

SELECT * 
FROM wpiw_posts
WHERE ID IN (
    SELECT object_id 
    FROM wpiw_term_relationships AS TR 
        INNER JOIN wpiw_term_taxonomy AS TT ON TR.term_taxonomy_id = TT.term_taxonomy_id
        INNER JOIN wpiw_terms AS T ON TT.term_id = T.term_id
    WHERE TT.taxonomy = 'recipe_tx' AND T.term_id = 37
)

Данный запрос вернёт все записи, принадлежащие указанной таксономии (recipe_tx) и термину с ID 37.

3 окт. 2020 г. 12:39:04
Комментарии

Это лучше, потому что работает быстрее, чем new WP_Query или get_posts()

Ivijan Stefan Stipić Ivijan Stefan Stipić
19 июл. 2022 г. 11:11:27
0

Я знаю, что это старый пост, но хотел бы добавить свой комментарий. @jdm2112 прав. Просто используйте класс WP_Query. Это гарантирует, что если структура базы данных когда-либо будет обновлена в будущем, ваш запрос продолжит работать... Однако, поскольку похоже, что вам нужен ответ с сырым SQL, вот фактический SQL, который выполнит WP_Query... по крайней мере, начиная с WordPress 5.6. (Я адаптировал SQL под ваш вопрос)

SELECT * from wp_posts 
    LEFT JOIN 
        wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    WHERE 
        (wp_term_relationships.term_taxonomy_id IN (37)) AND
        wp_posts.post_type = 'recipe_cpt' AND
        wp_posts.post_status = 'publish'
    GROUP BY wp_posts.ID

Вы можете получить фактический запрос, создав экземпляр WP_Query, а затем посмотрев на свойство request, например так:

<?php

$args = [
    'post_type' => 'recipe_cpt',
    'tax_query' => [
        [
            'taxonomy' => 'recipe_tx',
            'field' => 'term_id',
            'terms' => 37
        ]
    ]
];
$queryObj = new WP_Query($args); 

// Это даст вам фактический сырой SQL-запрос
$rawSqlQuery = $queryObj->request;
11 янв. 2021 г. 08:00:19