php ACF/WordPress:在前端按多个值排序帖子列表

e4yzc0pl  于 2023-01-24  发布在  PHP
关注(0)|答案(3)|浏览(130)

我有以下代码,这是工作正常,并根据自定义字段分配给每个职位使用ACF插件排序后。这里是用于此目的的代码

function my_pre_get_posts( $query ) {

// only modify queries for 'event' post type
if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'post' ) {
    
    $query->set('order', 'ASC'); 
    $query->set('orderby', 'meta_value');    
    $query->set('meta_key', 'active_inactive');    
    
}

// return
return $query;

}

add_action('pre_get_posts', 'my_pre_get_posts');

我有一个使用ACF创建的自定义字段,称为active_inactive,它有2个值,每个职位,活动和非活动。
第一个要求工作正常,其中所有活动的职位显示在列表中的第一位,然后是非活动的职位,但是,日期没有被正确排序,并在活动的职位,所有非活动的职位排序从旧的日期第一次到结束日期在最后。
因此,我需要固定的日期,以及,所以正确的后,活跃的职位名单结束和不活跃的职位点燃开始,所有这些不活跃的职位应开始从最新的日期到最早的日期。
任何帮助都将不胜感激。

bq3bfh9z

bq3bfh9z1#

尝试类似的操作,但由于post_date,没有返回任何结果

function my_pre_get_posts( $query ) {

if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'post' ) {
    
    $meta_query = array(
        'active_inactive' => array(
            'key' => 'active_inactive',
            'compare' => 'EXISTS'
        ),
        'post_date' => array(
            'key' => 'post_date',
            'compare' => 'EXISTS'
        ),
    );
    $order_by = array(
        'active_inactive' => 'ASC',
        'post_date' => 'DESC'
    );
    
    $query->set( 'meta_query', $meta_query );
    $query->set( 'orderby', $order_by );
    $query->set( 'posts_per_page', -1 );
 }
}
add_action( 'pre_get_posts', 'my_pre_get_posts' );
mkh04yzy

mkh04yzy2#

您可以使用meta_query参数添加另一个 meta_key参数,以便在活动帖子之后按日期降序对非活动帖子进行排序。
可以使用 meta_query参数指定多个排序条件,并将meta_query参数设置为数组的数组,每个数组包含meta_key、meta_value和order参数。

function my_pre_get_posts( $query ) {
if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'post' ) {
    $query->set('order', 'ASC'); 
    $query->set('orderby', 'meta_value');    
    $query->set('meta_key', 'active_inactive');
    $query->set('meta_query', array(
        'relation' => 'OR',
        array(
            'key'     => 'active_inactive',
            'value'   => 'active',
            'compare' => '='
        ),
        array(
            'key'     => 'date',
            'compare' => 'EXISTS',
        ),
        array(
            'key'     => 'date',
            'value'   => date("Ymd"),
            'compare' => '<=',
            'type'    => 'DATE'
        ),
        array(
            'key'     => 'active_inactive',
            'value'   => 'inactive',
            'compare' => '='
        ),
        array(
            'key'     => 'date',
            'compare' => 'EXISTS',
        ),
        array(
            'key'     => 'date',
            'value'   => date("Ymd"),
            'compare' => '<=',
            'type'    => 'DATE'
        ),
        array(
            'key'     => 'date',
            'order'   => 'DESC',
            'compare' => 'EXISTS',
            'type'    => 'DATE'
        )
    ));
}
return $query;
}
add_action('pre_get_posts', 'my_pre_get_posts');

我又向 meta_query参数添加了三个数组:第一个数组检查日期字段是否存在,并且小于或等于今天的日期,这将排除未来的事件。第二个数组检查帖子的active_inactive值是否等于inactive。第三个数组按日期降序排序非活动帖子。此外,我还添加了一个关系参数设置为OR,以便两个条件都能满足。

ohfgkhjo

ohfgkhjo3#

function my_pre_get_posts($query)
    {
        if (isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'post')
        {
            $meta_query = array(
                'active_inactive' => array(
                    'key' => 'active_inactive',
                    'compare' => 'EXISTS'
                ),
                'modified' => array(
                    'key' => 'modified',
                    'type' => 'date',
                    'compare' => 'EXISTS'
                ),
            );
            $order_by = array(
                'active_inactive' => 'ASC',
                'modified' => 'DESC'
            );
            $query->set('meta_query', $meta_query);
            $query->set('orderby', $order_by);
        }
        else
        {
            $meta_query = array(
                'active_inactive' => array(
                    'key' => 'active_inactive',
                    'compare' => 'EXISTS'
                ),
                'modified' => array(
                    'key' => 'modified',
                    'type' => 'date',
                    'compare' => 'EXISTS'
                ),
            );
            $order_by = array(
                'active_inactive' => 'ASC',
                'modified' => 'DESC'
            );
            $query->set('meta_query', $meta_query);
            $query->set('orderby', $order_by);
        }
    }

    add_action('pre_get_posts', 'my_pre_get_posts');

相关问题