web-dev-qa-db-fra.com

comment regrouper les publications de type publication personnalisée par terme de taxonomie personnalisée

J'apprécierais vraiment si vous pouviez m'aider :) Je suis très coincé et je ne sais pas comment procéder.

J'ai un type de message personnalisé appelé event et 2 taxonomies personnalisées enregistrées pour celui-ci:

  1. event_type avec fonctionnalité de type tag (ex. type d'événement: yoga, travail vocal)
  2. event_location avec une fonctionnalité de type catégorie (ex du lieu de l'événement: uk-> brighton, londres; europe-> paris).

Il y a des pages sur le site comme Yoga -> Upcoming events; Voice work -> Upcoming workshops. En fonction de la page sur laquelle nous sommes, j'aimerais afficher les événements appropriés. Par exemple, si nous nous trouvons à la page Yoga -> Upcoming events, j'aimerais afficher toutes les publications personnalisées event avec event_type correspondant au yoga, puis regrouper les résultats par event_location termes de taxonomie. Par exemple, répertoriez tous les événements de yoga pour le Royaume-Uni, Brighton, puis le Royaume-Uni, Londres, puis l'Europe, Paris, etc.

Ce que je fais actuellement dans un modèle est le suivant:

  1. Je récupère le slug de la page en cours et de ses ancêtres.
  2. Je reçois des slugs de tous les termes de la taxonomie event_type, auxquels certains événements sont associés.
  3. Je détermine les types d'événements à afficher, en croisant les valeurs précédemment rassemblées.
  4. Ensuite, je construis un WP_Query pour obtenir les articles event avec des termes de taxonomie event_type déterminés.

Cela semble fonctionner. Cependant, les résultats sont revenus non ordonnés et je voudrais qu'ils soient classés par les termes de taxonomie event_location. Par exemple:

  • Royaume-Uni

    • Brighton
      • Événement 1
      • Événement 2
    • Londres
      • Événement 3
  • L'Europe 

    • Paris
      • Événement 4

J'aimerais également afficher uniquement les articles event non expirés et les commander par event_date. La valeur event_date est stockée en tant que méta-valeur avec le reste des détails de la publication event sous une seule méta_key.

Voici mon code jusqu'à présent:

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

Je ne suis pas bon pour construire des instructions SQL. J'apprécierais vraiment si vous pouviez m'aider. Merci beaucoup!!!

MODIFIER

J'ai considérablement simplifié la fonctionnalité (car j'ai été assez confus et perdu dans l'original). S'il vous plaît voir ma réponse.

Merci à @Bainternet pour avoir pris le temps et essayé de m'aider!

1
dashaluna

Je suis un peu confus avec celui-ci. À la fin, j'ai décidé de ne pas regrouper les événements par catégorie event_location et de simplifier les fonctionnalités.

Ce que j'ai fait à la place est le suivant:

  1. Je détecte les événements event_type à afficher en consultant une URL. Ensuite, j’affiche tous les événements de ce event_type et les classe par event_date ASC - ceux qui vont bientôt apparaître en premier. Ici l'URL est de format /events?type=event_type

  2. Je présente une barre latérale avec tous les termes de la catégorie event_location. Un utilisateur peut voir tous les événements dans un emplacement spécifique en cliquant sur les liens. L'URL dans ce cas a le format suivant: /events?location=event_location. Les événements de tous types, mais pour cet emplacement spécifique, sont affichés en ordre ASC (ceux qui vont bientôt apparaître en premier).

Ensuite, dans ma requête personnalisée, j'inclus 'tax_query'. Par exemple, pour la taxonomie event_location, quelque chose comme:

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

J'espère que ça aide quelqu'un.

0
dashaluna

essayez d’utiliser cette fonction sophistiquée qui regroupe les publications en fonction du terme que créé par Scribu et Mike :

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

ajouter à votre tableau args 'orderby' => 'event_location'

et avant la requête ajouter

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

après la requête ajouter

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

Je ne pouvais pas faire fonctionner le filtre comme l'a suggéré @Bainternet. J'ai essayé de construire tout le code SQL, mais je suis sûr que je ne fais pas quelque chose de mal car cela ne fonctionne pas: S apprécierait vraiment toute aide. Merci!

J'ai codé en dur les valeurs de clé méta event_type et event_date pour le moment.

  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