Tassonomia personalizzata WP_Query per tutti i termini in una tassonomia?


8

Esiste un modo semplice per eseguire una query per tutti i post contrassegnati con un termine da una particolare tassonomia?

Conosco questa tecnica:

$custom_taxonomy_query = new WP_Query( 
 array(
  'taxonomy_name' => 'term_slug',
 )
);

Ma vorrei passare un carattere jolly al posto di term_slug, o forse solo una stringa vuota. Quindi questo mi darebbe tutti i post che sono contrassegnati da qualsiasi termine in quella tassonomia, non solo un termine specifico.

Grazie per il tuo aiuto, Dave

Risposte:



23

Ho incontrato una situazione simile Dave. Questo codice ha funzionato per i miei scopi. Non è l'opzione più snella del mondo ma fa bene il lavoro:

// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
    'hide_empty' => 0,
    'fields' => 'ids'
) );

// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => $taxonomy,
            'field' => 'id',
            'terms' => $taxonomy_terms,
        ),
    ),
) );

Spero che questo aiuti te o chiunque altro a riscontrare il problema.

Kevin


Questo è stato estremamente utile per me. Grazie @kevinlearynet
Tyrun,

Ancora parente oggi
user1676224

7

Qualcosa del genere potrebbe funzionare:

$ args = array (
    'post_type' => 'post',
    'tax_query' => array (
        Vettore(
            'taxonomy' => 'your_custom_taxonomy',
            'operator' => 'EXISTS'
        ),
    ),
);
$ query = new WP_Query ($ args);

In pratica stai chiedendo qualsiasi post assegnato a qualsiasi termine all'interno di your_custom_taxonomy.


4

Ciao @Dave Morris:

Hai ragione, WordPress decide se non hai un termine che semplicemente ignorerà la tua tassonomia.

Esistono tre (3) approcci principali che potresti provare:

  1. Utilizzare una query SQL completa con $wpdb->get_results(),

  2. Ottieni un elenco di$post->ID messaggi di posta elettronica per tutti i post nella tua tassonomia e poi passali usando l' 'post__id'argomento o

  3. Annota l'SQL utilizzato daWP_Query con uno degli hook che ti consente di aggiungere un SQL che fa INNER JOINriferimento alle tabelle di tassonomia.

Cerco di evitare l'SQL completo in WordPress fino a quando non può essere aiutato o restituisce semplicemente un elenco di ID. E in questo caso eviterei di estrarre un elenco di messaggi $post-IDda utilizzare con l' 'post__id'argomento perché potrebbe incorrere in problemi di prestazioni e persino problemi di memoria se si dispone di molti post. Quindi questo ci lascia con il n. 3.

Ho creato una classe per estendereWP_Query chiamata PostsByTaxonomyche utilizza l' 'posts_joinhook. Potete vederlo qui:

class PostsByTaxonomy extends WP_Query {
  var $posts_by_taxonomy;
  var $taxonomy;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    unset($args['taxonomy']);
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_by_taxonomy)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  AND {$wpdb->term_taxonomy}.taxonomy='{$this->taxonomy}'
SQL;
    }
    return $join;
  }
}

Chiameresti questa classe come vedi sotto. L'argomento 'taxonomy'è obbligatorio ma è possibile passare qualsiasi (tutti?) Degli altri parametri previstiWP_Query , come ad esempio 'posts_per_page':

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

Puoi copiare la PostsByTaxonomyclasse nel functions.phpfile del tuo tema , oppure puoi usarla all'interno di un .phpfile di un plugin che potresti scrivere.

Se vuoi testarlo rapidamente, ho pubblicato su Gist una versione autonoma del codice che puoi scaricare e copiare nella radice del tuo server web come test.php, modificarla per il tuo caso d'uso e quindi richiedere dal tuo browser usando un URL come http://example.com/test.php.

AGGIORNARE

Per omettere Sticky Posts dai post inclusi nella query, prova questo:

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
  'caller_get_posts' => true,
));

O se per te è importante che la PostsByTaxonomyclasse non includa mai post appiccicosi potresti metterlo nel costruttore:

  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    $args['caller_get_posts'] = true     // No Sticky Posts
    unset($args['taxonomy']);
    parent::query($args);
  }

AGGIORNAMENTO 2

Dopo aver pubblicato quanto sopra ho appreso che 'caller_get_posts' sarà deprecato e 'ignore_sticky_posts'verrà utilizzato in WordPress 3.1.


Mike, grazie per il tuo aiuto. Non riesco a farlo funzionare per qualche motivo. Non restituisce solo post con termini assegnati dalla mia tassonomia personalizzata. Sembra sempre di restituire altri post. Tuttavia, non restituisce tutti i post, quindi sta sicuramente facendo qualcosa ... Sono in grado di usare la funzione $ query-> have_posts () per iterare? Nessuno dei due metodi sembra funzionare per me, in entrambi i casi.
Dave Morris,

Ah, questo è interessante. Ho trovato la query nel registro mysql che ottiene i due post che mi aspetto e funziona. Ma per qualche ragione, tornano cinque post quando giro su $ query-> post. L'unica altra cosa che noto è che subito dopo l'esecuzione della query dei post della tassonomia personalizzata, viene eseguita un'altra query che prende altri tre post, dai loro post_id. E quindi immagino che tutti e cinque i post vengano inseriti in un array di risultati.
Dave Morris,

Penso di averlo capito. Questa query personalizzata sembra includere post appiccicosi, anche se non si trovano in quella tassonomia personalizzata. Qualche idea su come onorare correttamente i post appiccicosi o almeno per farli uscire da questa particolare query? Grazie, Dave
Dave Morris,

Beh, sono "appiccicosi" , giusto? :) È un comportamento strano, penso, ma se usi caller_get_posts=1e dovrebbero sparire: codex.wordpress.org/Function_Reference/… Spero che questo aiuti.
MikeSchinkel,

Questo if(isset($query->posts_by_taxonomy))è un bel trucco per combinare la metodologia orientata agli oggetti con la metodologia hook di WordPress.
Jan Fabry,

1

Dovresti essere in grado di impostare la tassonomia e negare di includere un termine.

Per esempio.

<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>

Che sarebbe praticamente lo stesso della query eseguita da un archivio di tassonomia.


Non funziona
Dave Morris,

La riga 1432 di query.php controlla se la tassonomia O il termine sono vuoti, quindi non puoi semplicemente non passare una lumaca ... Altre idee?
Dave Morris,

@ t31os - Anche questa è stata la prima reazione; In realtà sono stato inciampato più di una volta da quando continuo a dimenticare. Ma @Dave Morris ha ragione; se non è una coppia tassonomia / termine, la WP_Querygetta via.
MikeSchinkel,

6
@ t31os - Sì, WP_Querypurtroppo non è implementato in modo così elegante. Sono quasi 1200 le linee di casi speciali codificati.
MikeSchinkel,

3
"quasi 1200 linee di casi speciali codificati." ... che mi ha fatto lol, ho dovuto fare +1 sul commento ...;)
t31os,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.