it-swarm.com.de

Nur anstehende Ereignisse anzeigen

In der Seitenleiste dieser Seite: http://lifebridgecypress.org/our-people habe ich eine Liste der bevorstehenden Ereignisse mit diesem 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>

Das einzige Problem ist, dass diese Ereignisse bereits vorbei sind ... ha ha. Ich möchte den Code so konfigurieren, dass in Zukunft nur noch bevorstehende Ereignisse angezeigt werden und er 24 Stunden nach dem Ereignis aus der Liste der bevorstehenden Ereignisse in der Seitenleiste verschwindet.

Weiß jemand, wie man dies durch Ändern dieses Codes macht?

5
Spencer B.

Hallo @ Spencer B. :

Witzigerweise hat mein Kunde ein Fehlerticket für die Ereignismodule eingereicht, die ich kürzlich für diese Ausgabe geschrieben habe, und ich habe es erst vor ein paar Stunden behoben.

Beachten Sie, dass in meinem Beispiel ein benutzerdefinierter Beitragstyp von 'event' verwendet wird. Dies ist sehr nützlich, um die Logik für Ereignisse von Beiträgen unterscheiden zu können. Wenn Sie normale Posts verwenden müssen , müssen Sie irgendwie die erforderliche Logik identifizieren, die die Seiten, auf denen Posts aufgelistet sind, von Ihrer Seite unterscheidet, auf der Events aufgelistet sind.

Sie müssen den Haken 'posts_where' verwenden , um die Ereignisse herauszufiltern, deren Datum vor 24 Stunden liegt . Die folgende Hook-Funktion prüft, ob die Abfrage für post_type='event' ist. In diesem Fall wird die Abfrage geändert, um der SQL-Klausel WHERE ein Kriterium hinzuzufügen.

Wenn Sie ein WordPress-Dokument speichern , wird geprüft, ob es sich um ein zukünftiges Datum handelt. Wenn dies der Fall ist, wird der post_status='future' und nicht der 'publish' festgelegt. Sie müssen das korrigieren . Sie können den Haken 'wp_insert_post_data' verwenden, um auf 'publish' zurückzusetzen, wenn WordPress auf 'future' gesetzt hat.

Was folgt, ist eine Klasse, um diese Logik zu kapseln, die Sie in die functions.php-Datei Ihres Themas kopieren können:

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

Dieser Code zeigt nur Ihre letzten Beiträge an. Eine Lösung besteht darin, die Veröffentlichung von Beiträgen zu Ereignissen aufzuheben, die bereits vergangen sind.

0
Anders