You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义WP_Query返回字段,构建含地理数据的REST API端点

自定义WordPress REST API端点返回指定字段的文章数组

需求说明

我需要查询WordPress文章,仅保留特定字段,返回一个包含有限字段的文章数组,用于供其他项目调用的REST API端点。

已成功筛选出带有geo_latitude元键的文章并传递到API端点,但返回的WP_Post对象不包含所需的地理数据,当前需要解决自定义返回值的问题。

期望每个文章仅返回以下字段:

  • 文章标题
  • 文章链接
  • 纬度(geo_latitude)
  • 经度(geo_longitude)

地理数据来自Geo Mashup插件。

初始查询代码

// 查询文章
function get_posts_with_geo( $data ) {
  $posts = get_posts( array(
    'numberposts'   => -1,
    'post_type'     => 'post',
    'meta_query' => [
            [
                'key'     => 'geo_latitude',
                'compare' => 'EXISTS',
            ]
        ],
  ) );

  if ( empty( $posts ) ) {
    return null;
  }

  return $posts;
}

// 注册API端点并关联查询函数
add_action( 'rest_api_init', function () {
  register_rest_route( 'endpoint', '/posts', array(
    'methods' => 'GET',
    'callback' => 'get_posts_with_geo',
  ) );
} );

初始代码问题

上述代码返回的WP_Post对象包含大量冗余字段:

WP_Post Object
(
    [ID] =>
    [post_author] =>
    [post_date] => 
    [post_date_gmt] => 
    [post_content] => 
    [post_title] => 
    [post_excerpt] => 
    [post_status] =>
    [comment_status] =>
    [ping_status] => 
    [post_password] => 
    [post_name] =>
    [to_ping] => 
    [pinged] => 
    [post_modified] => 
    [post_modified_gmt] =>
    [post_content_filtered] => 
    [post_parent] => 
    [guid] => 
    [menu_order] =>
    [post_type] =>
    [post_mime_type] => 
    [comment_count] =>
    [filter] =>
)

曾尝试使用默认REST API端点/wp-json/wp/v2/posts,但该端点无法直接筛选含地理数据的文章;站点总计500+文章,仅250条含地理数据,分页获取全部数据再过滤效率低下,因此决定自定义端点。

初步改进方案

在返回$posts前添加foreach循环,将所需字段添加到WP_Post对象,但仍会返回所有冗余字段:

foreach ( $posts as $key => $post ) {
    $posts[ $key ]->title = get_the_title( $post->ID );
    $posts[ $key ]->link = get_permalink( $post->ID );
    $posts[ $key ]->latitude = get_post_meta( $post->ID, 'geo_latitude', true );
    $posts[ $key ]->longitude = get_post_meta( $post->ID, 'geo_longitude', true );
}

最终优化方案

修改WP_Query仅返回文章ID,再通过ID构建仅包含所需字段的新数组返回,代码如下:

function get_posts_with_geo( $data ) {
  $posts = get_posts( array(
    'numberposts'   => -1,
    'post_type'     => 'post',
    'fields' => 'ids',
    'meta_query' => [
            [
                'key'     => 'geo_latitude',
                'compare' => 'EXISTS',
            ]
        ],
  ) );

  if ( empty( $posts ) ) {
    return null;
  }

  $newPosts = [];

  $i = 0;

  foreach ( $posts as $post ) {
    $newPosts[$i] = [
      "title" => get_the_title( $post ),
      "thumbnail" => get_the_post_thumbnail_url( $post, 'thumbnail' ),
      "link" => get_permalink( $post ),
      "latitude" => get_post_meta( $post, 'geo_latitude', true ),
      "longitude" => get_post_meta( $post, 'geo_longitude', true ),
    ];
    $i++;
  }

  return $newPosts;
}

// 注册新端点并关联回调函数
add_action( 'rest_api_init', function () {
  register_rest_route( '(redacted)', '/posts', array(
    'methods' => 'GET',
    'callback' => 'get_posts_with_geo',
  ) );
} );

内容的提问来源于stack exchange,提问作者Jakyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:45:17