web-dev-qa-db-fra.com

Afficher uniquement les événements à venir

Dans l'encadré de cette page: http://lifebridgecypress.org/our-people , j'ai une liste des événements à venir utilisant ce code ...

<ul id="upcoming-events">
<?php
    $latestPosts = new WP_Query();
    $latestPosts->query('cat=3&showposts=10');
?>
<?php while ($latestPosts->have_posts()) : $latestPosts->the_post(); ?>
    <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>

Le seul problème est que ces événements ont déjà passé ... ha ha. Je voudrais configurer le code où il ne montre que les événements à venir dans le futur, puis 24 heures après l'événement, il disparaîtrait de la liste des événements à venir dans la barre latérale.

Est-ce que quelqu'un sait comment faire cela en modifiant ce code?

5
Spencer B.

Bonjour @ Spencer B. :

Drôle, mon client a soumis un ticket de bogue pour les modules d’événements que j’avais écrits pour ce même problème l’autre jour, et je l’ai corrigé il ya quelques heures.

Notez que mon exemple utilise un type de publication personnalisé de 'event', ce qui est très utile pour pouvoir différencier la logique d'événements distincts des publications. Si vous devez utiliser des messages normaux , vous devrez en quelque sorte identifier la logique requise pour que les pages qui répertorient des messages soient différentes de votre page qui répertorie des événements.

Vous devez utiliser le crochet 'posts_where' pour filtrer les événements dont la date est antérieure à 24 heures . La fonction de raccordement ci-dessous teste si la requête concerne post_type='event'; si tel est le cas, la requête est modifiée pour ajouter un critère à la clause SQL WHERE.

Lorsque vous enregistrez un WordPress , il vérifie s’il s’agit d’une date ultérieure et, si tel est le cas, définit le post_status='future' plutôt que le 'publish'; vous devez corriger cela . Vous pouvez utiliser le crochet 'wp_insert_post_data' pour réinitialiser à 'publish' si WordPress est défini sur 'future'.

Ce qui suit est une classe pour encapsuler cette logique, que vous pouvez copier dans le fichier functions.php de votre thème:

class Display_Future_Events {
  static function on_load() {
    add_filter('posts_where',array(__CLASS__,'posts_where'),10,2);
    add_action('wp_insert_post_data', array(__CLASS__,'wp_insert_post_data'),10,2);
    add_action('init', array(__CLASS__,'init'));
  }
  static function posts_where($where,$query) {
    if (self::is_event_list($query)) {
      global $wpdb;
      $yesterday = date('Y-m-d H:i:s',time()-(24*60*60));
      $where .= $wpdb->prepare(" AND post_date>'%s' ",$yesterday);
    }
    return $where;
  }
  static function is_event_list($query) { 
    // Logic here might need to be fine-tuned for your use-case
    if (is_string($query->query))
      parse_str($query->query,$args); 
    else
      $args = $query->query;
    return isset($args['post_type'])=='event';
  }
  static function wp_insert_post_data($data,$postarr) {
    if ($data['post_type']=='event' && // Will need more logic here for post_type='post'
      $postarr['post_status']=='publish' &&
      $data['post_status']=='future')
        $data['post_status'] = 'publish';

    return $data;
  }
  static function init() {
    register_post_type('event',
      array(
        'labels'          => self::make_labels('Event'),
        'public'          => true,
        'show_ui'         => true,
        'query_var'       => 'event',
        'rewrite'         => array('slug' => 'events'),
        'hierarchical'    => true,
        'supports'        => array('title','editor','custom-fields'),
        /*
         See more 'supports' options at
          http://codex.wordpress.org/Function_Reference/register_post_type
        */
      )
    );
  }
  static function make_labels($singular,$plural=false,$args=array()) {
    if ($plural===false)
      $plural = $singular . 's';
    elseif ($plural===true)
      $plural = $singular;
    $defaults = array(
      'name'               =>_x($plural,'post type general name'),
      'singular_name'      =>_x($singular,'post type singular name'),
      'add_new'            =>_x('Add New',$singular),
      'add_new_item'       =>__("Add New $singular"),
      'edit_item'          =>__("Edit $singular"),
      'new_item'           =>__("New $singular"),
      'view_item'          =>__("View $singular"),
      'search_items'       =>__("Search $plural"),
      'not_found'          =>__("No $plural Found"),
      'not_found_in_trash' =>__("No $plural Found in Trash"),
      'parent_item_colon'  =>'',
    );
    return wp_parse_args($args,$defaults);
  }
}
Display_Future_Events::on_load();
3
MikeSchinkel

Ce code ne montrera que vos derniers messages. Une solution consiste à annuler la publication des publications concernant les événements passés.

0
Anders