WP查询 - 按元值排序并保留其他帖子

时间:2017-11-11 14:07:24

标签: php wordpress

无法解决此问题。

目标:我想显示所有帖子并按照帖子后排序 value ,但并非所有帖子都有该

问题:并非所有帖子都显示,只显示具有该元组的帖子(以及元值)。

$args = array(
'post_type' => 'post',
'meta_key'       => 'post_custom_field_1',
'orderby'        => 'meta_value',
'order'   => 'ASC',
'paged' => $paged,'post_type' => 'post' );

问题:如何显示所有帖子并按meta_key对其进行排序?具有meta_key的帖子首先显示,并按名称排序,并且不会跟随meta_key并按标题排序。

1 个答案:

答案 0 :(得分:0)

您必须使用EXISTS进行比较。有很多例子in the docs for WP_Query,您可以根据自己的情况进行调整:

function orderby_fieldifexists($orderby) {
    return "mt1.post_id IS NOT NULL DESC, wp_postmeta.meta_value ASC";
}

add_filter("posts_orderby", "orderby_fieldifexists", 10, 1);

$query = new WP_Query(
    array(
        'post_type' => 'post',
        'meta_query' => array(
            "relation" => "or",
            'custom_field_value' => array(
                'key' => 'post_custom_field_1',
            ), 
            'custom_field' => array(
                'key' => 'post_custom_field_1',
                'compare' => 'NOT EXISTS',
            ),
        ),
        'orderby' => array( 
            'custom_field' => 'ASC'
        ),
        'posts_per_page' => 5,
    )
);

我最初在这里有一个更简单的版本,但后来记得如果某些值为NULL,用数字排序将是愚蠢的。此版本将查找所有帖子,但也会获取值,并按“存在吗?”进行降序排序。然后按实际值升序,因此自定义字段值为-1的帖子将列在没有该自定义字段值的帖子之前。