按发布日期排序帖子不起作用吗?

时间:2020-11-24 作者:tomtomthompson

我的网站有一个;“投资组合”;第页,其中包含类别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类帖子。如果有人能告诉我为什么会发生这种情况,我将非常感激。谢谢

1 个回复
最合适的回答,由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\' );
通过将附加功能封装在括号中,我们确保所有语句仅在满足该条件时运行。