it-swarm.com.de

so gruppieren Sie benutzerdefinierte Posts nach benutzerdefinierten Taxonomiebedingungen

Ich würde mich sehr freuen, wenn Sie mir helfen könnten :) Ich stecke fest und weiß nicht, wie ich vorgehen soll.

Ich habe einen benutzerdefinierten Beitragstyp namens event und 2 dafür registrierte benutzerdefinierte Taxonomien:

  1. event_type mit tag-ähnlicher Funktionalität (z. B. vom Ereignistyp: Yoga, Spracharbeit)
  2. event_location mit kategorieartiger funktionalität (ab veranstaltungsort: uk-> brighton, london; europa-> paris).

Es gibt Seiten auf der Website wie Yoga -> Upcoming events; Voice work -> Upcoming workshops. Abhängig von der Seite, auf der wir uns befinden, möchte ich entsprechende Ereignisse anzeigen. Wenn wir zum Beispiel auf der Seite Yoga -> Upcoming events sind, möchte ich alle event benutzerdefinierten Beiträge anzeigen, wobei event_type Yoga ist, und die Ergebnisse dann nach event_location Taxonomiebegriffen gruppieren. Listen Sie beispielsweise alle Yoga-Events für Großbritannien, Brighton, Großbritannien, London und dann Europa, Paris usw. auf.

Was ich derzeit in einer Vorlage mache, ist Folgendes:

  1. Ich bekomme den Slug der aktuellen Seite und ihrer Vorfahren.
  2. Ich bekomme alle Begriffe in der Taxonomie event_type, mit denen einige Ereignisse verknüpft sind.
  3. Ich bestimme, welche Ereignistypen angezeigt werden sollen, indem ich zuvor erfasste Werte schneide.
  4. Dann erstelle ich eine WP_Query, um event Posts mit bestimmten event_type Taxonomiebedingungen zu erhalten.

Das scheint zu funktionieren. Die Ergebnisse sind jedoch ungeordnet zurückgekehrt, und ich möchte, dass sie nach event_location Taxonomiebedingungen sortiert werden. Zum Beispiel:

  • Vereinigtes Königreich

    • Brighton
      • Veranstaltung 1
      • Ereignis 2
    • London
      • Ereignis 3
  • Europa

    • Paris
      • Ereignis 4

Ich möchte auch nur nicht abgelaufene event Posts anzeigen und nach event_date bestellen. Der event_date-Wert wird zusammen mit den restlichen event-Post-Details unter einem einzelnen meta_key als Meta-Wert gespeichert.

Hier ist mein Code:

    //pull in the appropriate events depending on the page type: yoga/voice work
    /* get the ancestors and current page slugs */
    // collect ancestor pages
    $relations = get_post_ancestors($post->ID);
    // add current post to pages
    array_Push($relations, $post->ID);
    // get pages slugs
    $relations_slugs = array();
    foreach($relations as $page_ID){
        $page = get_page($page_ID);
        array_Push($relations_slugs, $page->post_name);
    }

    /* get the term slugs (non-empty) for event_type taxonomy */
    //get the event_type taxonomy values
    $event_types = get_terms( 'event_type', 'hide_empty=true' );
    $event_types_slugs = array();
    foreach($event_types as $event_type){
        array_Push($event_types_slugs, $event_type->slug);
    }

    /* find what event_type to display on the current page */
    $page_event_types = array_intersect($relations_slugs, $event_types_slugs);
    $page_event_types_string = implode(",",$page_event_types);

    /* find the events of the event_type to display on the current page */
    $args = array(
        'post_type' => 'event',
        'tax_query' => array(
            array(
                'taxonomy' => 'event_type',
                'field' => 'slug',
                'terms' => $page_event_types_string
            )
        )
    );
    $temp = $wp_query; //assign orginal query to temp variable for later use   
    $wp_query = null;
    $wp_query = new WP_Query($args);

    /* run the loop to output the event's details */
    get_template_part( 'loop', 'event-details' );

