我的网站有一个;“投资组合”;第页,其中包含类别3中的帖子。以下是我选择帖子的代码:
<?php
$args = array(\'cat\' => 3,
\'post_type\' => \'post\',
\'orderby\' => \'date\',
\'order\' => \'DESC\');
$postslist = get_posts( $args );
foreach ($postslist as $post) : setup_postdata($post);
?>
<div class="portfolio-item">
<?php the_post_thumbnail() ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</div>
<?php endforeach; ?>
但每次刷新页面时,帖子都会以随机顺序出现,即使我在参数中有“orderby”和“order”。似乎与函数中的一小段代码有一种奇怪的交互。php,如下所示;
<?php
add_action(\'pre_get_posts\',\'alter_query\');
function alter_query($query){
if ($query->is_main_query() && is_home())
$query->set(\'cat\', \'2\');
$query->set(\'orderby\', \'rand\');
}
?>
此代码显示主页上所有类别2帖子的随机帖子。同时包括该行;
$query->set(\'cat\', \'2\');
排序依据=>;日期和顺序=>;DESC停止处理公文包页面,但我需要这一行来为主页选择第2类帖子。如果有人能告诉我为什么会发生这种情况,我将非常感激。谢谢
最合适的回答,由SO网友:Howdy_McGee 整理而成
如果给定的代码正确,则可能是pre_get_posts
有条件的让我们用适当的缩进和间距格式化它:
function alter_query( $query ) {
if( $query->is_main_query() && is_home() )
$query->set( \'cat\', \'2\' );
$query->set( \'orderby\', \'rand\' );
}
add_action( \'pre_get_posts\',\'alter_query\' );
因为您的条件语句没有括号,所以它将在条件语句内运行第一行,在条件语句外运行所有其他行。这是速记。要解决此问题,只需添加括号:
function alter_query( $query ) {
if( $query->is_main_query() && is_home() ) {
$query->set( \'cat\', \'2\' );
$query->set( \'orderby\', \'rand\' );
}
}
add_action( \'pre_get_posts\',\'alter_query\' );
通过将附加功能封装在括号中,我们确保所有语句仅在满足该条件时运行。