WP_按两个组合的元值日期查询订单发布

时间:2020-09-13 作者:user194575

该查询需要根据两个自定义字段从数千篇帖子中获取信息。”每篇文章都需要“原始日期”,而“特色日期”是可选的(根据自定义复选框字段隐藏。选中后,默认情况下,“特色日期”设置为“原始日期”)。但是,如果为特定帖子设置了“特色日期”,那么它应该是优先的,并最终按照特色日期进行排序,就像原始日期设置为与特色日期相等一样。

也就是说,查询不需要首先按特色日期对所有帖子进行排序,&;然后是原始日期。相反,它需要将它们排序在一起,就像这些日期被合并到一列中一样。因此,用户可以通过设置特色日期将事件推到结果的顶部,但一旦创建了另一篇原始日期较晚的帖子,特色日期帖子就会从顶部掉下来。

Example database:

ID | post_title |    meta_key   | meta_value
---------------------------------------------
1  | Person 1   | original_date | Jan 2nd
2  | Person 2   | featured_date | Jan 1st
2  | Person 2   | original_date | Dec 1st
3  | Person 3   | featured_date | Jan 3rd

Expected query results:

ID | post_title |    meta_key   | meta_value
---------------------------------------------
3  | Person 3   | featured_date | Jan 3rd
1  | Person 1   | original_date | Jan 2nd
2  | Person 2   | featured_date | Jan 1st
如果创建了一个原始(或特色)日期为1月4日的新帖子,它现在将位于结果的顶部。

我研究了meta\\u查询,可以根据给定帖子是否存在这些自定义字段来获取帖子。但我还没有找到一种方法来对它们进行排序,以便将两个字段中的日期进行组合和排序,而不是先按一个字段排序,再按另一个字段排序。

$args = array(
  \'post_type\'        => \'custom_post_type\',
  \'post_status\'      => \'publish\',
  \'paged\'            => $paged,
  \'meta_query\'       => array(
    \'relation\' => \'OR\',
    array(
      \'key\' => \'featured_date\',
      \'type\' => \'DATE\',
      \'compare\' => \'EXISTS\'
    ),
    array(
      \'key\' => \'original_date\',
      \'type\' => \'DATE\',
      \'compare\' => \'EXISTS\'
    )
  ),
  \'orderby\' => \'meta_value_date\',
  \'order\' => \'DESC\',
  // \'orderby\' => array(\'meta_value_date\' => \'DESC\')
);

$results = new WP_Query( $args );
我能够从下面的SQL查询中得到我想要的结果(尽管可能效率很低,因为我对SQL了解不多)。但是,使用此SQL查询的问题是,已经存在基于其他因素向初始查询添加额外参数的逻辑。我必须基于该逻辑重新实现添加到SQL查询,我想通过找出正确的wp\\U查询方法来避免这种情况。

$sql = $wpdb->get_results("SELECT * FROM (
    SELECT DISTINCT *, $wpdb->postmeta.meta_value AS sort_date
    FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )
    WHERE $wpdb->posts.post_type = \'custom_post_type\'
    AND $wpdb->postmeta.meta_key = \'featured_date\'
    AND $wpdb->posts.post_status = \'publish\'
    UNION
    SELECT DISTINCT *, $wpdb->postmeta.meta_value AS sort_date
    FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )
    WHERE $wpdb->posts.post_type = \'custom_post_type\'
    AND $wpdb->postmeta.meta_key = \'original_date\'
    AND $wpdb->posts.post_status = \'publish\'
) AS created_table
GROUP BY ID
ORDER BY sort_date DESC");
<小时/>Edit - birgire的回答让我意识到值得一提的是,这是一个插件,它已经在许多网站的生产中使用。当前功能按“original\\u date”对帖子进行排序。但它被要求允许用户将某些帖子推到顶部,同时仍然尊重队列(即,稍后的帖子将位于其上方)。featured\\u日期是请求的功能。

1 个回复
SO网友:birgire

在帖子插入/更新时,设置帖子的menu_order 作为maximum of the numeric MMDD values 属于original_datefeatured_date. 可以按以下格式设置菜单顺序1MMDD 避免前导零。

那我们就可以order the custom type posts by the menu order 速度非常快:

WP_Query( [ 
   \'post_type\' => \'custom_post_type\', 
   \'orderby\'   => \'menu_order\', 
   \'order\'     => \'DESC\' 
] );
在哪里menu_order 是一个int(11) 中的列posts table.

如果并非所有自定义类型的帖子都有这些自定义日期,请将其分组,例如按custom taxonomy, 用于WP_Query. 也许你可以寻找非零菜单顺序的帖子。

相关推荐

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

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