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

È stato utile?

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:

  1. Usa uno SQL completo di query con $wpdb->get_results(),

  2. Ottenere un elenco di $post->IDs per tutti i post della tua tassonomia e poi passarli utilizzando l'argomento 'post__id', o

  3. Annota il codice SQL utilizzato da WP_Query con uno dei ganci che ti permette di aggiungere una INNER 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-IDs 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top