我如何在不丢失没有该专栏的帖子的情况下对该专栏进行“排序”?

时间:2020-08-21 作者:Nicholas Cardot

我目前正在使用以下代码对我创建的超级棒专栏进行排序和排序:

        if ( \'My column\' !== $query->get( \'orderby\' ) ) {
            return;
        }

        // Order by the _my_column using a numeric interpretation of the value.
        $query->set( \'meta_key\', \'_my_column\' );
        $query->set( \'orderby\', \'meta_value_num\' );
这段代码完成了任务,但当我单击列标题对列进行排序时,任何不包含该元字段的帖子都不会包含在帖子列表中。我希望任何不包含meta字段的帖子都计算为0,并将其排序为零。我如何才能做到这一点?谢谢

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

您可以这样做:

使用meta_query 参数查询包含元数据的两篇文章_my_column (或者不管什么是元键)和没有元键的帖子(即数据库中不存在)。

将自定义名称(即数组键)与上述元查询子句一起使用,然后在orderby 参数

请参见Query improvements in WP 4.2: ‘orderby’ and ‘meta_query’ 了解更多详细信息。

因此,与其使用meta_key 参数:

注意:我看到您使用meta_value_num, 所以我用了\'type\' => \'NUMERIC\' 确保元值被视为(有符号)整数

如果您不想/需要保留现有的元查询(在$query 对象):

$query->set( \'meta_query\', array(
    \'relation\'             => \'OR\',

    // Clause 1, named my_column_exists:
    // Query posts that do have the metadata _my_column.
    \'my_column_exists\'     => array(
        \'key\'     => \'_my_column\', // meta key
        \'compare\' => \'EXISTS\',
        \'type\'    => \'NUMERIC\',
    ),

    // Clause 2, named my_column_not_exists:
    // OR that do NOT have the metadata.
    \'my_column_not_exists\' => array(
        \'key\'     => \'_my_column\', // meta key
        \'compare\' => \'NOT EXISTS\',
        \'type\'    => \'NUMERIC\',
    ),
) );

$query->set( \'orderby\', array(
    // Sort by the _my_column metadata first.
    \'my_column_not_exists\' => \'DESC\',

    // Then if you want, by the post date, title, etc.
    \'date\'                 => \'ASC\',
) );

$query->set( \'meta_query\', array(
    // Note: Here the \'relation\' defaults to AND.

    // Clause 1, unnamed.
    array(
        \'relation\'             => \'OR\',

        // Sub-clause 1, named my_column_exists:
        // Query posts that do have the metadata _my_column.
        \'my_column_exists\'     => array(
            \'key\'     => \'_my_column\', // meta key
            \'compare\' => \'EXISTS\',
            \'type\'    => \'NUMERIC\',
        ),

        // Sub-clause 2, named my_column_not_exists:
        // OR that do NOT have the metadata.
        \'my_column_not_exists\' => array(
            \'key\'     => \'_my_column\', // meta key
            \'compare\' => \'NOT EXISTS\',
            \'type\'    => \'NUMERIC\',
        ),
    ),

    // Clause 2, unnamed.
    // Include the existing meta queries.
    (array) $query->get( \'meta_query\' ),
) );

$query->set( \'orderby\', array(
    // Sort by the _my_column metadata first.
    \'my_column_not_exists\' => \'DESC\',

    // Then if you want, by the post date, title, etc.
    \'date\'                 => \'ASC\',
) );

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post