Question

J'ai un problème intéressant, je suis en train de résoudre. Voici mes situations:

  • J'ai créer un type de poste personnalisé pour "événements".
  • Pour chaque poste de l'événement, je requiers champs personnalisés à saisir la date de début de l'événement / heure.
  • En outre, chaque événement peut être affecté à une taxonomie personnalisée J'ai créé spécifiquement pour attribuer à chaque événement à un ou plusieurs « catégories d'événements » (ma taxonomie personnalisée).
  • Je créer un modèle public, qui appelle tous les messages appartiennent à ce type de poste personnalisé et je filtrent correctement la requête aux événements d'affichage ONLY est le début de l'événement / date et l'heure est supérieure à la date d'aujourd'hui.
  • Tous les ci-dessus fonctionne correctement.

La seule chose que je suis actuellement des problèmes avec affiche tous les événements pour une période de taxonomie spécifique.

En d'autres termes ... ainsi que chaque événement liste Je comprend tous les termes associés à l'événement de ma taxonomie personnalisée (catégories d'événements).

Alors, il délivre ici est que chaque terme de taxonomie (correctement) apparaît comme un lien, mais lorsque vous sélectionnez le terme les termes correspondants archivent la page ne commande pas les résultats correspondant à la date / heure d'événement champ personnalisé et ce n'est pas à l'exception des événements qui sont plus âgés que la date d'aujourd'hui.

Sur la base de cette page: http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

Je figure que l'on est capable 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:

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

Sooooooooo .... Comme mentionné la seule chose que je crois que je besoin d'une solution pour le code est correct d'insérer pour atteindre les deux problèmes mentionnés ci-dessus.

Voici le code que je me sers qui fonctionne dans l'affichage ma liste d'événements organisés correctement à la date de début de l'événement / heure tout en éliminant tous les événements de plus 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; ?>

S'il vous plaît garder à l'esprit que je ne demande pas comment changer la requête ci-dessus il affiche seulement les messages pour un terme ... Au contraire, je dois en quelque sorte d'obtenir la page des archives de reconnaître ce terme a été cliqué et passer essentiellement que par la requête avec le je commande / filtrage ci-dessus en train de faire.

Je suis en supposant que cela est probablement une réponse simple qui implique la « boucle » que je n'ai pas encore à maîtriser.

MISE À JOUR

Voici le code de la page d'archive qui doit être modifié de manière lorsqu'un terme est cliqué dans la liste des résultats ci-dessus il ne montre que les mêmes résultats, mais seulement pour la durée sélectionnés et triés par date / heure et l'élimination de tout événement antérieure à la date d'aujourd'hui.

<?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 à l'avance,

Chris

Était-ce utile?

La solution

La façon la plus efficace est probablement crochet dans l'action pre_get_posts et ajoutez votre comparaison de temps. De cette façon, vous n'avez pas à vous soucier du reste ou les options de requête comme ils continuent de fonctionner. Il devrait ressembler à ceci (non testé), et être placé dans un fichier de fonctions plug-in ou 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(). À l'heure actuelle, nous ne le faisons pas sur les pages d'administration (vous ne seriez pas en mesure d'accéder ancien contenu), et ne le faisons sur les pages de taxonomie spécifiques. Vous devez savoir pour vous-même la largeur ou la façon dont vous voulez réduire cela.

Si vous ne pouvez pas résoudre cette façon, vous pouvez faire la requête principale à nouveau sans perdre la « requête spécifique de la page » en ajoutant les différentes requêtes vars les principaux objets $wp_query et appeler $wp_query->get_posts() à nouveau. Étant donné que nous n'avons pas appelé $wp_query->parse_query(), les args de requête spécifiques à la page ne seront pas effacés. Il 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 placer dans vos fichiers de modèle (non functions.php, mais taxonomy-event_types.php ou d'autres fichiers de modèle « vrais »). Rappelez-vous que vous « jeter » une base de données appeler de cette façon, il est donc pas la solution la plus optimale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top