Single-Custom.php上的WP_Query分页

时间:2014-05-08 作者:Shane

我想做什么:

设置WP_Query 在单个自定义帖子类型中分页。php模板文件

我所做的工作创建了一个名为“作者”的帖子类型。该帖子类型中的每个帖子都是一个作者。

2) 标准的编辑帖子屏幕页面包含一个下拉列表,其中列出了作者自定义帖子类型中的所有帖子(作者)。

3) 创建了单个作者。php模板,该模板使用下拉列表中的作者元数据查询所有帖子,因此结果是一个具有相同作者的帖子列表(有点像存档):

<?php

// set the "paged" parameter (use \'page\' if the query is on a static front page)
global $paged;

/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( \'paged\' ) ) {
    $paged = get_query_var(\'paged\');
} elseif ( get_query_var( \'page\' ) ) {
    $paged = get_query_var( \'page\' );
} else {
    $paged = 1;
}

$args = array(
    \'posts_per_page\'    =>  10,
    \'meta_key\'          => \'author_select\',
    \'meta_value\'        => $author_id,
    \'paged\'             => $paged,
);

$temp = $wp_query;
$wp_query = NULL;

$wp_query = new WP_Query($args);

?>

<?php if( $wp_query->have_posts() ) : ?>    
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php // Successfully outputs the results of the above query, so I\'ve omitted the code from this example. ?>

    <?php endwhile; ?>

<div class="single_navigation"> 
    <?php if( get_adjacent_post( false, \'\', true ) ) { ?>
        <span class="prev"><?php previous_post_link( \'&lt; %link\' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, \'\', false ) ) { ?>
        <span class="next"><?php next_post_link( \'%link &gt;\' ) ?></span>
    <?php } ?>
    </div><!--/single navigation-->
<?php endif; ?>

<?php
    $wp_query = null;
    $wp_query = $temp;
    wp_reset_query();
?>
“我被卡住了”页面链接不会出现。我做了一些研究,发现他们使用$wp_query 变量,但是当我将查询变量更改为$wp_query, 链接出现了,但单击时什么也没做。

知道我哪里出错了吗?

编辑:

为了回答您的一些问题,我的查询成功地输出了我正在查询的帖子,$author\\u id已经有一个值,我没有包含在此代码段中。类似地,我省略了while循环中的实际内容输出,因为这部分不是问题所在。问题是我需要对这篇文章中已经存在的内容进行分页。

此功能的目的是允许帖子拥有自定义作者(在内置用户系统之外),此模板的目的是输出给定作者的所有帖子(已在使用)。

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

你有两个问题。

第一个问题是线路

$paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
将失败,因为在单数post视图中,当URL包含\'/page/XX/\', 变量WordPress集合为\'page\' 而不是\'paged\'.

您可以考虑使用\'page\' 而不是\'paged\', 但这也行不通,因为一旦\'page\' 变量用于多页单数post(使用<!--nextpage-->) 一旦文章不是多页的,WordPress会将请求重定向到URL,而不需要\'/page/XX/\'.

这就是命名查询变量时发生的情况$wp_query.

解决方案是通过删除负责重定向的函数来防止重定向,这是\'redirect_canonical\' 连接到\'template_redirect\':

所以,在你的functions.php 添加:

add_action( \'template_redirect\', function() {
    if ( is_singular( \'authors\' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( \'page\' );
        if ( $page > 1 ) {
            // convert \'page\' to \'paged\'
            $wp_query->set( \'page\', 1 );
            $wp_query->set( \'paged\', $page );
        }
        // prevent redirect
        remove_action( \'template_redirect\', \'redirect_canonical\' );
    }
}, 0 ); // on priority 0 to remove \'redirect_canonical\' added with priority 10
现在WordPress将不再重定向,并将正确设置\'paged\' 查询变量。

第二个问题

next_posts_link()previous_posts_link() 两个检查if ( ! is_single() ) 显示分页。

现在is_single() 在您的情况下是这样的,因为您在一篇“作者”类型的文章中,所以这些函数不能像您期望的那样工作。

您有3种可能性:

使用query_posts 覆盖主查询(真的not 建议)使用custom page template 而不是自定义帖子类型,因为is_single() 对于页面为false,您的代码将在那里工作

function my_pagination_link( $label = NULL, $dir = \'next\', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) {
        $query = $GLOBALS[\'wp_query\'];
    }
    $max_page = ( int ) $query->max_num_pages;
    // only one page for the query, do nothing
    if ( $max_page <= 1 ) {
        return;
    }
    $paged = ( int ) $query->get( \'paged\' );
    if ( empty( $paged ) ) {
        $paged = 1;
    }
    $target_page = $dir === \'next\' ?  $paged + 1 : $paged - 1;
    // if 1st page requiring previous or last page requiring next, do nothing
    if ( $target_page < 1 || $target_page > $max_page ) {
        return;
    }
    if ( null === $label ) {
        $label = __( \'Next Page &raquo;\' );
    }

    $label = preg_replace( \'/&([^#])(?![a-z]{1,8};)/i\', \'&#038;$1\', $label );
    printf( \'<a href="%s">%s</a>\', get_pagenum_link( $target_page ), esc_html( $label ) );
}
single-authors.php:

my_pagination_link( \'Older Entries\', \'next\', $author_query );
my_pagination_link( \'Newer Entries\', \'prev\', $author_query );

SO网友:Stephen S.

基于另一个类似的WPSE问题”Pagination is not working wp_query custom fields values“,我建议添加global $paged; 到模板文件的开头:

global $paged;
$paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;

SO网友:38365

gmazzap provides a detailed answer, 但我发现我的实现不需要几个部分,这与您的实现非常相似。重要的部分是重新排列我的模板并使用页面模板,而不是自定义帖子类型。

在我的查询参数中,我执行了以下操作:

$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;

$get_posts_args = array(
        \'numberposts\' => -1,
        \'posts_per_page\' => 5,
        \'paged\' => $paged,
        \'page\' => $paged,
        \'post_type\' => array(\'dvposts\',\'post\'),
        \'post_status\' => \'publish\',);
通过$paged 给双方pagedpage 键允许链接指向正确的url,并允许结果在页面中实际移动。

然后,在初始化查询后的任何地方,都可以使用paginate_links 至少具有以下参数:

$big = 999999999; // need an unlikely integer
echo paginate_links( array(
    \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
    \'format\' => \'?paged=%#%\',
    \'current\' => max( 1, get_query_var(\'paged\') ),
    \'total\' => $qwer->max_num_pages,
) );
该示例实际上位于WP codex页面的底部。

我想显示页码,但如果不想显示,可以使用previous_post_linknest_post_link 都一样。

我不能说我完全理解这一点,但似乎与\'current\' => max( 1, get_query_var(\'paged\') ). 这可能与$paged 之前已初始化。我把它改成\'current\' => max( 1, $paged ), 正如预期的那样,它也起到了同样的作用。

结束

相关推荐

Show full posts in archive

我有一个问题,我需要在我的归档页面中显示完整的帖子。E、 G.我有>两篇帖子,我想在归档页面中完整显示每一篇帖子。谢谢我该如何处理胡曼主题呢?这是档案的内容。php主题:<?php get_header(); ?> <section class=\"content\"> <?php get_template_part(\'inc/page-title\'); ?> <?php if(function