您的代码试图使用if语句来控制正在使用哪些if语句,等等,这就是元编程。这行不通,也永远行不通。
<?php
if ( is_tag() ) {
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
}
else {
$paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
$query_args = array(
\'post_type\' => \'post\',
\'post_status\' => array( \'private\', \'publish\' ),
\'posts_per_page\' => 20,
\'paged\' => $paged,
);
$the_query = new WP_Query( $query_args );
if ( $the_query->have_posts() ) {
<!-- the new loop -->
while ( $the_query->have_posts() ) {
$the_query->the_post();
}
上述代码与您编写的代码等效,并存在以下问题:
PHP代码中间有一条HTML注释,这是无效语法,不是PHP。您永远不会关闭第一条if语句或第二条if语句
您的第一个post循环实际上没有做任何事情,您的else语句缺少右括号,您尝试创建一个全新的查询,而不是使用pre_get_posts
滤器这意味着您要在页面模板中执行此操作,并尝试显示帖子,而不是依赖于模板层次结构的知识。你知道WordPress提供了标签类别和自定义帖子类型的模板,甚至包括单个日期和特定类别?阅读有关模板层次结构的信息,它将为您节省大量时间,如果您不了解它,可能会浪费数千个小时由于所有这些语法错误,PHP放弃并发送了一个错误。这就是为什么在标题下什么都没有,因为在标题之后发生的PHP是无效的。要做您试图做的事情,您需要一个预处理器,而PHP没有预处理器您声明此模板用于主页,但它也用于标记存档,这意味着这实际上是index.php
.
因此,让我们找出两个问题:
您需要修改主页上显示的内容,在标记存档时需要显示其他内容解决问题1到目前为止,您的解决方案是忽略WordPress从数据库检索到的内容,并进行第二次数据库查询。这很昂贵,相当于:
你每天早上派你的爸爸出去给你端杯茶。你把他们送到30分钟以外的地方,每天当他们回来时,你把茶扔在地板上,说“实际上我想要杯拿铁”
可以说这很昂贵,而且浪费了很多时间。您的新WP_Query
相当于query_posts
. 人们说不要使用query_posts
因为它所做的,这里发生的事情是做同样事情的一种稍微优雅的方式,它从根本上来说仍然很昂贵。
相反,让我们使用pre_get_posts
:
function exclude_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( \'posts_per_page\', \'20\' );
$query->set( \'post_status\', array( \'private\', \'publish\' );
}
}
add_action( \'pre_get_posts\', \'exclude_category\' );
该过滤器将在查询出现在您的主页上之前对其进行修改,允许您使用标准、正常的post循环,而不是自定义WP_Query
环分页只需开箱即用,不会有任何其他查询。这相当于:就在爸爸出去喝茶之前,你轻拍他们的肩膀,说“这个订单不对,对不起,你能给我换杯拿铁吗?”。爸爸第一次喝拿铁,没有把茶扔到地板上,你喝得更快
作为旁白,index.php
是回退模板。对于您的主页,请考虑使用home.php
.
就像所有过滤器一样functions.php
, 不是你的模板。
解决问题2使用tag.php
, 就这么简单。不要试图使用同一个模板来显示多个处处带有条件的东西,只需遵循模板层次结构,让WordPress来完成工作