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.