测试类别是否包含特定的自定义发布类型

时间:2014-01-17 作者:Sparky

我有几个自定义的帖子类型和几个类别。在我的pre_get_posts 挂钩(英寸functions.php), 我正在更改非常特定的自定义帖子类型归档页面的时间顺序。

function get_custom_posts( $query ) {
    if ( ! is_admin() && $query->is_main_query() && empty($query->query_vars[\'suppress_filters\']) ) { 
        if ( ($query->get(\'order\') == \'\') && (in_array($query->get(\'post_type\'), array( \'books\', \'foo\' ))) ) {
            $query->set(\'order\',\'ASC\');  // ascending order
        }
        if ( is_home() ) {
            return $query->set( \'post_type\', array( \'post\', \'books\', \'foo\', \'bar\' ) );
        } else if ( is_search() ) {
            return $query->set( \'post_type\', array( \'post\', \'page\', \'books\', \'foo\', \'bar\' ) );
        } else if ( is_category() ) {
            return $query->set( \'post_type\', array( \'post\', \'books\', \'foo\', \'bar\' ) );
        }   
    } 
}       
add_action( \'pre_get_posts\', \'get_custom_posts\' );
我正在发展一个儿童主题,主题是“二十一三”。

对于类别存档,正确使用父模板,category.php.

对于自定义帖子类型存档,它在子主题中正确使用自定义模板,archive-books.php, archive-foo.php, 等

Questions/Issues:

1) 我的代码用于自定义帖子类型存档页。。。它们按我想要的升序加载。然而,我还需要在类别归档页面上按时间升序排列,但是only if 它们包含我指定的自定义帖子类型中的一篇或多篇帖子。我该怎么做?我只想在我的代码中调用自定义帖子类型。。。我不想指出具体的类别,因为这些类别可能偶尔会发生变化,这些类别档案可能包含来自多种帖子类型的帖子。

2) 当我颠倒时间顺序时,就像在上面的代码中一样,默认分页的标签不正确。i、 例如,最旧的帖子位于第一页的顶部,当我滚动到底部时,链接会被标记"Older posts" 但是这个链接真的会把你带到更新的帖子。当年表被更改时,我希望分页会自动跟随;我的代码中是否遗漏了一些简单的内容?

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

1) “类别存档页需要按时间升序排列,但前提是它们包含我指定的自定义帖子类型中的一篇或多篇帖子”

我认为这是不可能的;至少不实用。然而,自从发布这个问题以来,我已经为我的自定义帖子类型设置了自定义分类法,这就不需要这样做了。自定义帖子类型归档页面已经按照我想要的方式进行了排序,因此由于类别不再包含自定义帖子类型,它们的排序可以通过一个简单的类别排序插件来处理。

默认分页标记不正确。即,最旧的帖子位于第一页的顶部,当我滚动到底部时,链接标记为“旧帖子”,但此链接确实会将您带到新帖子

这是由主题处理的,在国际海事组织看来相当愚蠢。参见下面的注释*

2013年使用twentythirteen_paging_nav() 功能(包含在functions.php) 要设置这些分页链接。。。

function twentythirteen_paging_nav() {
    global $wp_query;

    // Don\'t print empty markup if there\'s only one page.
    if ( $wp_query->max_num_pages < 2 )
        return;
    ?>
    <nav class="navigation paging-navigation" role="navigation">
        <h1 class="screen-reader-text"><?php _e( \'Posts navigation\', \'twentythirteen\' ); ?></h1>
        <div class="nav-links">

            <?php if ( get_next_posts_link() ) : ?>
            <div class="nav-previous"><?php next_posts_link( __( \'<span class="meta-nav">&larr;</span> Older posts\', \'twentythirteen\' ) ); ?></div>
            <?php endif; ?>

            <?php if ( get_previous_posts_link() ) : ?>
            <div class="nav-next"><?php previous_posts_link( __( \'Newer posts <span class="meta-nav">&rarr;</span>\', \'twentythirteen\' ) ); ?></div>
            <?php endif; ?>

        </div><!-- .nav-links -->
    </nav><!-- .navigation -->
    <?php
}
仔细查看上面的代码,忽略“旧/新”标签。在“next”链接的条件逻辑中,您有next_posts_link() 函数包装在标记为nav-previous. 反之亦然,对于其他链接。。。这个previous_posts_link() 函数包装在内部nav-next. 就像我之前说的。。。高飞。

我的解决方法很简单。我将整个函数复制到我的子主题functions.php 文件因为原稿是包在里面的if ( ! function_exists( \'twentythirteen_paging_nav\' ) ), 子主题中的副本将优先。然后我重新安排了函数,以便next_posts_link() 显示在.nav-next div 并重新标记为"Next page", 并且对previous_posts_link() 作用

function twentythirteen_paging_nav() {
    global $wp_query;

    // Don\'t print empty markup if there\'s only one page.
    if ( $wp_query->max_num_pages < 2 )
        return;
    ?>
    <nav class="navigation paging-navigation" role="navigation">
        <h1 class="screen-reader-text"><?php _e( \'Posts navigation\', \'twentythirteen\' ); ?></h1>
        <div class="nav-links">

            <?php if ( get_next_posts_link() ) : ?>
                  <div class="nav-next">
                     <?php next_posts_link( __( \'Next page <span class="meta-nav">&rarr;</span>\', \'twentythirteen\' ) ); ?>
                 </div>
            <?php endif; ?>

            <?php if ( get_previous_posts_link() ) : ?>
                <div class="nav-previous">
                    <?php previous_posts_link( __( \'<span class="meta-nav">&larr;</span> Previous page\', \'twentythirteen\' ) ); ?>
                </div>
            <?php endif; ?>

        </div><!-- .nav-links -->
    </nav><!-- .navigation -->
    <?php
}
最后一步是调整CSS,因为第二十三条使得左下角的“上一条”链接(正式称为“旧帖”)比其他链接大60%。我想他们的想法是把“下一页”的按钮放大。由于位置和标签是翻转的,因此必须调整CSS大小。

<小时>*Notes: 在最新帖子位于顶部的情况下,“下一页”将是“较旧”的帖子。在这个主题中,指向“下一页”的链接被标记为“旧帖子”,它指向左边,表示“后退”。我称之为“傻瓜”,因为当帖子以任何其他方式排序时,它会完全崩溃。当最旧的帖子位于顶部、按字母顺序排序等时,“旧”标签将变得毫无意义。因为从技术上讲,它会进入结果查询的下一页,所以它应该被标记为“下一页”,实际上是next_posts_link() 函数是如何创建的。然而,简单地将其重新标记为“下一个”是不够的,因为它位于左下角,并向后指向左侧。用适当的CSS包装它class nav-next 如我在上面的回答中所述修复此问题。

SO网友:Borek

除非正确设置“paged”查询变量,否则分页将无法正常工作:adding the paged parameter

结束

相关推荐

custom sortable column

我正在尝试在我的时间线自定义帖子中为年份创建一个额外的列。我可以创建额外的列,实际上我可以对它进行排序,它工作正常,但我的所有页面似乎都不工作。这是我用来创建列并使其可排序的所有代码:// Register the column add_filter( \'manage_edit-maryg_timeline_columns\', \'set_custom_edit_date_columns\' ); add_action( \'manage_maryg_timeline_posts_cu