使用插件的 Wordpress ACF 元查询

Wordpress ACF meta query using a plugin

我是运行插件WP Show Posts on a WP install with a custom post type (called 'trees') that has a custom post field called 'popularity' (formatted as “number”). The custom field was created by the Advanced Custom Fields plugin, the custom post type with the plugin Custom Post Type UI

现在,我想创建一个列表,它只显示 post 人气值低于数值 10 的人。

为此,我遵循了插件作者的说明 here 并调整了插件本身以允许其他参数。

我现在按照 this support article 中的建议使用以下代码,但不幸的是,我无法让它工作。输出是“无结果消息”。

这是我在 functions.php:

中使用的代码
add_filter( 'wp_show_posts_shortcode_args', function( $args, $settings ) {
    if ( 4566 === $settings['list_id'] ) {
        $args['meta_query'] = array(
            array(
                'key' => 'popularity',
                'value' => 10,
                'compare' => '<'
            )
        );
    }

    return $args;
}, 15, 2 );

我做错了什么?例如,我是否必须指定自定义 post 类型(即树)?

如果你真的想使用这个“WP Show Posts”插件,在我写这个答案的时候,你需要修改它的核心功能才能修改它的查询。

  1. 走这条路your site folder > wp-content > plugins > wp-show-posts,然后打开wp-show-posts.php。线上 386:

替换

$query = new WP_Query(apply_filters('wp_show_posts_shortcode_args', $args));

有了这个:

$query = new WP_Query(apply_filters('wp_show_posts_shortcode_args', $args, $settings));
  1. 现在您可以修改查询了。在您的 functions.php 文件中使用以下代码段。
add_filter('wp_show_posts_shortcode_args', 'your_custom_query', 10, 2);

function your_custom_query($args, $settings)
{
  $args = $args;
  if (4566 === (int)$settings['list_id']) {
    $args['meta_query'] = array(
      array(
        'key' => 'popularity',
        'value' => '10',
        'compare' => '<',
        'type' => 'NUMERIC'
      )
    );
  }
  return $args;
}

注:

  • 确保4566WP Show Posts插件给你的id,否则无法正常工作。
  • 通过执行这些步骤,您将修改 WP Show Posts 插件核心文件(即 wp-show-posts.php)不推荐。因此,在插件的下一次更新中,确保您修改的行保持完整,否则它会破坏您的页面。所以请密切关注更新!
  • 因为你的字段类型是numeric,所以我添加了'type' => 'NUMERIC'参数,否则将不起作用。

使用 wp_query 的另一种解决方案。没有额外的插件

这是一个简单的 wp_query,让您无需使用任何第三方插件即可完成这项工作。

$args = array(
  'post_type' => 'trees', 
  'posts_per_page' => -1,
  'meta_query' => array(
    array(
      'key' => 'popularity',
      'value' => '10',
      'compare' => '<',
      'type' => 'NUMERIC'
    )
  )
);

$query = new WP_Query($args);

if ($query) {
  while ($query->have_posts()) {
    $query->the_post(); ?>
    <h4><?php the_title() ?></h4>
<?php 
  }
} else {
  echo "no post found!";
}

wp_reset_postdata();

这已经在 wordpress 5.8 上进行了全面测试并且有效。