it-swarm.com.de

Benutzerdefinierte Taxonomie WP_Query für alle Begriffe in einer Taxonomie?

Gibt es eine einfache Möglichkeit, nach Posts zu suchen, die mit einem Begriff aus einer bestimmten Taxonomie versehen sind?

Ich kenne diese Technik:

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

Aber ich möchte entweder einen Platzhalter anstelle von term_slug oder nur eine leere Zeichenfolge übergeben. Dann würde das mir alle Posts geben, die durch irgendeinen Begriff in dieser Taxonomie markiert sind, nicht nur einen bestimmten Begriff.

Vielen Dank für Ihre Hilfe, Dave

6
Dave Morris

Rückblickend habe ich ein Mashup von MikeSchinkel und t31os Vorschlag gemacht. Es ist möglich, das direkt in bestehende Abfragen einzufügen, aber es benötigt WordPress 3.1:

Plugin zum Abrufen eines RSS-Feeds für Posts, die einen Begriff aus einer Taxonomie enthalten.

1
hakre

Ich bin auf eine ähnliche Situation gestoßen, Dave. Dieser Code hat den Trick für meine Zwecke gemacht. Es ist nicht die schlankste Option der Welt, aber es macht den Job gut:

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

Hoffentlich hilft dies Ihnen oder anderen, die das Problem haben.

Kevin

18
Kevin Leary

So etwas könnte funktionieren:

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

Sie fragen grundsätzlich nach einem Beitrag, der einem Begriff in Ihrer_Kunden_Taxonomie zugeordnet ist.

5
laurenfs132

Hallo @ Dave Morris:

Sie haben Recht, WordPress entscheidet, dass Ihre Taxonomie ignoriert wird, wenn Sie keinen Begriff haben.

Es gibt drei (3) Hauptansätze Sie könnten versuchen:

  1. Verwenden Sie eine vollständige SQL-Abfrage mit $wpdb->get_results(),

  2. Eine Liste von $post->IDs für alle Posts in Ihrer Taxonomie abrufen und diese dann mit dem Argument 'post__id' übergeben

  3. Kommentieren Sie den von WP_Query verwendeten SQL-Code mit einem der Hooks, mit denen Sie einen SQL-Code INNER JOIN hinzufügen können, der auf die Taxonomietabellen verweist.

Ich versuche, vollständiges SQL in WordPress zu vermeiden, bis entweder nicht mehr geholfen werden kann oder einfach eine Liste von IDs zurückgegeben wird. In diesem Fall würde ich es vermeiden, eine Liste von $post-IDs zur Verwendung mit dem Argument 'post__id' abzurufen, da es zu Leistungsproblemen und sogar zu Speicherproblemen kommen kann, wenn Sie viele Posts haben. Also das lässt uns mit # 3.

Ich habe eine Klasse zum Erweitern von WP_Querymit dem Namen PostsByTaxonomy erstellt, die den Hook 'posts_join verwendet. Sie können es hier sehen:

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

Sie würden diese Klasse nennen, wie Sie unten sehen. Das Argument 'taxonomy' ist ein erforderliches , aber Sie können alle (all?) Der anderen Parameter übergeben, die WP_Query ebenfalls erwartet, z. B. 'posts_per_page':

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

Sie können die Klasse PostsByTaxonomy in die Datei functions.php Ihres Themas kopieren oder sie in einer .php-Datei eines Plugins verwenden, das Sie möglicherweise schreiben.

Wenn Sie es schnell testen möchten, habe ich eine in sich geschlossene Version des Codes in Gist gepostet, die Sie herunterladen und als test.php in das Stammverzeichnis Ihres Webservers kopieren können. Ändern Sie diese für Ihren Anwendungsfall und fordern Sie dann über Ihren Browser eine URL wie http://example.com/test.php an.

AKTUALISIEREN

Versuchen Sie Folgendes, um Sticky Posts wegzulassen von den in der Abfrage enthaltenen Posts:

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

Oder wenn es für Sie wichtig ist, dass die Klasse PostsByTaxonomy niemals "sticky posts" enthält, können Sie sie in den Konstruktor einfügen:

  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

Nach dem Veröffentlichen der obigen Informationen wurde festgestellt, dass "caller_get_posts" veraltet sind und 'ignore_sticky_posts' in WordPress 3.1 verwendet wird.

3
MikeSchinkel

Sie sollten nur in der Lage sein, die Taxonomie festzulegen und zu negieren, um einen Begriff einzuschließen.

Z.B.

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

Dies entspricht in etwa der Abfrage, die ein Taxonomiearchiv durchführt.

1
t31os