我已经看到了几种(并在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 );
}
} );
有什么想法吗?:)
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 flag如果需要更改主循环获取的帖子,请使用pre_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