Recuperare i post tramite ID del termine con query personalizzata

20 giu 2014, 18:23:57
Visualizzazioni: 129K
Voti: 21

Voglio recuperare post personalizzati utilizzando una query personalizzata. La mia tassonomia è recipe_tx e i termini sono (Beef), (Chicken) ecc al suo interno.

Ho provato ad utilizzare

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

ma senza successo.

Qualcuno può aiutarmi a capire come ottenere i post di WordPress tramite il loro term_id.

Se l'id di beef è 37 allora voglio recuperare tutti i post con term_id = 37

Grazie

1
Commenti

Ecco il Codex a cui si riferisce jdm2112: Visualizzazione di Post Utilizzando una Query Select Personalizzata. Mi ha battuto sul tempo...

eyoung100 eyoung100
20 giu 2014 19:35:42
Tutte le risposte alla domanda 3
2
46

Hai provato a utilizzare la classe WP_Query? Potresti scoprire che è più semplice usare gli strumenti integrati invece di creare una query personalizzata da zero. Qualcosa di simile al seguente dovrebbe funzionare per te:

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

MODIFICA: nota che tax_query è progettato come un array di array. Molti problemi con le query tassonomiche derivano dal trascurare questo dettaglio.

MODIFICA: corretto errore di battitura nel valore field sopra, sostituendo 'id' con 'term_id'.

20 giu 2014 19:32:30
Commenti

come posso trovare post con la clausola LIKE in questo caso?

Azeem Hassni Azeem Hassni
20 giu 2014 23:35:08

Nota che i valori possibili per field sono term_id, name, slug o term_taxonomy_id. Vedi https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

Marian Marian
22 nov 2017 11:00:59
1

So che la domanda ha già una risposta, ma se qualcuno sta cercando di ottenere lo stesso risultato con una query SQL diretta, potrebbe provare la seguente:

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
)

La query qui sopra restituirà tutti i post che appartengono alla tassonomia specificata (recipe_tx) e all'ID del termine (37).

3 ott 2020 12:39:04
Commenti

Questo è meglio perché è più veloce di new WP_Query o get_posts()

Ivijan Stefan Stipić Ivijan Stefan Stipić
19 lug 2022 11:11:27
0

So che questo è un vecchio post, ma volevo aggiungere la mia opinione. @jdm2112 ha ragione. Basta usare la classe WP_Query. Questo garantisce che se la struttura del database verrà aggiornata in futuro, la tua query continuerà a funzionare... Tuttavia, visto che sembra tu stia cercando una risposta in SQL puro, questa è l'effettiva SQL che WP_Query eseguirebbe... almeno per WordPress 5.6. (Ho adattato la SQL alla tua domanda)

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

Puoi ottenere la query effettiva creando un'istanza di WP_Query, quindi guardando la proprietà request in questo modo:

<?php

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

// Questo ti darà l'effettiva query SQL grezza
$rawSqlQuery = $queryObj->request;
11 gen 2021 08:00:19