我要执行的操作:

在单个custom-post-type.php模板文件中设置WP_Query分页

我已完成的操作

1)创建了一个称为“作者”的帖子类型。

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

3)创建了一个single-authors.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_id已经具有我未包含在其中的值代码段。同样,我在while循环中省略了实际的内容输出,因为那不是问题。问题是我需要对单个帖子中已经存在的内容进行分页。

此功能的目的是允许帖子具有自定义作者(内置的Users系统之外),并且模板的目的是输出给定作者(已经在工作)的所有帖子。

评论

格式正确的问题的支持者,尽管您没有描述为什么要这样做,但它是否与当前作者框相关联?

我真的同意@TomJNowell。 +1

无关,但没有必要回显the_title()

是否从下拉列表中填写了'meta_value'=> $ author_id?通过下拉列表选择每个作者时,前十条帖子显示正确吗?

您确定$ author_query-> have_posts()返回true,并且$ author_query实际上包含任何帖子吗?

#1 楼

您有2个问题。

第一个问题

该行

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


将失败,因为在单个帖子视图中,当URL包含'/page/XX/'时,WordPress设置的变量为'page'而不是'paged'

您可能会考虑使用'page'代替'paged',但这也不起作用,因为一旦将'page'变量用于用于多页单数帖子(使用<!--nextpage-->进行页面分离),并且帖子不是多页面时,WordPress会将请求重定向到不带'/page/XX/'的URL。

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

解决方案是通过删除负责该功能的函数来防止该重定向,该函数已与'redirect_canonical'挂钩:

因此,请在您的'template_redirect'中添加:

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将不再重定向,并将正确设置functions.php查询变量。

第二个问题

第4季312079q和'paged'都检查next_posts_link()以显示分页。

现在,previous_posts_link()是正确的,因为您处于“作者”类型的单个帖子中,因此这些功能无法按预期工作。

您有3种可能:


使用if ( ! is_single() )覆盖主查询(不建议使用)
使用自定义页面模板而不是自定义帖子类型,因为is_single()对于页面是假的,您的代码将在此处工作。
编写您自己的分页功能并使用该功能

这是解决方案编号3的代码:

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;', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), esc_html( $label ) );
}


,然后在query_posts中使用它:

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


评论


很详细的答案,谢谢!这适用于网站的英语一侧,但在法语一侧,分页链接没有任何作用,它们只会刷新页面。我正在使用WPML。

– Shane
2014年5月8日20:09



@Shane似乎WPML运行一些过滤器来阻止代码工作。但是它是一个很大的插件,因此我无法挖掘成千上万行代码来了解冲突所在。尝试询问WPML支持。

– gmazzap♦
2014年5月8日22:30

@Shane WPML支持论坛-如果以上适用(我假设),请将其标记为解决方案。无论如何,WPML冲突不在本站点的讨论范围之内。

– kaiser
2014年5月9日在1:03

很棒的答案,主要是因为它帮助我解决了分页问题。我一直在做类似的任务,并创建了第二个WP_Query进行循环。我给the_posts_pagination打了电话,但必须按照此问题中的概述制作一份原始wp_query的副本:wordpress.stackexchange.com/questions/216821/…

–亚历山大·霍尔斯格罗夫(Alexander Holsgrove)
17年1月30日在9:15

您是正确的@HongPong,固定,谢谢。

– gmazzap♦
19年9月9日在6:12

#2 楼

基于另一个类似的WPSE问题“分页无法使用wp_query自定义字段值”,我建议将global $paged;添加到模板文件的开头:

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


评论


感谢您的回复!不幸的是,它似乎没有任何区别。分页链接没有出现

– Shane
2014年5月8日18:32

斯蒂芬,为什么要帮忙?是的,这可以从全局角度将其引入,但是到目前为止您还没有做任何事情。如果要覆盖全局,请使用$ GLOBALS ['paged'] = get_query_var('paged');。否则,只使用globals内容。

– kaiser
2014年5月8日在18:34

@Shane Hmm,模板页面是否用作静态首页?

–斯蒂芬·S。
2014年5月8日在18:36

不,它仅用作自定义帖子类型的单个帖子模板。我确实尝试将查询从$ author_query更改为$ wp_query,这似乎使分页出现,但是当我单击它时,页面会刷新,即使有多个页面,也不会实际转到下一页。我已经更新了我的答案以反映这些更改。

– Shane
14年5月8日在18:38



php.net的解释还不错。我建议您只使用global和$ GLOBALS。一点var_dump(),一些功能,您就可以了。要通过一点尝试/错误来真正理解它,您将获得大约。需要半个小时。这将帮助您更好地了解函数与类以及整个OOP方法。显然它将使您更了解名称空间:)

– kaiser
2014年5月8日在18:45

#3 楼

gmazzap提供了详细的答案,但是我发现实现我的实现不需要几个部分,这与您的非常相似。重要的部分是重新排列模板并使用页面模板,而不是自定义帖子类型。
在查询args中,我执行了以下操作:
$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 ),,并且按预期方式工作。