如何使用ORDER_BY按两个META_KEY排序,而不排除未初始化这些键的POST?

时间:2017-07-18 作者:Blaine Lafreniere

我在自定义帖子类型上有两个meta\\u键。我希望能够查询所有这些帖子,并按这两个帖子排序meta_key, 一个优先于另一个。

一、 我有一个meta_key 调用stickied, 这些应该始终首先出现。第二个meta_keypopularity, 这是该帖子的基本命中率。

当我使用meta_query, 似乎没有初始化的元键的POST不会出现在结果集中。我想要所有的帖子,不管他们是否有meta_key 是否初始化,然后根据这些meta_key.

这可能吗?

4 个回复
SO网友:nicolasDevDes

我有一个类似的问题,但无法通过此线程上的代码片段解决。

我必须通过以下方式进行查询:

首先是所有“特色”帖子(is_it_a_featured_etf)和数值字段(etf_aum)按描述顺序排列在特色菜之后我的解决方案:

\'meta_query\'   => [
  \'relation\'    => \'OR\',

  \'etf_aum\'    => array(
    \'key\'     => \'etf_aum\',
    \'type\'    => \'NUMERIC\',
    \'compare\' => \'EXISTS\',
  ),

  \'is_it_a_featured_etf\' => array(
    \'key\'       => \'is_it_a_featured_etf\',
    \'compare\'   => \'EXISTS\',
    \'value\'     => \'1\',
    \'operator\'  => \'=\',
  ),
],
\'orderby\' => [
  \'is_it_a_featured_etf\' => \'ASC\',
  \'etf_aum\' => \'DESC\',
]

SO网友:Johansson

据我所知,您正在尝试按元值对帖子进行排序。在这种情况下,您可以使用\'orderby => \'meta_value\'. 因此,您的查询将如下所示:

$args = array(
    \'orderby\'   => \'meta_value\',
    \'meta_key\'  => \'stickied\',
);
$query = new WP_Query( $args );
不是那样的orderby 可以接受多个值,例如:

$args = array(
    \'post_type\' => \'page\',
    \'orderby\'   => array( \'title\' => \'DESC\', \'meta_value\' => \'ASC\' ),
    \'meta_key\'  => \'stickied\',

);
然而,我不确定是否可以使用多个元值,但这可能是可能的。目前,我的数据库中没有这样的条件来测试它,但基于我的示例和codex page 你应该能够轻松地尝试一下。

请让我知道,如果根据上述结构按多个值排序对您有效。

挖掘一段时间后,我发现this 答案和此代码提供了此情况的解决方案:

$args = array(
    \'post_type\' => \'post\',
    \'orderby\' => \'meta_key\',
    \'order\' => \'ASC\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array( 
            \'key\'=>\'stickied\',
            \'compare\' => \'EXISTS\'           
        ),
        array( 
            \'key\'=>\'popularity\',
            \'compare\' => \'EXISTS\'           
        )
    ),
    \'post_per_page\'=>-1
);

$query = new WP_Query($args);

SO网友:KFish

有很多方法可以解决这样的问题。当您需要对查询应用默认分页时,真正的问题就会出现。

处理这个问题并保留分页功能的最佳方法是使用meta_查询子句的组合。杰克·约翰逊(JackJohansson)的做法是正确的,这只需要在查询中增加一些逻辑性。您可能需要稍微调整准确的组合以满足您的需要,因为这只是根据提供的信息进行的估计。

尝试以下操作:

$args = array(
    \'post_type\' => \'post\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        \'sticky_pop_clause\' => array(
            \'relation\' => \'AND\',
            \'sp_sticky\' => array( 
                \'key\' => \'stickied\',
                \'compare\' => \'EXISTS\' 
            ),
            \'sp_pop\' => array( 
                \'key\' => \'popularity\',
                \'compare\' => \'EXISTS\'           
            )     
        ),
        \'sticky_clause\' => array( 
            \'key\' => \'stickied\',
            \'compare\' => \'EXISTS\'           
        ),
        \'popular_clause\' => array( 
            \'key\'=>\'popularity\',
            \'compare\' => \'EXISTS\'           
        ),
        \'other_clause\' => array(
            \'relation\' => \'AND\',
            array( 
                \'key\'=>\'stickied\',
                \'compare\' => \'NOT EXISTS\'           
            ),
            array( 
                \'key\'=>\'popularity\',
                \'compare\' => \'NOT EXISTS\'           
            )
        )
    ),
    \'orderby\' => array(
        \'sp_pop\' => \'DESC\',
        \'sticky_clause\' => \'ASC\',
        \'popular_clause\' => \'DESC\',
        \'date\' => \'DESC\'
    )
);

$query = new WP_Query($args);

SO网友:dodo254

您需要检查所有(选择)包含和不包含的帖子stickiedpopularity 两者都有EXISTSNOT EXISTS. 在那之后,你用orderby.

没有测试它。根据您的需要进行修改。我也做过类似的事情。结果还可以。

$args = [
    \'meta_query\' => [
        \'relation\' => \'OR\',
        \'with_stickied\' => [
            \'key\'=>\'stickied\',
            \'compare\' => \'EXISTS\'           
        ],
        \'without_stickied\' => [
            \'key\'=>\'stickied\',
            \'compare\' => \'NOT EXISTS\'           
        ],
        \'with_popularity\' => [
            \'key\'=>\'popularity\',
            \'compare\' => \'EXISTS\'           
        ],
        \'with_popularity\' => [
            \'key\'=>\'popularity\',
            \'compare\' => \'NOT EXISTS\'           
        ],
    ],
    \'orderby\' => [
            \'with_stickied\' => \'DESC\',
            \'with_popularity\' => \'DESC\',
    ]
];
您可能需要检查“‘orderby’ with multiple ‘meta_key’s“发件人WP Codex.

结束

相关推荐

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

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