在Front-page.php上对自定义帖子类型进行分页

时间:2018-12-16 作者:AlexHighHigh

我已经看到了几种(并在StackExchange上尝试了至少15种以上的方法)如何执行自定义post类型循环,但在我的情况下,没有一种可行的方法。

我尝试过使用分页和不分页、使用自定义导航和重置永久链接的方法。

I can get the posts to show, the issue I\'m experiencing is with the navigation loading the same content despite the link changing to page-2.

这是我目前的方法,没有使用paged

        <?php
        $args = array(\'post_type\' => array(\'posts\', \'affiliate-products\'));

        query_posts($args);

        if (have_posts()) : while (have_posts()) : the_post();
                get_template_part(\'template-parts/content\', \'product\');
            endwhile;
            the_posts_navigation();
        else :
            ?>
            <p><?php esc_html_e(\'Sorry, no posts matched your criteria.\'); ?></p>
        <?php endif; ?>
任何人都可以建议一种方法来做这与工作分页的头版。php?提前感谢<;3.

编辑:

当前非工作代码,根据有关“pre\\u get\\u posts”功能的建议:

主页循环

        <?php

    if (have_posts()) : while (have_posts()) : the_post();
            get_template_part(\'template-parts/content\', \'product\');
        endwhile;
        the_posts_navigation();
    else :
        ?>
        <p><?php esc_html_e(\'Sorry, no posts matched your criteria.\'); ?></p>
    <?php endif; ?>

功能。php

add_action( \'pre_get_posts\', function( \\WP_Query $query) {
  if ( is_home() && $query->is_main_query() ) {
    $query->set(\'post_type\', \'affiliate-products\');
    $query->set( \'posts_per_page\', 3 );
  }
} );
有什么想法吗?:)

1 个回复
SO网友:Tom J Nowell

这里的根本问题是调用query_posts:

    $args = array(\'post_type\' => array(\'posts\', \'affiliate-products\'));

    query_posts($args);
在任何时候都不会告诉它要获取哪个页面,因此它总是获取第一个页面,也就是默认页面。

您可以添加这一点,但从根本上讲,整个方法是不正确的,并且有许多其他您可能没有意识到的问题。例如,您不打电话wp_reset_query, 因此,在post循环之后运行的任何循环或代码都将被破坏。query_posts usage is a massive red flag, avoid it at all costs.

遗憾的是,许多遗留代码仍然存在,许多非常旧的教程错误地将这一点教给了新手。

更改帖子显示内容的真正方法如果要更改页面上显示的帖子,应该使用pre_get_posts 筛选,以便它在第一次获取您想要的内容。

否则,您将在事后丢弃主查询,然后进行第二次查询,使页面速度降低2倍。然后,由于您创建了自己的查询,因此不存在任何内置功能,因此您也必须重新构建它。

相反,在您的functions.php 钩入pre_get_posts 像这样:

add_action( \'pre_get_posts\', function( \\WP_Query $query) {
    //
} );
现在您可以使用$query->set$query->get 在参数进入数据库之前更改参数。您也可以使用所有条件,例如$query->is_home()$query->is_main_query().

例如,此筛选器将搜索页面设置为仅显示5篇文章:

add_action( \'pre_get_posts\', function( \\WP_Query $query) {
    if ( $query->is_main_query() && $query->is_search() ) {
        $query->set( \'posts_per_page\', 5 );
    }
} );
现在,搜索列表显示每页5篇文章,分页仍然有效,速度也一样快,没有性能损失,其他功能也仍然有效。

一些注意事项:

  • pre_get_posts 是修改标准主post循环的过滤器。将其用于普通循环,无需修改模板,如果您要修改模板以实现此功能,则会出现问题,在任何情况下都不要使用query_posts. 没有任何有效的用例没有更好/更简单的选项所涵盖。把它从你的脑海中抹去,如果你遇到它,就用深深的怀疑来对待它,it\'s a major red flagpre_get_posts 筛选如果需要进行第二次查询,请使用WP_Query, 但决不要使用它来更改或替换主查询。这更适用于边栏帖子列表等,请记住在使用WP_Query 你应该打电话wp_reset_postdata 然后,否则你会把东西弄坏。不要把所有的循环语句都弄脏在一行上,这会使内容更难阅读,也会混淆编辑器和工具。作为参考,这是标准的后循环的外观:

    if ( have_posts() ) {
        while ( have_posts() ) {
            the_post();
            // display the post
        }
    } else {
        // nothing was found
    }
    
    如果你需要query_posts 打电话给它,那么事情就出了可怕的问题。使用pre_get_posts 相反

    I strongly recommend you look through the slides of this talk, they cover how to use queries, best practices, and common mistakes

相关推荐

Separate First Post Loop

我正在尝试使用<?php rewind_posts(); ?> 在我的主页模板上使用两个循环的功能。有人知道如何停止最新帖子后的第一个循环吗?这是我的代码:<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h1><a href=\"<?php the_permalink(); ?>\"><