比较wp_Query中的两个元字段(其中,元字段A大于元字段B)

时间:2021-06-06 作者:Zeth

我有一个自定义的post类型(foobar),带有两个meta\\u字段:

  • updated_at
  • build_ran_at
我想做一个WP\\u查询,在foobar帖子上返回,其中updated_at 在之后build_ran_at.这两个字段都是日期时间字段。

解决方案尝试

$foobar_query = new WP_Query([
  \'post_type\' => \'foobar\',
  \'post_status\' => \'publish\',
  \'posts_per_page\' => 999,
  \'meta_query\' => [
    \'relation\' => \'AND\',
    [
      \'key\' => \'updated_at\',
      \'value\' => ...? 
      \'compary\' => ...?
    ],
    [
      \'key\' => \'build_ran_at\',
      \'value\' => ...? 
      \'compary\' => ...?
    ],
  ]
]);

$returned_posts = [];
if( $foobar_query->have_posts() ):
  while( $foobar_query->have_posts() ):
    $foobar_query->the_post();
    $returned_posts[] = get_post();    
  endwhile; // while( $foobar_query->have_posts() ):
  wp_reset_query();
endif; // if( $foobar_query->have_posts() ):

2 个回复
SO网友:Sally CJ

在撰写本文时,还没有元查询compare 可以做你想做的事情的价值观,基本上是其中(<);更新了meta上的\\u>&燃气轮机<;build\\U ran\\U at meta>“引用”;。但是,除了使用meta_query 参数:

使用原始SQL仅检索具有updated_at 元大于build_ran_at 然后将ID传递给WP_Query 通过post__in arg like so:

// Build the raw SQL.
$query = "
    SELECT p.ID
    FROM $wpdb->posts p
        INNER JOIN $wpdb->postmeta pm ON pm.post_id = p.ID
        INNER JOIN $wpdb->postmeta pm2 ON pm2.post_id = p.ID
    WHERE p.post_type = \'foobar\'
        AND p.post_status = \'publish\'
        AND pm.meta_key = \'updated_at\'
        AND pm2.meta_key = \'build_ran_at\'
        AND pm.meta_value > pm2.meta_value
    LIMIT 999
";

// Get the post IDs.
$ids = $wpdb->get_col( $query );

// Then use the IDs as the post__in value.
$foobar_query = new WP_Query([
    \'post_type\'      => \'foobar\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => 999,
    \'post__in\'       => $ids,
]);
posts_clauses hook 在WHERE子句中添加上述两个JOIN子句和最后三个条件。

使用(闭包和)名为_updated_at 作为指示是否应过滤POST查询子句的标志,以避免其他WP_Query 受影响的查询:

// Add the filter.
add_filter( \'posts_clauses\', function ( $clauses, $query ) {
    if ( \'> build_ran_at\' === $query->get( \'_updated_at\' ) ) {
        global $wpdb;

        $pm = uniqid( \'pm_\' ); // unique table alias
        $clauses[\'join\'] .= " INNER JOIN $wpdb->postmeta $pm ON {$pm}.post_id = {$wpdb->posts}.ID";

        $pm2 = uniqid( \'pm_\' ); // unique table alias
        $clauses[\'join\'] .= " INNER JOIN $wpdb->postmeta $pm2 ON {$pm2}.post_id = {$wpdb->posts}.ID";

        $clauses[\'where\'] .= " AND ( {$pm}.meta_key = \'updated_at\' AND {$pm2}.meta_key = \'build_ran_at\'"
            "AND {$pm}.meta_value > {$pm2}.meta_value )";
    }

    return $clauses;
}, 10, 2 );

// Then use the _updated_at arg in place of meta_query.
$foobar_query = new WP_Query([
    \'post_type\'      => \'foobar\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => 999,
    \'_updated_at\'    => \'> build_ran_at\',
]);

SO网友:Edward

不要将post meta用于此类自定义数据查询。元值的使用非常缓慢。您应该更好地使用自定义表,并提供完全符合您需要的自定义WP\\U查询参数。

相关推荐

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

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