第二个定制邮寄类型档案

时间:2012-03-03 作者:Matt

我有一个event 自定义帖子类型,并使用过滤器,我已将归档页面配置为仅显示将来的事件,并根据元值(开始日期)按时间顺序显示。

我想制作第二个归档页面来显示过去的事件,并完成分页,按相同的元值按逆时间顺序排列。

我的第一个想法是在普通页面中使用短代码,但我不确定如何使分页工作。

或者,是否有方法创建“通用”归档页?我需要进入重写规则吗?

3 个回复
最合适的回答,由SO网友:Matt 整理而成

这就是我要的。它为过去的事件创建第二个存档。它在主事件存档中显示即将发生的事件,在过去的事件页面中显示旧事件。对于主归档文件,排序是升序的(因此您可以首先看到下一个即将发生的事件),对于过去的事件,排序是降序的,因此您可以首先看到最近的事件。它允许在过去事件页面上分页。请注意,is不会修改管理系统中的查询。

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

SO网友:Techlands

我遇到了同样的问题,需要两个归档页面来定制帖子类型。我能够使用四个WP挂钩相当干净地完成这项工作

例如,我的自定义帖子类型是“member”。我需要为自定义meta\\u键“plus”设置为true的成员提供第二个存档url。

First we need to define the URL for the second archive url. Notice passing the "plus_member" var in the query string.

add_filter(\'rewrite_rules_array\', function($rules) {
    return array_merge(array(
        \'plus-members/?$\' => \'index.php?post_type=member&archive_type=archive&plus_member=1\',
        \'plus-members/page/([0-9]{1,})/?$\' => \'index.php?post_type=member&archive_type=archive&plus_member=1&paged=$matches[1]\',
    ), $rules);
});

Next we need to allow the "plus_member" we are passing along

add_filter(\'query_vars\', function($vars) {
    $vars[] = \'plus_member\';
    return $vars;
});

Next we need to tell WP to use a different template file for this request instead of the default "archive-member.php"

add_filter(\'template_include\', function($template) {
    global $wp_query;
    if ($wp_query->get(\'post_type\') == \'member\' && $wp_query->get(\'plus_member\')) {
        $template = locate_template(\'archive-plus-member.php\');
    }

    return $template;
});
Finally we need to alter the main query so we are not showing all members but only plus members.

add_filter(\'pre_get_posts\', function($query) {
    if ($query->is_main_query() && $query->is_archive() && $query->get(\'post_type\') == \'business\') {
        if ($query->get(\'plus_member\')) {
            $query->set(\'meta_key\', \'plus\');
            $query->set(\'meta_value\', true);
        }
    }

    return $query;
});

This should produce the result:

/成员/(加载)存档成员。php(显示)所有成员

/plus成员/(加载)存档plus成员。php(显示)所有成员,其中meta\\u key plus==true

SO网友:mor7ifer

我会使用一个查询参数,比如?time=future 也许,改变你的疑问。未来帖子查询和过去帖子查询之间的区别应该是orderby 以及meta_query, 因此,基于URL参数更改它应该相对容易。您还可以通过将其保持在一个页面来减少开销。我唯一关心的是菜单中的链接,因为您必须使用自定义链接,而这些链接不太灵活。

结束

相关推荐

显示Archives.php中的所有自定义帖子类型

我该怎么做?archive.php 只有以下内容:wp_get_archives(\'type=monthly\'); 以及wp_get_archives() 没有显示所有帖子类型的参数。我也认为archive-[post_type].php 不是我要找的,因为我希望所有帖子类型都显示在一个归档页面中。谢谢W

第二个定制邮寄类型档案 - 小码农CODE - 行之有效找到问题解决它

第二个定制邮寄类型档案

时间:2012-03-03 作者:Matt

我有一个event 自定义帖子类型,并使用过滤器,我已将归档页面配置为仅显示将来的事件,并根据元值(开始日期)按时间顺序显示。

我想制作第二个归档页面来显示过去的事件,并完成分页,按相同的元值按逆时间顺序排列。

我的第一个想法是在普通页面中使用短代码,但我不确定如何使分页工作。

或者,是否有方法创建“通用”归档页?我需要进入重写规则吗?

3 个回复
最合适的回答,由SO网友:Matt 整理而成

这就是我要的。它为过去的事件创建第二个存档。它在主事件存档中显示即将发生的事件,在过去的事件页面中显示旧事件。对于主归档文件,排序是升序的(因此您可以首先看到下一个即将发生的事件),对于过去的事件,排序是降序的,因此您可以首先看到最近的事件。它允许在过去事件页面上分页。请注意,is不会修改管理系统中的查询。

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

SO网友:Techlands

我遇到了同样的问题,需要两个归档页面来定制帖子类型。我能够使用四个WP挂钩相当干净地完成这项工作

例如,我的自定义帖子类型是“member”。我需要为自定义meta\\u键“plus”设置为true的成员提供第二个存档url。

First we need to define the URL for the second archive url. Notice passing the "plus_member" var in the query string.

add_filter(\'rewrite_rules_array\', function($rules) {
    return array_merge(array(
        \'plus-members/?$\' => \'index.php?post_type=member&archive_type=archive&plus_member=1\',
        \'plus-members/page/([0-9]{1,})/?$\' => \'index.php?post_type=member&archive_type=archive&plus_member=1&paged=$matches[1]\',
    ), $rules);
});

Next we need to allow the "plus_member" we are passing along

add_filter(\'query_vars\', function($vars) {
    $vars[] = \'plus_member\';
    return $vars;
});

Next we need to tell WP to use a different template file for this request instead of the default "archive-member.php"

add_filter(\'template_include\', function($template) {
    global $wp_query;
    if ($wp_query->get(\'post_type\') == \'member\' && $wp_query->get(\'plus_member\')) {
        $template = locate_template(\'archive-plus-member.php\');
    }

    return $template;
});
Finally we need to alter the main query so we are not showing all members but only plus members.

add_filter(\'pre_get_posts\', function($query) {
    if ($query->is_main_query() && $query->is_archive() && $query->get(\'post_type\') == \'business\') {
        if ($query->get(\'plus_member\')) {
            $query->set(\'meta_key\', \'plus\');
            $query->set(\'meta_value\', true);
        }
    }

    return $query;
});

This should produce the result:

/成员/(加载)存档成员。php(显示)所有成员

/plus成员/(加载)存档plus成员。php(显示)所有成员,其中meta\\u key plus==true

SO网友:mor7ifer

我会使用一个查询参数,比如?time=future 也许,改变你的疑问。未来帖子查询和过去帖子查询之间的区别应该是orderby 以及meta_query, 因此,基于URL参数更改它应该相对容易。您还可以通过将其保持在一个页面来减少开销。我唯一关心的是菜单中的链接,因为您必须使用自定义链接,而这些链接不太灵活。

相关推荐

Display an archives name

我想显示当前存档文件的名称,因此对于下面的url,我可以这样做<h1><?php echo \"answer\" ?></h1> 输出如下内容<h1>News</h1> 或者更好<h1>News: supplierName</h1> http://www.site.com/suppliers/news/?supplierstax=supplierName