Question

Y at-il un moyen facile de requête pour tous les postes qui est associé à aucune terme d'une taxonomie particulière?

Je sais cette technique:

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

Mais je voudrais passer soit un caractère générique à la place de term_slug, ou peut-être juste une chaîne vide. Ensuite, cela me donnerait tous les messages qui sont marqués par un terme dans cette taxonomie, pas seulement un terme spécifique.

Merci pour votre aide, Dave

Était-ce utile?

La solution

Avec le recul, je l'ai fait un mashup de suggestion MikeSchinkel et t31os. Il est possible d'injecter que pour les requêtes existantes à la volée, mais il a besoin de WordPress 3.1:

Plugin pour obtenir un flux RSS pour les messages contenant un terme d'une taxonomie.

Autres conseils

Je rencontrais une situation similaire Dave. Ce code a fait l'affaire pour mes besoins. Ce n'est pas l'option la plus maigre dans le monde, mais il fait bien le travail:

// 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,
        ),
    ),
) );

Espérons que cela vous aide ou quelqu'un d'autre connaît la question.

Kevin

Quelque chose comme ce travail pourrait:

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

Vous demandez essentiellement pour un poste attribué à un terme dans your_custom_taxonomy.

Salut Morris @ Dave:

Vous avez raison, WordPress décide si vous ne disposez pas d'un terme, ils vont tout simplement ignorer votre taxonomie.

Il y a trois (3) principales approches vous pouvez essayer:

  1. Utilisez une requête SQL complète avec $wpdb->get_results(),

  2. Obtenir une liste de $post->IDs pour tous les postes de votre taxonomie et les transmettre ensuite en utilisant l'argument 'post__id' ou

  3. annoter le SQL utilisé par WP_Query avec l'un des crochets qui vous permettent d'ajouter un est INNER JOIN SQL faisant référence aux tables de taxonomie.

J'essaie d'éviter SQL complète dans WordPress jusqu'à ce qu'il ne peut pas être aidé ou il est tout simplement retourner une liste d'ID. Et dans ce cas, j'éviter de tirer une liste de $post-IDs pour une utilisation avec l'argument 'post__id' parce qu'il pourrait rencontrer des problèmes de performance et même des problèmes de mémoire si vous aviez beaucoup de messages. Alors que nous laisse avec # 3.

J'ai créé une classe d'étendre WP_Query appelé PostsByTaxonomy qui utilise le crochet 'posts_join ». Vous pouvez le voir ici:

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;
  }
}

Vous appellerait cette classe comme vous le voyez ci-dessous. Le 'taxonomy' argument est un nécessaire , mais vous pouvez passer une (tous?) des autres paramètres qui attend de WP_Query aussi bien, comme 'posts_per_page':

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

Vous pouvez copier la classe PostsByTaxonomy au fichier functions.php de votre thème, ou vous pouvez l'utiliser dans un fichier .php d'un plugin peut être écrit.

Si vous voulez tester rapidement que je l'ai posté une version autonome du code Contenu essentiel que vous pouvez télécharger et copier sur votre racine du serveur Web comme test.php, pour modifier votre cas d'utilisation, puis demander à votre navigateur en utilisant une URL comme http://example.com/test.php.

UPDATE

Omettre Post-it Post des messages inclus dans la requête, essayez ceci:

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

Ou s'il est important pour vous que la classe ne comprend PostsByTaxonomy messages collants, vous pouvez le mettre dans le constructeur:

  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);
  }

MISE À JOUR 2

Après avoir affiché ce qui précède, j'ai appris « » caller_get_posts sera dépréciée et 'ignore_sticky_posts' sera utilisé dans WordPress 3.1.

Vous devriez juste être en mesure de définir la taxonomie et negate pour inclure un terme ..

Par exemple.

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

Ce qui serait à peu près la même que la requête a effectue des archives de taxonomie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top