自定义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
相关产品推荐
相关产品推荐

