it-swarm.com.de

get_categories für einen benutzerdefinierten Beitragstyp mit einer bestimmten benutzerdefinierten Taxonomie

Grundsätzlich habe ich einen benutzerdefinierten Post-Typ von "Produkten", an den zwei Taxonomien angehängt sind ... die normale "Kategorie" und eine benutzerdefinierte Taxonomie namens "Marken".

Ich habe eine markenspezifische Seite. Auf dieser Seite möchte ich alle 'Kategorien' auflisten, in denen ein 'Produkt' mit einem Begriff der 'Marke' enthalten ist, auf deren Seite ich mich befinde.

Z.B. Sag ich bin auf der "Nike" Seite. Ich möchte, dass alle Kategorien aufgelistet werden, in denen ein "Produkt" mit der "Marke" "Nike" verknüpft ist.

Mein erster Gedanke ist, get_categories zu verwenden, aber gibt es jetzt eine Möglichkeit, eine bestimmte Taxonomie oder 'Marke' zu definieren?

$categories = get_categories('orderby=name&depth=1&hide_empty=0&child_of='.$cat);

Hat das schon mal jemand gemacht oder weiß, wie man die Datenbank direkt abfragt, um die gewünschten Ergebnisse zu erhalten?

Jede Hilfe wird sehr geschätzt, danke

6
daveaspinall

Hallo @daveaspi:

Was Sie tun möchten, ist üblich, wird aber im WordPress-Kern nicht gut behandelt. Es gibt wahrscheinlich Möglichkeiten, dies ohne benutzerdefiniertes SQL zu tun, aber ich glaube nicht, dass sie für eine große Anzahl von Posts skaliert würden. Unten ist eine von mir geschriebene Funktion mit dem Namen get_cross_referenced_terms() aufgeführt, mit der Sie genau das bekommen, was Sie möchten, einschließlich eines Beispiels für deren Verwendung.

Dieser folgende Code kann im Stammverzeichnis Ihrer WordPress-Site in einer test.php-Datei abgelegt werden, damit er funktioniert. Anschließend können Sie die Funktion get_cross_referenced_terms() in die functions.php-Datei Ihres Themas oder in eine .php-Datei eines Plugins kopieren, an dem Sie möglicherweise arbeiten:

<?php 

  include('wp-load.php');

  $nike = get_term_by('slug','nike','brand'); // This here just to illustrate

  $terms = get_cross_referenced_terms(array(
    'post_type'        => 'product',
    'related_taxonomy' => 'brand',
    'term_id'          => $nike->term_id,
  ));
  foreach($terms as $term) {
    echo "<p>{$term->name}</p>";
  }

function get_cross_referenced_terms($args) {
  global $wpdb;
  $args = wp_parse_args($args,array(
    'post_type'        => 'post',
    'taxonomy'         => 'category',
    'related_taxonomy' => 'post_tag',
    'term_id'          => 0,
  ));
  extract($args);
  $sql = <<<SQL
SELECT DISTINCT
  {$wpdb->terms}.*,
  COUNT(*) AS post_count
FROM
  {$wpdb->terms}
  INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id={$wpdb->term_taxonomy}.term_id
  INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  INNER JOIN {$wpdb->posts} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
  INNER JOIN {$wpdb->term_relationships} related_relationship ON {$wpdb->posts}.ID=related_relationship.object_id
  INNER JOIN {$wpdb->term_taxonomy} related_term_taxonomy ON related_relationship.term_taxonomy_id=related_term_taxonomy.term_taxonomy_id
  INNER JOIN {$wpdb->terms} related_terms ON related_term_taxonomy.term_id=related_terms.term_id
WHERE 1=1
  AND (related_term_taxonomy.taxonomy<>{$wpdb->term_taxonomy}.taxonomy OR related_terms.term_id<>{$wpdb->terms}.term_id)
  AND {$wpdb->posts}.post_type='%s'
  AND {$wpdb->term_taxonomy}.taxonomy='%s'
  AND related_term_taxonomy.taxonomy='%s'
  AND related_terms.term_id=%d
GROUP BY
  {$wpdb->terms}.term_id
SQL;
  $sql = $wpdb->prepare($sql,$post_type,$taxonomy,$related_taxonomy,$term_id);
  $terms = $wpdb->get_results($sql);
  return $terms;
}
3
MikeSchinkel

Wenn Sie alle verfügbaren Kategorien für einen benutzerdefinierten Beitragstyp auflisten möchten, hilft Ihnen dieses Snippet möglicherweise.

Verwenden Sie einfach die Standardfunktion get_categories() und übergeben Sie den $args für die Taxonomie, die Sie für Ihr CPT registriert haben. Wenn Sie Ihre Taxonomie folgendermaßen definiert haben:

register_taxonomy( 'the_taxonomy_named_in_your_CPT' );

Dann würden Sie die Taxonomie Front-End-Benutzern zeigen über:

$args = array( 
    'taxonomy'     => 'the_taxonomy_named_in_your_CPT',
    'orderby'      => 'name',
    'show_count'   => 1,
    'pad_counts'   => 1, 
    'hierarchical' => 1,
    'echo'         => 0
);

$allthecats = get_categories( $args );
echo ( '<pre>' );
print_r( $allthecats );
echo ( '</pre>' );

Sie werden ein Objekt sehen, das Ihnen auf Ihrem Weg helfen wird.

2
Steve Pheriche

Sie können entweder eine benutzerdefinierte SQL-Abfrage codieren oder Ihren Beitragstyp für diese "Marke" abfragen und die Kategorien sammeln und dann anzeigen, etwa:

//get all your post of that type fo that spesific brand
$my_query = new WP_Query();
$my_query->query(array(
    'post_type' => 'products',
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'brand',
            'field' => 'slug',
            'terms' => $wp_query->query_vars['brand']
        )
    )
    ));
$my_cats = array(); 
if ($my_query->have_posts()){
//loop over all post and collect the categories in to an array
    while ($my_query->have_posts()){
        $my_query->the_post();
        foreach((get_the_category($post->ID)) as $category) {
            if (!in_array($category->cat_ID ,$my_cats)){
                $my_cats[] = $category->cat_ID;
            }
        } 
    }
}

und hier haben Sie die Liste aller Kategorien ID in einem Array $ my_cats. Hier erhalten Sie alle Informationen, die Sie benötigen

1
Bainternet