Ich bin nicht gut darin, SQL-Anweisungen zu konstruieren. Ich würde mich sehr freuen, wenn Sie mir helfen könnten. Vielen Dank!!!

EDIT

Ich habe die Funktionalität erheblich vereinfacht (da ich im Original ziemlich verwirrt und verloren war). Bitte sehen Sie meine Antwort.

Vielen Dank an @Bainternet, dass Sie sich die Zeit genommen und versucht haben, mir zu helfen!

1
dashaluna

Ich habe ein bisschen mit diesem verwirrt. Am Ende habe ich beschlossen, die Ereignisse nicht nach event_location zu gruppieren und die Funktionalität zu vereinfachen.

Was ich stattdessen getan habe, ist das Folgende:

  1. Ich erkenne, welche event_type-Ereignisse angezeigt werden sollen, indem ich eine URL betrachte. Dann zeige ich alle Ereignisse dieses event_type an und ordne sie nach event_date ASC - die, die demnächst zuerst erscheinen. Hier hat die URL das Format /events?type=event_type

  2. Ich präsentiere eine Seitenleiste mit allen Begriffen der Kategorie event_location. Ein Benutzer kann alle Ereignisse an einem bestimmten Ort anzeigen, indem er auf die Links klickt. Die URL hat in diesem Fall das folgende Format: /events?location=event_location. Ereignisse aller Art, außer für diesen bestimmten Ort, werden in ASC-Reihenfolge angezeigt (die, die demnächst als erste angezeigt werden).

Dann füge ich in meine benutzerdefinierte Abfrage 'tax_query' ein. Zum Beispiel für die Taxonomie event_location so etwas wie:

$wp_query['tax_query'] = array('taxonomy' => 'event_location',
                               'field' => 'slug',
                               'terms' => $_GET['location']
                              )

Hoffe das hilft jemandem.

0
dashaluna

versuchen Sie, diese ausgefallene Funktion zu verwenden, die die Posts nach der Term-ID gruppiert, die Scribu und Mike erstellt haben :

function event_clauses( $clauses, $wp_query ) {
    global $wpdb;

    if ( isset( $wp_query->query['orderby'] ) && 'event_location' == $wp_query->query['orderby'] ) {

        $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
        $clauses['where'] .= " AND (taxonomy = 'event_location' OR taxonomy IS NULL)";
        $clauses['groupby'] = "object_id";
        $clauses['orderby']  = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
        $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
    }

    return $clauses;
}

füge zu deinem args-Array hinzu 'orderby' => 'event_location'

und vor der Abfrage hinzufügen

 add_filter( 'posts_clauses', 'event_clauses', 10, 2 );

nach der Abfrage hinzufügen

remove_filter( 'posts_clauses', 'event_clauses');
3
Bainternet

Der Filter funktionierte nicht wie von @Bainternet vorgeschlagen. Ich habe versucht, das gesamte SQL zu erstellen, aber ich bin sicher, dass ich etwas falsch mache, da es nicht funktioniert: S Würde mich über jede Hilfe wirklich freuen. Vielen Dank!

Ich habe den event_type- und den event_date-Metaschlüsselwert vorerst fest codiert.

  SELECT posts.*
  FROM wp_posts as posts
  LEFT OUTER JOIN wp_postmeta as postmeta ON posts.ID = postmeta.post_id
  LEFT OUTER JOIN wp_term_relationships as relationships ON posts.ID = relationships.object_id
  LEFT OUTER JOIN wp_term_taxonomy as taxonomy ON relationships.term_taxonomy_id = taxonomy.term_taxonomy_id
  LEFT OUTER JOIN wp_terms as terms ON taxonomy.term_id = terms.term_id
  WHERE posts.post_type = 'event' AND posts.post_status = 'publish' 
  AND postmeta.meta_key = 'event_date' AND postmeta.meta_value >= '2011-02-02'
  AND terms.slug = 'kirtan' AND taxonomy.taxonomy = 'event_type' AND taxonomy.count > 0
  GROUP BY taxonomy.taxonomy
  ORDER BY terms.slug ASC, postmeta.meta_value ASC
0
dashaluna