首页 > 解决方案 > 使用插件的 Wordpress ACF 元查询

问题描述

我在具有自定义帖子类型(称为“树”)的 WP 安装上运行插件WP Show Posts,该自定义帖子类型具有称为“流行度”(格式为“数字”)的自定义帖子字段。自定义字段是由高级自定义字段插件创建的,自定义帖子类型与插件自定义帖子类型 UI

现在,我想创建一个列表,它只显示流行度值低于 10 的帖子。

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

我现在按照这篇支持文章中的建议使用以下代码,但不幸的是,我无法让它工作。输出是“无结果消息”。

这是我在 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 );

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

标签: phpwordpressadvanced-custom-fieldscustom-wordpress-pages

解决方案


如果你真的想使用这个“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();

这已经在 wordpress5.8和作品上进行了全面测试。


推荐阅读