it-swarm.com.de

Taxonomiebegriffe werden nach benutzerdefiniertem Beitragstyp verwendet

Ich habe einen benutzerdefinierten Beitragstyp - case -, für den ich eine Archivseite erstelle. Es gibt drei benutzerdefinierte Taxonomien für diesen Typ - Mikroorganismen , Infektionstypen und Antibiotika-Typen . Diese Taxonomien sind hierarchisch und enthalten eine Vielzahl von Begriffen, die bis zu drei Ebenen umfassen. Für den angegebenen Beitragstyp möchte ich Begriffe für beispielsweise die Antibiotika_Typen Taxonomie auflisten, die von Fall Einträgen verwendet werden.

Während ein Begriff innerhalb der Antibiotika_Typen Taxonomie von jedem der Einträge Fall verwendet werden kann, möchte ich die Hierarchie anzeigen, die zu dem ausgewählten Begriff führt.

Bisher funktioniert Folgendes: Es wird nur eine flache Liste der ausgewählten Begriffe angezeigt, die nicht die Hierarchie widerspiegelt, in der sich die Begriffe befinden.

// sourced from:
// http://wordpress.stackexchange.com/questions/66015/how-to-get-a-list-of-taxonomy-terms-which-are-being-used-only-within-certain-pos
function get_terms_by_post_type( $taxonomies, $post_types ) {
    global $wpdb;
    $query = $wpdb->get_results( "SELECT t.*, COUNT(*) AS count from $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id WHERE p.post_type IN('" . join( "', '", $post_types ) . "') AND tt.taxonomy IN('" . join( "', '", $taxonomies ) . "') GROUP BY t.term_id");
    return $query;
}
?>
...
<ul class="taxonomy-term-list">
<?php
$terms = get_terms_by_post_type(array($tax), array('case'));

foreach ($terms as $term):
    $termData = get_term_by('id', $term->term_id, $tax);
    $termName = $termData->name;
    $termUrl = get_term_link($termData);
?>
    <li class="taxonomy-term"><a href="<?php echo $termUrl; ?>?post_type=<?php echo $type; ?>"><?php echo $termName; ?> (<?php echo $term->count; ?>)</a></li>
<?php
endforeach;
?>
</ul>

Die Ausgabe ähnelt:

  • penicillin-g
  • ceftriaxon
  • amphotericin-b
  • 5-Flucytosin

Während die gewünschte Ausgabe ist:

  • beta-Lactame
    • cephalosporine
      • ceftriaxon
    • penicilline
      • penicillin-g
  • antimykotika
    • amphotericin-b
    • 5-Flucytosin

Ich habe auch Folgendes versucht:

wp_list_categories(
    array(
        'taxonomy' => 'antibiotic_types',
        'hierarchical' => 1,
        'hide_empty' => 1,
        'title_li' => ''
    )
);

Wobei alle der Begriffe für die angegebene Taxonomie angezeigt werden, auch diejenigen, die von keinem case - Eintrag verwendet werden.

Nachdem Sie die Funktionsreferenz durchgesehen haben, sieht es nicht so aus, als ob es eine eingebaute Funktion gibt, um das zu tun, was ich erreichen möchte, nicht direkt. Ich habe bis jetzt nicht viel mit Taxonomie-Abfragen gemacht. Irgendwelche Vorschläge?

1
Grant Palin

Wenn Sie doc für wp_list_categories im Codex sehen, akzeptieren Sie einen include -Parameter, der eine durch Kommas getrennte Liste von Kategorie-IDs enthalten sollte.

Wenn Sie also Ihre Funktion get_terms_by_post_type ändern, erstellen Sie die Funktion get_terms_id_by_post_type, um nur die Term-IDs abzurufen. Beispiel:

function get_terms_id_by_post_type( $taxonomies, $post_types ) {
    global $wpdb;
    $query = $wpdb->get_col( "SELECT t.term_id from $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id WHERE p.post_type IN('" . join( "', '", $post_types ) . "') AND tt.taxonomy IN('" . join( "', '", $taxonomies ) . "') GROUP BY t.term_id");
    return $query;
}

Dann kannst du:

// retrieve the term ids used by post type
$terms = get_terms_id_by_post_type( array($tax), array('case') );

// if that terms exist implode in a commasepared string
$term_list = ! empty($terms) ? implode(',', $terms) : false;

// use wp_list_categories with include param to included only used terms
if ( $term_list ) {
  wp_list_categories(
    array(
        'taxonomy' => 'antibiotic_types',
        'hierarchical' => 1,
        'hide_empty' => 1,
        'title_li' => '',
        'include' => $term_list
    )
  );
}
4
gmazzap

Nur für den Fall, dass jemand anderes, der sich umschaut, nur Begriffe aus einer Taxonomie anzeigen muss, die von CPT-Posts verwendet wird, die auf eine andere Taxonomie eingestellt sind, habe ich den folgenden Code verwendet, der auf der Antwort von @gmazzap basiert:

// Get all story post IDs set to story_type of "rn"
$story_post_ids = get_posts([
  'numberposts' => -1,
  'fields'      => 'ids',
  'post_type'   => 'story',
  'tax_query'   => [
    [
      'taxonomy' => 'story_type',
      'field'    => 'slug',
      'terms'    => ['rn'],
      'compare'  => 'IN',
    ]
  ],
]);

// Find story topics in use by those post IDs
$story_topic_ids = $wpdb->get_col("
      SELECT t.term_id FROM $wpdb->terms AS t
      INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id
      INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id
      WHERE tt.taxonomy IN('story_topic')
      AND r.object_id IN (".implode(',', $story_post_ids).")
      GROUP BY t.term_id
");

// Pull those topics
$story_topics = get_terms([
  'taxonomy' => 'story_topic',
  'include'  => $story_topic_ids,
]);

Dies findet alle Begriffe vom Typ story_topic, die von Beiträgen verwendet werden, die auf den Begriff story_type von "rn" gesetzt sind.

0
natebeaty