使用PRE_GET_POST进行查询以获取分页

时间:2012-06-07 作者:WouterB

在完成所有工作后query_posts, 我注意到我的分页没有运行。有人告诉我pre_get_posts 应该是解决方案。

我的问题:

我不知道如何通过所有的标准(query_posts(array(\'post_type\' => \'trips\', \'types\' => $types, \'paged\' => $paged,)输入到pre_get_postsis_page 不工作)

任何帮助都将不胜感激。

这是函数的内部功能。php

function bwpm_pre_get_posts($query){
    if(!$query->get(\'posts_page_page\'))
    $query->set(\'posts_per_page\',1);
    }
    add_action(\'pre_get_posts\',\'bwpm_pre_get_posts\');
这是页面上使用的模板中的内容。

<?php
/*
Template Name: Generic Trips Template
*/
?>
<?php get_header(); ?>

        <?php get_template_part( "beforeloop", "page" ) ?>
                                    <?php $types = $post->post_name; ?>


<?php if (have_posts()) : ?>
    <?php 
        $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
        query_posts(array( 
            \'post_type\' => \'trips\', 
            \'types\' => $types, 
            \'paged\' => $paged,
        ) );
    ?>
<?php while (have_posts()) : the_post(); ?>
    <article id="post-<?php the_ID(); ?>" class="post"></article>

<?php endwhile; ?>

<div style="text-align:center;">
<?php posts_nav_link(\' &#183; \', \'previous page\', \'next page\'); ?>
</div>

<?php endif; wp_reset_query(); ?>
        <?php get_template_part( "afterloop", "page" ) ?> 

<?php get_footer(); ?>
更新:2012年6月11日在将代码更新为@chipbennet示例后,问题仍然没有得到解决,因为我没有得到正确工作的分页。上一个链接将永远不会出现,下一个链接将在每个页面上显示相同的内容。可在上找到整页代码http://pastebin.com/NiuSEWia.

3 个回复
SO网友:Chip Bennett

似乎要创建custom page template 要显示custom post type? 如果是这样的话,你真的不需要pre_get_posts 完全

First, 创建自定义页面模板。我想你已经这么做了。

Second, 您需要使用WP_Query():

global $post;
$types = $post->post_name;

$trips_query_args = array( 
    \'post_type\' => \'trips\', 
    \'types\' => $types, 
);

$trips_query = new WP_Query( $trips_query_args );
(注意:什么是\'types\' 参数据我所知,它不是一个核心查询参数。你在用它吗?)

Third, 我们需要让WordPress知道,它需要基于我们的自定义查询而不是默认查询进行分页:

global $wp_query;
// Put default query object in a temp variable
$tmp_query = $wp_query;
// Now wipe it out completely
$wp_query = null;
// Re-populate the global with our custom query
$wp_query = $trips_query;
此时,我们将默认查询移动到一个临时变量中,并重新填充$wp_query 使用我们的自定义查询进行全局查询。

Fourth, 我们需要输出自定义查询循环:

if ( $trips_query->have_posts() ) : while ( $trips_query->have_posts() ) : $trips_query->the_post();

    // Normal loop output goes here
    // You can use loop template tags normally
    // such as the_title() and the_content()

endwhile; endif;
只需将您的循环输出放到上面。为了简洁起见,我省略了它。

Fifth, 我们只需要重新设置:

// Restore original query object
$wp_query = $tmp_query;
// Be kind; rewind
wp_reset_postdata();
这就是输出具有正确分页的自定义查询循环所需的全部内容。

编辑分类法的使用{slug} => {term} as a query taxonomy parameter 在WordPress 3.1中被弃用,取而代之的是\'tax_query\'. 您应该替换此:

\'types\' => $types
。。。使用此选项:

\'tax_query\' => array(
    array(
        \'taxonomy\' => \'types\',
        \'field\'    => \'slug\',
        \'term\'     => $types
    ) 
)
这会让你$types_query_args 数组如下所示:

$trips_query_args = array( 
    \'post_type\' => \'trips\', 
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'types\',
            \'field\'    => \'slug\',
            \'term\'     => $types
        ) 
    )
);
编辑ChipBennett有趣的发展。我在$trips\\u query\\u args数组中添加了“paged”=>N,其中N代表一个数字。当添加1时,页面实际上显示了与第1页完全相同的结果。当添加2时,它显示了第2页的完美结果。然而,当使用导航链接甚至操纵URL时,它就不再有效了。有什么想法吗?

因此,让我们尝试使用以下命令强制查询分页:

$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
您将更新您的$trips_query_args 相应地排列:

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

$trips_query_args = array( 
    \'post_type\' => \'trips\', 
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'types\',
            \'field\'    => \'slug\',
            \'term\'     => $types
        ) 
    ),
    \'paged\'    => $paged;
);
这会导致正确的分页吗?

SO网友:MathSmath

WordPress根据主查询在模板解析之前显示分页详细信息。这可能就是为什么有人建议您利用pre\\u get\\u帖子。

我不知道代码中的“beforeloop”和“afterloop”模板部分是用来做什么的,但看起来您试图让主(页面)查询代表页面标题,然后切换到自定义查询,然后使用wp\\u reset\\u query()切换回主查询。如果您希望分页功能正常,那么这种方法将不起作用,通常不建议使用这种方法来处理多个查询。如果希望在一个页面上有两个查询,其中一个应该是自定义查询using WP_Query 或者类似的东西。

您可以:

确定是否存在与您正在尝试创建的页面相同的自然WP(例如,它看起来像您正在尝试创建一个post类型存档或自定义分类术语存档),然后改用此自然模板。检查Template Hierarchy.

使用pre\\u get\\u posts更改整个主查询,并使用自定义查询获取所需的任何其他内容(当前在beforeloop和afterloop中的内容)。您可以在pre\\u get\\u posts中设置所有查询参数,方法与设置posts\\u per\\u page参数相同。例如:

$查询->设置(\'posts\\u per\\u page\',1)$查询->设置(\'post\\u type\',\'trips\');

等等。如果您是基于这样的主查询分页,则不需要操纵分页的var。

SO网友:Dmitry Misharov

我使用pre\\u get\\u post解决了这个问题。我找到了一个适合我的实现:

if ( ! function_exists( \'ucc_add_cpts_to_pre_get_posts\' ) ) {
    function ucc_add_cpts_to_pre_get_posts( $query ) {
        if ( $query->is_main_query() && ! is_post_type_archive() && ! is_singular() && ! is_404() ) {
            $my_post_type = get_query_var( \'post_type\' );
            if ( empty( $my_post_type ) ) {
                $query->set(\'post_type\', \'your_custom_type\');
                $query->set(\'posts_per_page\', \'your_posts_per_page\');
            }
        }
    }
}
add_action( \'pre_get_posts\', \'ucc_add_cpts_to_pre_get_posts\' );
http://uncommoncontent.com/2012/01/28/add-custom-post-types-to-the-loop您必须从模板中删除query\\u帖子。

结束

相关推荐

How to use pagination?

我有一个页面的以下代码,在这里我拉一张照片,标题和最后10篇文章的摘录。问题是,我不知道如何添加分页?我也安装了WP PageNavi。我已经看到一些类似的问题得到了解决,但我根本无法真正理解这个概念,我首先尝试确保这是可能的?<?php /* Template Name: Opinion */ ?> <?php get_header(); ?> <div id=\"primary\"> <div id=\"