对于设置为首页的自定义帖子类型的归档,分页功能不正常

时间:2014-07-14 作者:Desi

大约一个小时前,我提出了一个类似的问题,但从那以后,我觉得我已经做了足够多的改变,以至于如果有人第一次看到它,那将是一个混乱的局面。因此,我提出了一个新问题,这个问题与我的问题更加明确和相关。

基本上,我有一个自定义的帖子类型podcasts 我通过创建一个名为archive-podcasts.php. 我已将此页面制作成自定义模板,并通过将其设置为首页Settings > Reading 在仪表板中。

然而,即使这样做了,归档页面也没有显示为首页,所以我做了一些研究,发现这个宝石可以放在我的functions.php 这最终让帖子的存档出现在头版。

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn\'t applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get(\'page_id\') == get_option(\'page_on_front\')):

        $wp_query->set(\'post_type\', \'podcasts\');
        $wp_query->set(\'page_id\', \'\'); //Empty

        //Set properties that describe the page to reflect that
        //we aren\'t really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;
}
棒极了,但还没完成。下面是我的archive-podcasts.php 页面如下所示:

<?php
/*
Template Name: Podcasts
*/
?>

        <?php get_header();?>

        <section id="content">
            <section id="latest-blogs">

            <?php
            $paged = (get_query_var(\'page\')) ? get_query_var(\'page\') : 1;
            $args = array( \'posts_per_page\' =>5, \'post_type\'=> \'podcasts\', \'paged\' => $paged );
            $postslist = new WP_Query( $args );

            if ( $postslist->have_posts() ) :
                while ( $postslist->have_posts() ) : $postslist->the_post(); ?>

                    <div class="article-wrapper">
                        <article id="post-<?php the_ID(); ?>">
                            <time datetime="<?php the_time(\'c\'); ?>"><?php the_time(\'F j, Y\'); ?></time>
                            <?php

                            $custom = get_post_custom($post->ID);
                            $buzzsprout_code = $custom["buzzsprout_code"][0];
                            echo do_shortcode($buzzsprout_code);

                            ?>
                            <p class="read-emails"><a href="<?php the_permalink() ?>" rel="bookmark" title="View emails and comment on this episode.">View emails and comment on this episode</a></p>
                        </article>
                    </div>

                <?php endwhile; ?>

                <div id="pagination">
                    <?php my_paginate_links(); ?>
                </div>

                <?php wp_reset_postdata(); ?>

            <?php endif; ?>

            </section>
        </section>

        <?php get_sidebar(); ?>

        <?php get_footer(); ?>
您会注意到我正在调用函数my_paginate_links(). 然而,调用此函数很麻烦,因为它无法正确分页帖子的存档。当我单击页码时,它会转到正确的页面,但current CSS类不匹配。

这是什么my_paginate_links() 看起来像:

function my_paginate_links() {
    global $wp_rewrite, $wp_query;
    $wp_query->query_vars[\'paged\'] > 1 ? $current = $wp_query->query_vars[\'paged\'] : $current = 1;
    $pagination = array(
        \'base\' => @add_query_arg(\'page\',\'%#%\'),
        \'format\' => \'\',
        \'total\' => $wp_query->max_num_pages,
        \'current\' => $current,
        \'prev_text\' => __(\'&laquo previous\'),
        \'next_text\' => __(\'next &raquo;\'),
        \'end_size\' => 1,
        \'mid_size\' => 2,
        \'show_all\' => true,
        \'type\' => \'list\'
    );
    if ( $wp_rewrite->using_permalinks() )
            $pagination[\'base\'] = user_trailingslashit( trailingslashit( remove_query_arg( \'s\', get_pagenum_link( 1 ) ) ) . \'page/%#%/\', \'paged\' );
    if ( !empty( $wp_query->query_vars[\'s\'] ) )
            $pagination[\'add_args\'] = array( \'s\' => get_query_var( \'s\' ) );
    echo paginate_links( $pagination );
}
有人能帮我找出分页不起作用的原因吗?还有,有没有更好或更有效的方法来实现这一切?

此外,我应该注意到,分页在我的常规帖子的主查询中工作得很好。他们只是不适用于这种自定义帖子类型的帖子存档。有没有办法让分页对这两个实例都起作用?

编辑:更新分页功能

function my_paginate_links() {
    global $wp_rewrite, $postslist;
    $postslist->query_vars[\'page\'] > 1 ? $current = $postslist->query_vars[\'page\'] : $current = 1;
    $pagination = array(
        \'base\' => @add_query_arg(\'page\',\'%#%\'),
        \'format\' => \'\',
        \'total\' => $postslist->max_num_pages,
        \'current\' => $current,
        \'prev_text\' => __(\'&laquo previous\'),
        \'next_text\' => __(\'next &raquo;\'),
        \'end_size\' => 1,
        \'mid_size\' => 2,
        \'show_all\' => true,
        \'type\' => \'list\'
    );
    if ( $wp_rewrite->using_permalinks() )
            $pagination[\'base\'] = user_trailingslashit( trailingslashit( remove_query_arg( \'s\', get_pagenum_link( 1 ) ) ) . \'page/%#%/\', \'paged\' );
    if ( !empty( $postslist->query_vars[\'s\'] ) )
            $pagination[\'add_args\'] = array( \'s\' => get_query_var( \'s\' ) );
    echo paginate_links( $pagination );
}

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

在我的电话和工作之间,出现了一些错误,对此表示抱歉。这是我修改后的答案。希望这有助于解决您的问题。

PROBLEM 1

您不应该将模板命名为“archive-{$post\\u type}”。php“如果它是一个页面模板。这完全违背了template hierarchy 这就是为什么static frontpage 不起作用。来自法典

A static page: WordPress使用静态页面模板层次结构:自定义页面模板,页面-{id}。php,第-{slug}页。php,第页。php,索引。php

SOLUTION TO PROBLEM 1

你应该考虑像头版这样的名字。php,它是frontpage模板或类似页面播客的适当名称。属于页面模板层次结构的php。存档-{$post\\u type}。php专门用于自定义帖子类型的归档页面。考虑看看Theme Developments

您可以删除pre_get_posts 如果更改模板名称,则不再需要此功能。

PROBLEM 2

使用时WP_Query 要创建自定义查询,并且需要分页,需要使用中的分页参数WP_Query. 此参数与静态首页不同。哪里paged 通常使用,头版使用page

page (int)-静态首页的页数。显示通常只显示在静态首页的第X页上的帖子。

SOLUTION TO PROBLEM 2

$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
应更改为

$paged = (get_query_var(\'page\')) ? get_query_var(\'page\') : 1;
传递给的数组中的这一行WP_Query 是正确的。无需更改此

\'paged\' => $paged

PROBLEM 3

您的分页功能也应该根据您的自定义查询进行相应的调整。我有两件事要做,你的max_num_pages 未为自定义查询设置参数,paged 应该是page 对于frontpage,您正在使用变量$wp_query. 自定义查询的变量集为$postslist, 因此,您应该根据变量调整分页函数。

SOLUTION TO PROBLEM 3

我遇到了这个ready-made function from @ewroman 它将自定义查询和常规主查询组合为一个分页函数,因此不需要仅为不同的分页查询创建两个函数。我已经用你的自定义贴子页面对此进行了测试,效果很好。您可以进一步修改此函数

if( ! function_exists( \'my_paginate_links\' ) ) {
    function my_paginate_links() {
        global $wp_query, $postslist;

        $big = 999999999; // This needs to be an unlikely integer
        if ( is_front_page()) {
            $myqueryis = $postslist;
            $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;
            } else {
            $myqueryis = $wp_query;
            $paged = get_query_var(\'paged\');
            }
        // For more options and info view the docs for paginate_links()
        // http://codex.wordpress.org/Function_Reference/paginate_links
        $paginate_links = paginate_links( array(
            \'base\' => str_replace( $big, \'%#%\', get_pagenum_link($big) ),
            \'current\' => max( 1, $paged ),
            \'total\' => $myqueryis->max_num_pages,
            \'mid_size\' => 5,
            \'prev_next\' => True,
            \'prev_text\' => __(\'&laquo previous\'),
            \'next_text\' => __(\'next &raquo;\'),
            \'type\' => \'list\'
        ) );

        // Display the pagination if more than one page is found
        if ( $paginate_links ) {
            echo \'<div class="pagination-centered">\';
            echo $paginate_links;
            echo \'</div><!--// end .pagination -->\';
        }
    }
}
从您的分页函数中我可以看到,您的current 参数似乎也是罪魁祸首

ALTERNATIVE SOLUTION TO PROBLEM 3

你也可以看看next_posts_linkprevious_posts_link. 请记住,对于自定义查询$max_pages 中的参数next_posts_link 应设置为分页才能正常工作。

next_posts_link( \'Older Entries\', $postslist->max_num_pages );

结束

相关推荐

Pagination on Custom Loop

我想将最新帖子的样式与自定义页面上某个类别中的所有其他帖子的样式不同。到目前为止,我有下面的代码,它正是这样做的:<?php if (have_posts()) : ?> <?php query_posts(\"cat=4&showposts=1\"); ?> <?php while (have_posts()) : the_post(); ?> (Style1)<?php the_title(); ?><