it-swarm.com.de

Erhalten Sie den Schnittpunkt von zwei benutzerdefinierten Taxonomiebedingungen für einen benutzerdefinierten Beitragstyp?

( Hinweis für Moderatoren : Wurde ursprünglich mit "Wie erhalte ich Posts eines benutzerdefinierten Post-Typs, der sich in zwei benutzerdefinierten Taxonomien befindet?" )

Ich habe einen benutzerdefinierten Beitragstyp mit zwei getrennten Taxonomien, einer mit dem Namen "Projekttyp" und einer mit dem Namen "Paket" . Ich brauche eine Liste von Projekten, die "Projekttyp" A und "Paket" A sind. Ich habe versucht, folgenden Code zu verwenden:

$args = array(
  'post_type' => 'portfolio', 
  'numberposts' => -1, 
  'project_type' => 'A', 
  'package' => 'A'
); 
$my_posts = get_posts($args);  

Dies erhält jedoch alle Posts, dieENTWEDERin Projekttyp A OR Paket A sind.

Gibt es in get_posts() eine Möglichkeit zu sagen, dass ich nur die Posts zurückgeben möchte, die sich inBOTHtaxonomies befinden?

6
Shaun

Ab Version 1.3 funktioniert das Plugin Query Multiple Taxonomies hervorragend mit WP_Query. Ihre ursprünglichen Argumente funktionieren wie sie sind.

$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);

Dann mache eine neue Abfrage und überprüfe sie:

$foo = new WP_Query($args);
var_dump($foo->posts);

Ich habe dies mit meinem eigenen benutzerdefinierten Taxonomie-Setup getestet und es wurden nur Posts zurückgegeben, die mit both terms in der Abfrage übereinstimmen.

Eine weitere bequeme Methode zum Abrufen mehrerer Taxonomiebegriffe mit QMT ist das Erstellen einfacher URL-Abfragen:

site.com/?post_type=portfolio&package=foo&project=bar

Ich habe diese Methode mit der Funktion add_query_args() verwendet, um Links auf einer Seite zu erstellen, mit denen die aktuelle Abfrage geändert und durch Hinzufügen zusätzlicher Begriffe und Taxonomien verfeinert wird. Die Syntax eignet sich auch hervorragend für eine Sucheingabe, da mehrere Wörter im Eingabefeld als foo + bar angezeigt werden. Dies funktioniert hervorragend mit QMT:

site.com/?post_type=portfolio&project=alpha&colors=red+blue+green

Was nur Beiträge zurückgibt, die alle diese Kriterien erfüllen - Typ: Portfolio/Projekt: Alpha/Farben: rot + blau + grün

4
somatic

Hi @shaun :

@Rarst hat insofern Recht, als sie diese Funktionalität zu WordPress v3.1 hinzufügen , aber es wird für eine Weile nicht hier sein und ich bin sicher, dass Sie es jetzt brauchen. Sie könnten versuchen, den Code zu finden, an dem sie arbeiten und versuchen, ihn zum Laufen zu bringen, Sie könnten das Plugin verwenden und @Rarst und @somatic erwähnen , oder Sie könnten einfach den Code, den Sie benötigen, in Ihr Design einbinden.

Der folgende Code ist ein posts_where-Hook zum Hinzufügen einer tax_terms-Abfragevariablen mit einem Wert im Format (d. H. Doppelpunkt-Komma), wobei die Werte den Begriff slugs haben:

"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"

Dies ist ein in sich geschlossener .php, den Sie im Stammverzeichnis Ihrer Website ablegen können, um ihn zu testen, bevor Sie den add_action-Aufruf und die tax_terms_where()-Funktion in die functions.php-Datei Ihres Themas (oder in die .php-Datei eines Ihrer eigenen Plugins) ziehen. )

<?php
/*
* Adds "tax_terms" to WP_Query()
*
* See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
* See: http://wordpress.stackexchange.com/questions/2255/
*
*/

  header('Content-Type:text/plain');
  include "wp-load.php";
  add_action('posts_where','tax_terms_where',10,2);

  $result = new WP_Query('post_type=portfolio&tax_terms=project_type:A,package:A');
  foreach($result->posts as $post) {
    echo "{$post->post_title}\n";
  }

function tax_terms_where($where,$wp_query) {
  if (isset($wp_query->query)) {
    $query = $wp_query->query;
    if (is_string($query))
      parse_str($query,$query);
    if (is_array($query) && isset($query['tax_terms'])) {
      global $wpdb;
      $tax_terms = explode(',',$query['tax_terms']);
      foreach($tax_terms as $tax_term) {
        list($taxonomy,$term) = explode(':',$tax_term);
        $sql = <<<SQL
AND $wpdb->posts.ID IN (
  SELECT tr.object_id
  FROM $wpdb->term_relationships AS tr
  INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
  INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
  WHERE tt.taxonomy='%s' AND t.slug='%s'
)
SQL;
        $where .= $wpdb->prepare($sql,$taxonomy,$term);
      }
    }
  }
  return $where;
}

Wenn dies nicht genau das ist, was Sie benötigen, weil Sie beispielsweise lieber den $term->term_id als den $term->slug abgleichen möchten, sollte es nicht zu schwierig sein, den Code an Ihre Anforderungen anzupassen, vorausgesetzt, Sie sind mit SQL und .php vertraut.

4
MikeSchinkel

Altes Q, aber anscheinend taucht es auf, also ist hier der aktuelle Stand - Taxonomie-Abfragen wurden in 3.1 und seitdem erheblich verbessert.

Heutzutage wird es einfach mit Steuerabfragen unter Verwendung der Beziehung AND behandelt, zum Beispiel aus Codex:

'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'movie_genre',
        'field'    => 'slug',
        'terms'    => array( 'action', 'comedy' ),
    ),
    array(
        'taxonomy' => 'actor',
        'field'    => 'term_id',
        'terms'    => array( 103, 115, 206 ),
        'operator' => 'NOT IN',
    ),
),

Siehe Taxonomieparameter für eine vollständige Dokumentation.


Üblicher Haftungsausschluss - Ich habe mich bisher selbst nicht mit benutzerdefinierten Dingen befasst.

Ich denke, komplexe Taxonomie-Abfragen sind (noch) nicht in WP core implementiert. Try Abfrage mehrerer Taxonomien Plugin.

1
Rarst