Personalizzato WP_Query Tassonomia tutti i termini in una tassonomia?
Domanda
C'è un modo semplice per query per qualsiasi post che è etichettato con qualsiasi termine da un particolare tassonomia?
Lo so questa tecnica:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
Ma mi piacerebbe passare sia un jolly al posto di term_slug, o forse solo una stringa vuota. Allora che mi avrebbe dato tutti i messaggi che sono contrassegnati da qualsiasi termine che tassonomia, non solo un termine specifico.
Grazie per il vostro aiuto, Dave
Soluzione
In retrospettiva, ho fatto un mashup di MikeSchinkel e t31os suggestione. E 'possibile iniettare che per le query esistente al volo, ma ha bisogno di WordPress 3.1:
Plugin per ottenere un feed RSS per i messaggi contenenti qualsiasi termine da una tassonomia.
Altri suggerimenti
ho incontrato una situazione simile Dave. Questo codice ha fatto il trucco per i miei scopi. Non è l'opzione più magra del mondo, ma lo 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,
),
),
) );
Speriamo che questo aiuto tu o chiunque altro vivendo il problema.
Kevin
Qualcosa di simile a questo lavoro potrebbe:
$args = array( 'post_type' => 'post', 'tax_query' => array( array( 'taxonomy' => 'your_custom_taxonomy', 'operator' => 'EXISTS' ), ), ); $query = new WP_Query( $args );
Si sono fondamentalmente chiedendo per qualsiasi posto assegnato a qualsiasi termine entro your_custom_taxonomy.
Ciao @ Dave Morris:
Lei ha ragione, WordPress decide se non si dispone di un termine faranno solo ignorare il tuo tassonomia.
Ci sono tre (3) approcci principali si potrebbe provare:
-
Usa uno SQL completo di query con
$wpdb->get_results()
, -
Ottenere un elenco di
$post->ID
s per tutti i post della tua tassonomia e poi passarli utilizzando l'argomento'post__id'
, o -
Annota il codice SQL utilizzato da
WP_Query
con uno dei ganci che ti permette di aggiungere unaINNER JOIN
SQL riferimento alle tabelle tassonomia.
cerco di evitare SQL completo in WordPress fino a quando essa non può essere aiutato o è semplicemente la restituzione di un elenco di ID. E in questo caso eviterei tirando un elenco di $post-ID
s per l'uso con l'argomento 'post__id'
perché potrebbe incorrere in problemi di prestazioni e problemi di memoria, anche se si ha un sacco di posti. In modo che ci lascia con # 3.
Ho creato una classe di estendere WP_Query
chiamato PostsByTaxonomy
che utilizza il 'gancio 'posts_join
. 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;
}
}
Si potrebbe chiamare questa classe come vedete qui sotto. Il 'taxonomy'
argomento è un richiesto , ma si può passare qualsiasi (tutti?) degli altri parametri che si aspetta WP_Query
pure, 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";
}
È possibile copiare la classe PostsByTaxonomy
nel file functions.php
del vostro tema, oppure è possibile utilizzarlo all'interno di un file .php
di un plugin si può essere in forma scritta.
Se si desidera verificare rapidamente che ho postato una versione autonoma del codice a Gist, che è possibile scaricare e copiare principale del server web come test.php
, modificare per il vostro caso d'uso, e quindi richiedere dal browser utilizzando un URL come http://example.com/test.php
.
UPDATE
omettere Sticky Post dai pali inclusi nella query, provate questo:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
O se è importante per voi che la classe PostsByTaxonomy
non includono i messaggi appiccicose si potrebbe mettere al 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);
}
UPDATE 2
Dopo aver postato quanto sopra ho imparato 'caller_get_posts' sarà deprecato e 'ignore_sticky_posts'
sarà utilizzato in WordPress 3.1.
Si dovrebbe solo essere in grado di impostare la tassonomia e negare per includere un termine ..
Eg.
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
Il che sarebbe più o meno lo stesso come la query un archivio tassonomia esegue.