“分页”(但不是真正的)和使用定制帖子类型的查询

时间:2014-06-30 作者:slashbob

这里更多的是一个概念问题,而不是一个严格的代码问题:

为一位想要列出即将举行和过去的音乐会的音乐家创建一个网站。这些是使用自定义字段作为显示日期(格式为yyyymmdd)的自定义帖子类型。对于查询和排序,显示日期是关键的数据位,而不是帖子的发布日期,后者有点不相关。

以下页面显示了今年的未来和过去演出:http://dev.bobpassaro.com/david/concerts/

生成此查询的查询(实际上是两个查询和循环):

<?php 
    //Query $args for upcoming concerts, ordered soonest to furthest in future
    $upcoming_args = array(
        \'post_type\' => \'concert\',
        \'meta_key\' => \'date\',
        \'orderby\' => \'meta_value_num\',
        \'order\' => \'ASC\',
        \'posts_per_page\' => -1,
        \'meta_query\' => array(
            array(
                \'key\' => \'date\',
                \'value\' => date(\'Ymd\'),
                \'compare\' => \'>=\',
            ),
        )
    );

    //Query $args for past concerts, ordered most recent to oldest
    $past_args = array(
        \'post_type\' => \'concert\',
        \'meta_key\' => \'date\',
        \'orderby\' => \'meta_value_num\',
        \'order\' => \'DESC\',
        \'posts_per_page\' => -1,
        \'meta_query\' => array(
            array(
                \'key\' => \'date\',
                \'value\' => array(date(\'Y\') . \'0101\',date(\'Ymd\')),
                \'compare\' => \'BETWEEN\',
            ),
        )
    );
?>
你还会看到(在那一页的底部)我有点“分页”旧音乐会,按年份分组。(使用自定义帖子类型进行常规WP分页很痛苦,但无论如何,这不是我想要的。我不想要音乐会数量相等的页面,我想要音乐会按年份分组的页面。)因此,我所做的是使用类似的查询创建另一个模板:

<?php 
    //Query $args for past concerts, grouped by year
    $concert_year = substr($post->post_name,0,4);
    $year_args = array(
        \'post_type\' => \'concert\',
        \'meta_key\' => \'date\',
        \'orderby\' => \'meta_value_num\',
        \'order\' => \'DESC\',
        \'posts_per_page\' => -1,
        \'meta_query\' => array(
            array(
                \'key\' => \'date\',
                \'value\' => array($concert_year . \'0101\', $concert_year . \'1231\'),
                \'compare\' => \'BETWEEN\',
            ),
        )
    );
?>
这在我为每年设置的页面分配的自定义模板中使用。(这些页面的内容实际上是空的,但页面slug用于设置上面的$concert\\u year变量,然后允许查询提取正确的音乐会集。)然后,我在这些页面的底部使用一个常规的可湿性粉剂菜单,其中包括所有这些页面,并允许人们回顾前几年的演出。

这一切都是我想要的,但这是一个相当笨拙的解决方案。我的意思是,到2015年时,我必须为2014年翻开新的一页,否则2014年的演唱会将不会在任何地方出现。我希望这是动态发生的。我还有所有这些基本上是空白/空白的页面(过去每年一个),它们唯一的功能是调用模板并在WP菜单中使用(也就是说,它们唯一的功能是允许用户选择与每年关联的url,并设置$concert\\u year以便在查询中使用。)

如何更好地解决这个问题?

2 个回复
SO网友:s1lv3r

这是一个棘手的问题,因为有太多可能的解决方案

我认为最简单的方法是创建一个自定义分类法“year”,并使用save_post() 挂钩和wp_set_object_terms().

然后您可以简单地使用get_terms() 要获取年份列表(默认情况下,您只能获取有音乐会的年份),只需使用链接到术语存档get_term_link(). 您仍然可以使用默认的CPT存档来显示当年的音乐会。

SO网友:Milo

您可以添加自定义查询变量并重写规则来处理年份存档:

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

function wpd_concert_rewrite(){
    add_rewrite_rule(
        \'concerts/([0-9]+)/?$\',
        \'index.php?pagename=concerts&concert_year=$matches[1]\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_concert_rewrite\' );
然后,在您的音乐会模板中,您可以检查是否需要一年:

get_query_var( \'concert_year\' );
并查询当年的事件。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post