web-dev-qa-db-fra.com

passer l'argument à get_template_part () ou un meilleur moyen de coder

J'ai ceci inclus… event-list.php

<?php
/**
 * The loop that displays upcoming events
 */
?>

<ul class="event-items">
<?php

    $yesterday = time() - 24*60*60;
    $args = array( 
        'post_type' => 'wr_event', 
        'posts_per_page' => -1, // show all posts 
        'meta_key' => 'event_date', 
        'orderby' => 'meta_value_num', 
        'order' => 'ASC',
        'meta_value' => $yesterday,
        'meta_compare' => '>'           
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
        get_template_part( 'inc/event', 'item' );
    endwhile;
    wp_reset_postdata();
?>
</ul>

Comme vous pouvez le constater, il s’agit d’une requête personnalisée qui compare une méta_key à la date du jour et ne récupère que les publications "plus récentes" que la veille.

cependant, dans mes archives, je veux le faire à l'inverse.

Sur mon index.php j'ai ceci

<?php get_template_part( 'inc/event', 'list' ); ?>

Donc, ce modèle ci-dessus est en cours d'exécution et récupère uniquement les événements plus récents que les dernières 24 heures.

Dans mon archives.php, j'aimerais inverser la valeur meta_compare de ">" à "<" afin que je reçoive le reste des messages.

Y a-t-il un moyen intelligent de faire cela?

Donc, dans mes archives.php, j'ai aussi ceci…

<?php get_template_part( 'inc/event', 'list' ); ?>

Puis-je en quelque sorte passer la valeur 'meta_compare' à ce modèle? Je peux donc utiliser et utiliser le même fichier de modèle dans mon index.php et dans mon fichier archives.php, mais avec des valeurs 'meta_compare' différentes.

Des idées à ce sujet?

3
mathiregister

Pourquoi n'utilisez-vous pas une fonction simple avec un argument pour obtenir cela, le code ressemble à ceci:

function wpse63585_event_list( $fresh = true )
{
    echo '<ul class="event-items">';

    $yesterday = time() - 24*60*60;
    $compare = $fresh ? '>' : '<';

    $args = array(
        'post_type' => 'wr_event',
        'posts_per_page' => -1, // show all posts
        'meta_key' => 'event_date',
        'orderby' => 'meta_value_num',
        'order' => 'ASC',
        'meta_value' => $yesterday,
        'meta_compare' => $compare,
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
        get_template_part( 'inc/event', 'item' );
    endwhile;
    wp_reset_postdata();
    echo '</ul>';
}

Et dans votre index.php, appelez simplement:

<?php wpse63585_event_list(); ?>

et dans archives.php:

<?php wpse63585_event_list( false ); ?>

Une autre solution Je peux penser est que vous pouvez enregistrer une variable globale, telle que $wpse63585_fresh = true, et utiliser cette variable dans votre partie de modèle event-list.php pour contrôler la condition, comme ceci:

Dans index.php:

global $wpse63585_fresh;

$wpse63585_fresh = true;
get_template_part( 'inc/event', 'list' );

Dans archive.php:

global $wpse63585_fresh;

$wpse63585_fresh = false;
get_template_part( 'inc/event', 'list' );

Dans event-list.php:

<ul class="event-items">
<?php
    global $wpse63585_fresh;
    $compare = $wpse63585_fresh ? '>' : '<';

    $yesterday = time() - 24*60*60;
    $args = array( 
        'post_type' => 'wr_event', 
        'posts_per_page' => -1, // show all posts 
        'meta_key' => 'event_date', 
        'orderby' => 'meta_value_num', 
        'order' => 'ASC',
        'meta_value' => $yesterday,
        'meta_compare' => $compare           
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
        get_template_part( 'inc/event', 'item' );
    endwhile;
    wp_reset_postdata();
?>
</ul>
3
Anh Tran