web-dev-qa-db-ja.com

今後のイベントのみ表示

このページのサイドバーに: http://lifebridgecypress.org/our-people 、私はこのコードを使用して今後のイベントのリストを持っている...

<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>

唯一の問題は、これらの出来事がすでに過ぎ去ったということです...ハハ。今後予定されているイベントのみを表示するようにコードを設定して、予定の24時間後にサイドバーのこの予定されているイベントリストから表示されなくなるようにします。

誰かがこのコードを修正することによってこれを行う方法を知っていますか?

5
Spencer B.

こんにちは@スペンサーB.

おかしい、私のクライアントは私が先日この問題のために私が書いたイベントモジュールのためのバグチケットを提出しました、そして私はちょうどそれを数時間前に修正しました。

この例では、カスタム投稿タイプ'event'を使用しています。これは、投稿とは異なるイベントのロジックを区別できるので非常に便利です。 通常の投稿を使用する必要がある場合は、投稿を表示するページと、イベントを表示するページとが異なるロジックを特定する必要があります。

24時間より前の日付のイベントを除外するには、'posts_where'フックを使用する必要があります。以下のフック関数は、クエリがpost_type='event'に対するものであるかどうかを確認するためにテストします。もしそうであれば、それはSQL WHERE節に基準を追加するために問い合わせを修正します。

WordPressを保存するとそれが未来の日付かどうかチェックし、そうであればpost_status='future'ではなく'publish'を設定します。それを修正する必要があります。 WordPressが'wp_insert_post_data'に設定されている場合は、'publish'フックを使用して'future'にリセットできます。

以下はこのロジックをカプセル化するためのクラスです。これをテーマのfunctions.phpファイルにコピーできます。

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

このコードは最新の投稿のみを表示します。 1つの解決策は、過去の出来事に関する投稿を非公開にすることです。

0
Anders