web-dev-qa-db-ja.com

2番目のカスタム投稿タイプアーカイブ

私はeventカスタム投稿タイプを持っています、そしてフィルターを使って、将来のイベントだけを、そしてメタ値(開始日)に基づいて年代順に表示するようにアーカイブページを設定しました。

私は過去のイベントを表示するために2つ目のアーカイブページを作成して、ページ区切りを付けて同じメタ値で年代順に逆順に並べたいと思います。

私の最初の考えは、通常のページ内でショートコードを使用することですが、ページ区切りを機能させる方法がわかりません。

あるいは、「一般的な」アーカイブページを作成する方法はありますか?書き換えルールに参加する必要がありますか?

1
Matt

これは私が一緒に行ったものです。過去のイベントの2番目のアーカイブを作成します。メインのイベントアーカイブに今後のイベント、および過去のイベントページに古いイベントが表示されます。ソートはメインのアーカイブでは昇順(次のイベントが最初に表示されます)、過去のイベントでは降順で表示されるため、最新のものが表示されます。最初にイベント。それは過去のイベントページのページングを可能にします。これは管理システムのクエリを変更しないことに注意してください。

new My_Events_Are_Special;
class My_Events_Are_Special {

    function __construct() {
        add_filter('rewrite_rules_array', array($this, 'insert_rewrite_rules'));
        add_filter('query_vars', array($this, 'insert_query_vars'));
        add_action('wp_loaded', array($this, 'flush_rules'));
        add_filter('posts_join', array($this, 'posts_join'));
        add_filter('posts_where', array($this, 'posts_where'));
        add_filter('posts_orderby', array($this, 'posts_orderby'));
    }

    function can_modify_query() {
        return !is_admin() && is_post_type_archive('event');
    }

    // create rules for the archived events page
    var $rewrite_rules = array(
        'events/archive$' => 'index.php?post_type=event&archive_type=archive',
        'events/archive/page/([0-9]+)$' => 'index.php?post_type=event&archive_type=archive&paged=$matches[1]',
    );

    // insert rules into rewrite system
    function insert_rewrite_rules($rules) {
        return $this->rewrite_rules + $rules;
    }

    // add special query var to system
    function insert_query_vars($vars) {
        array_Push($vars, 'archive_type');
        return $vars;
    }

    // flush rules if any are new
    function flush_rules() {
        $rules = get_option('rewrite_rules');
        $flush = false;

        foreach ($this->rewrite_rules as $rule => $rewrite) {
            if (!isset($rules[$rule])) {
                global $wp_rewrite;
                $wp_rewrite->flush_rules();
                break;
            }
        }
    }

    // add start and end type to query for events (not in admin)
    function posts_join($join) {
        global $wpdb;
        if ($this->can_modify_query()) {
            $join .= " JOIN $wpdb->postmeta starts on ($wpdb->posts.ID = starts.post_id AND starts.meta_key = '_starts') ";
            $join .= " JOIN $wpdb->postmeta ends on ($wpdb->posts.ID = ends.post_id AND ends.meta_key = '_ends') ";
        }
        return $join;
    }

    // only show future events for the main archive, only past events for the "archive archive"
    function posts_where($where) {
        global $wpdb;
        if ($this->can_modify_query()) {
            $compare = get_query_var('archive_type') == 'archive' ? '<' : '>';
            $where .= " AND ends.meta_value $compare ".time();
        }
        return $where;
    }

    // main archive is ordered ascending on event start date, "archive archive" is ordered descending
    function posts_orderby($orderby) {
        global $wpdb;
        if ($this->can_modify_query()) {
            $order = get_query_var('archive_type') == 'archive' ? 'DESC' : 'ASC';
            $orderby = "starts.meta_value $order, $wpdb->posts.post_date $order";
        }
        return $orderby;
    }
}
1
Matt

クエリを移動するには、?time=futureのようなクエリパラメータを使用します。将来の投稿クエリと過去の投稿クエリの違いはorderbymeta_queryだけであるはずなので、URLパラメータに基づいて変更するのは比較的簡単なはずです。また、オーバーヘッドを1ページに抑えることでオーバーヘッドを削減できるという利点もあります。あなたがカスタムリンクを使用しなければならないので、これに関する私の唯一の関心事はメニューの中でリンクすることでしょう、そしてそれらはそれほど柔軟ではありません。

1
mor7ifer