查询具有或不具有META_VALUE且按相同ASC排序的帖子

时间:2016-04-05 作者:bluantinoo

我正在尝试对所有帖子执行计划更新,每次更新10篇帖子。

为了实现这一点,我使用一个脚本运行Cron job,该脚本可以保存2个post meta:

  • $DATA: 我要更新的数据$TIME: UNIX时间戳:time(), 了解该帖子何时更新为新的$DATA$DATA Posteta,当我查询帖子以执行更新时,我希望帖子的顺序如下:

    首先,我想要任何这样的帖子not 拥有$TIME Posteta然后是所有其他的,从我之前更新的那些开始,这些是我正在使用的查询参数:

    $args = array(
       \'post_type\' => \'post\',
       \'post_status\' => \'publish\',
       \'posts_per_page\' => \'10\',
       \'meta_query\' => array(
          \'relation\' => \'OR\',
           array( 
                   \'key\' => \'TIME_meta_key\',
                   \'compare\' => \'EXISTS\'
               ),
             array(
                   \'key\' => \'TIME_meta_key\',
                   \'compare\' => \'NOT EXISTS\',
                   \'value\' => \'xxx\'  // I\'ve read this is a bug, so I put a value even if it\'s ignored
               ),
           ),
       \'orderby\' => \'TIME_meta_key\',
       \'order\' => \'ASC\'
     );
    
    正如我之前所说TIME_meta_key 值(如果存在)只是一个UNIX时间戳。

    因此,由于我想先更新那些尚未更新的帖子,然后更新那些较早更新的帖子,我想我必须订购ASC。

    但如果我设置ASC,这将不起作用。它会不断更新在TIME_meta_key 领域

    这是正常的还是我犯了一些愚蠢的错误?

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

您可以通过命名元查询的索引,然后将这些名称的数组传入orderby 参数

$args = array(
   \'post_type\' => \'post\',
   \'post_status\' => \'publish\',
   \'posts_per_page\' => \'10\',
   \'meta_query\' => array(
      \'relation\' => \'OR\',
      \'with_time\' => array( 
               \'key\' => \'TIME_meta_key\',
               \'compare\' => \'EXISTS\'
           ),
      \'without_time\' => array(
               \'key\' => \'TIME_meta_key\',
               \'compare\' => \'NOT EXISTS\',
               /* \'value\' => \'xxx\'  The bug has been fixed ; */
           ),
       ),
   /* First order posts those does not have meta key then those have meta key in ascending order */
   \'orderby\' => array(
       \'without_time\' => \'ASC\',
       \'with_time\' => \'ASC\'
   ),
 );
在orderby数组中,第一个键是without_time 然后with_time 因此,它将首先提出所有没有的职位TIME_meta_key 然而,这些帖子将没有顺序(将根据ID默认),因为元键不存在。然后它将加入那些有元密钥的帖子TIME_meta_key 按升序排列。

因此,最终结果将是posts without meta key orderby ID 然后posts with meta key order by value ascending.

注1:这些语法仅在WordPress 4.2版之后才受支持。注2:另一个与NOT EXIST 已在WordPress 3.9中修复

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the