web-dev-qa-db-fra.com

Liste de publication de modèle de taxonomie personnalisée avec ordre de tri

J'ai un problème intéressant que j'essaie de résoudre. Voici mes situations:

  • J'ai créé un type de message personnalisé pour "événements".
  • Pour chaque publication d'événement, des champs personnalisés doivent être entrés pour la date/heure de début de l'événement.
  • En outre, chaque événement peut être affecté à une taxonomie personnalisée créée spécifiquement pour affecter chaque événement à une ou plusieurs "catégories d'événements" (ma taxonomie personnalisée).
  • J'ai créé un modèle public qui appelle tous les articles appartenant à ce type d'article personnalisé et filtre correctement la requête pour afficher uniquement les événements où le début/la date et l'heure de l'événement sont supérieurs à la date du jour.
  • Tout ce qui précède fonctionne correctement.

La seule chose qui me pose problème actuellement, c'est l'affichage de tous les événements pour un terme de taxonomie spécifique.

En d'autres termes ... avec chaque liste d'événements, j'inclus tous les termes associés à l'événement de ma taxonomie personnalisée (catégories d'événements).

Le problème ici est donc que chaque terme de taxonomie apparaît (correctement) sous forme de lien, mais lorsque vous sélectionnez le terme, la page d'archivage des termes correspondante ne trie pas les résultats correspondants dans le champ personnalisé de date/heure de l'événement et n'exclut pas les événements qui sont plus âgés que la date d'aujourd'hui.

Basé sur cette page: http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

J'ai découvert qu'il est possible de créer une page d'archive personnalisée pour tous les termes appartenant à une taxonomie personnalisée en nommant le fichier d'archive comme suit:

taxonomy-event_categories.php (où "event_categories") est le nom de ma taxonomie personnalisée.

Sooooooooo ... Comme mentionné, la seule chose pour laquelle j'ai besoin d'une solution est le code correct à insérer pour résoudre les deux problèmes mentionnés ci-dessus.

Voici le code que j'utilise, qui affiche correctement ma liste d'événements organisée par la date/heure de début de l'événement tout en supprimant tous les événements plus anciens qu'aujourd'hui.

<?php 
    //Get the metadata for each child page
    global $custom_metabox_event_dates;
    $meta1  = $custom_metabox_event_dates->the_meta();
       $today = time();
       $arrMonthNums = array("01" => "01", "02" => "02", "03" => "03", "04" => "04", "05" => "05", "06" => "06", "07" => "07", "08" => "08", "09" => "09", "10" => "10", "11" => "11", "12" => "12");
       $arrMonthNames = array("01" => "JANUARY", "02" => "FEBRUARY", "03" => "MARCH", "04" => "APRIL", "05" => "MAY", "06" => "JUNE", "07" => "JULY", "08" => "AUGUST", "09" => "SEPTEMBER", "10" => "OCTOBER", "11" => "NOVEMBER", "12" => "DECEMBER");
    query_posts('post_type=events&showposts=-1&meta_key=' . $custom_metabox_event_dates->get_the_name('combined_datetime') . '&meta_compare=>=&meta_value=' . $today . '&orderby=meta_value&order=ASC'); 
?>

  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <?php  //Get all Events and run a check against current date
    global $custom_metabox_event_dates; 
    global $custom_metabox_event_details; 
    $meta1          = $custom_metabox_event_dates->the_meta(); 
    $meta2          = $custom_metabox_event_details->the_meta();
    $meta_start_date    = $meta1['event_start_date'];
    $meta_end_date  = $meta1['event_end_date'];
    $meta_start_time    = $meta1['event_start_time'];
    $meta_end_time  = $meta1['event_end_time'];
    $meta_location_city = $meta2['event_location_city'];
    $meta_event_type    = $meta2['event_type'];
    $show_date      = strtotime($meta_start_date);
        if($show_date >= $today) { ?>
           <?php 
            $show_month = date('m', $show_date);
            if ($arrMonthNums[$show_month] == $show_month) {
            echo "<div id='category-events-list-month-title'>EVENTS IN ".$arrMonthNames[$show_month]."</div>"; 
            $arrMonthNums[$show_month] = "printed";
            }
        if($show_date == $today) { 
            ?>   
           <?php } ?>
    <div id="category-events-list-container-group">
                     <div id="category-events-list-container-left">
            <div id="event-entry-list-date"><?php echo $meta_start_date ?></div>
            <div id="event-entry-list-time"><?php echo $meta_start_time ?> - <?php echo $meta_end_time ?></div>
            </div>
            <div id="category-events-list-container-right">
        <div id="category-articles-list-title"><a href="<?php the_permalink() ?>"><?php echo the_title(); ?></a></div>
        <div id="category-articles-list-excerpt">
        <span>EVENT TYPE: <?php echo get_the_term_list($post->ID, 'event_types', '', ', ',''); ?> </span><br />
        <span>LOCATION: <?php echo $meta_location_city ?></span><br />
        <?php echo substr(get_the_excerpt(),0,250); echo '...  ' ?></div>
        </div>
            </div>
    <?php } ?>
<?php endwhile; endif; ?>

Veuillez garder à l'esprit que je ne demande pas comment modifier la requête ci-dessus afin d'afficher uniquement les messages d'un terme ... Je dois plutôt que la page d'archive reconnaisse le terme sur lequel l'utilisateur a cliqué et la répercute essentiellement via la requête. avec la commande/filtrage que je fais ci-dessus.

Je suppose que c'est probablement une réponse simple qui implique la "boucle" que je n'ai pas encore maîtrisée.

MIS À JOUR

Voici le code de la page d’archive qui doit être modifiée. Ainsi, lorsqu’un terme est cliqué dans la liste de résultats ci-dessus, il affiche UNIQUEMENT les mêmes résultats, mais uniquement pour le terme sélectionné ET triés par date/heure ET en éliminant les événements antérieurs à ce jour. rendez-vous amoureux.

<?php if (have_posts()) : ?>
      <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
      <?php /* If this is a category archive */ if (is_category()) { ?>
        <div id="category-title-articles">Archive for the &#8216;<?php single_cat_title(); ?>&#8217; Category</div>
      <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
        <div id="category-title-articles">Posts Tagged &#8216;<?php single_tag_title(); ?>&#8217;</div>
      <?php } ?>
<?php while (have_posts()) : the_post(); ?>
<div id="category-articles-list-container-group">
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
</div>
<?php else :
    if ( is_category() ) { // If this is a category archive
        printf("<h2 class='center'>Sorry, but there aren't any posts in the %s category yet.</h2>", single_cat_title('',false));
    } else if ( is_date() ) { // If this is a date archive
        echo("<h2>Sorry, but there aren't any posts with this date.</h2>");
    } else if ( is_author() ) { // If this is a category archive
        $userdata = get_userdatabylogin(get_query_var('author_name'));
        printf("<h2 class='center'>Sorry, but there aren't any posts by %s yet.</h2>", $userdata->display_name);
    } else {
        echo("<h2 class='center'>No posts found.</h2>");
    }
    get_search_form();
endif; ?>

Merci d'avance,

Chris

4

Le moyen le plus efficace est probablement d’attacher l’action pre_get_posts et d’y ajouter votre comparaison de temps. De cette façon, vous n'avez pas à vous soucier du reste ni des options de requête, car elles continueront à fonctionner. Il devrait ressembler à ceci (non testé) et être placé dans un fichier de fonctions de plug-in ou de thème (pas dans le fichier de modèle de page, la requête aura déjà été exécutée):

add_action('pre_get_posts', 'add_event_date_criteria');
function add_event_date_criteria(&$query)
{
    // We only want to filter on "public" pages
    // You can add other selections, like here:
    //  - Only on a term page for our custom taxonomy
    if (!is_admin() &&
        is_tax('event_types')) {
        global $custom_metabox_event_dates;
        $query->set('meta_key', $custom_metabox_event_dates->get_the_name('combined_datetime'));
        $query->set('meta_compare', '>=');
        $query->set('meta_value', time());
        $query->set('orderby', 'meta_value');
        $query->set('order', 'asc');
    }
}

Vous définissez la portée de ce filtre supplémentaire avec le contenu du test if(). Actuellement, nous ne le faisons pas sur les pages d'administration (vous ne pourriez pas accéder à l'ancien contenu), mais uniquement sur des pages de taxonomie spécifiques. Vous devriez découvrir par vous-même à quel point vous voulez cela.

Si vous ne pouvez pas le résoudre de cette manière, vous pouvez relancer la requête principale sans perdre la "requête spécifique à la page" en ajoutant les différents vars de requête aux objets $wp_query principaux et en appelant à nouveau $wp_query->get_posts(). Puisque nous n'avons pas appelé $wp_query->parse_query(), les arguments de requête spécifiques à une page ne seront pas effacés. Cela ressemblerait à ceci:

global $custom_metabox_event_dates;
$wp_query->set('meta_key', $custom_metabox_event_dates->get_the_name('combined_datetime'));
$wp_query->set('meta_compare', '>=');
$wp_query->set('meta_value', time());
$wp_query->set('orderby', 'meta_value');
$wp_query->set('order', 'asc');
$wp_query->get_posts();

Vous pouvez le placer dans vos fichiers de modèle (pas functions.php, mais taxonomy-event_types.php ou d’autres "modèles" de modèles). N'oubliez pas que vous "jetez" un appel de base de données de cette façon, ce n'est donc pas la solution la plus optimale.

7
Jan Fabry