我正在嘗試查詢帖子,但我只對某些欄位感興趣并且想限制正在回傳的欄位。最后,我想回傳一個包含有限欄位的帖子陣列,以將其傳遞給 rest-api 端點,這樣我就可以在另一個專案中獲取它。
我設法準確地查詢了我想要的帖子(元鍵 geo_latitude 存在)并將其傳遞給 api 端點,但查詢確實回傳了一個 WP_Post 物件陣列,其中不包括我正在尋找的地理資料。我最頭疼的是如何自定義回傳值。
對于回傳值,我試圖實作這一點: 查詢帖子陣列每個帖子僅包含:
- 帖子標題
- 發布鏈接
- 地理緯度
- 地理經度
地理資料:https ://codex.wordpress.org/Geodata (這些值是從插件地理混搭中復制的)
查詢帖子的作業代碼:
// Query the posts
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;
}
// Register api endpoint and pass the query post function to it.
add_action( 'rest_api_init', function () {
register_rest_route( 'endpoint', '/posts', array(
'methods' => 'GET',
'callback' => 'get_posts_with_geo',
) );
} );
它回傳以下 wp 帖子物件的陣列:
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。我們談論的是大約 250 個具有地理資料的帖子,但總共有超過 500 個帖子。每頁限制為 100。我無法僅在此端點中查詢帶有地理資料的帖子,因此我必須接收所有帖子,回圈分頁,然后過濾所有沒有地理資料的帖子。這非常浪費,也是我試圖建立自己的端點的原因,它可以準確地給我想要的資料。
/編輯:
可能有很大的改進空間,但到目前為止的作業解決方案:
在函式 get_posts_with_geo 中回傳 $posts 之前,添加了以下 foreach 回圈:
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 );
}
它將鍵添加到每個回傳的 $post 的末尾,但仍然從 WP_Object 中回傳所有其他欄位。
/編輯:更好的解決方案
我更改了 wp 查詢以僅回傳帖子 ID。從這個 id 陣列中,我創建了一個新陣列,其中包含僅包含我想要的欄位的 post 物件(使用 post 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',
]
],
) );
// https://codex.wordpress.org/Geodata
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;
}
// Register the new endpoint and pass the related callback to it.
add_action( 'rest_api_init', function () {
register_rest_route( '(redacted)', '/posts', array(
'methods' => 'GET',
'callback' => 'get_posts_with_geo',
) );
} );
uj5u.com熱心網友回復:
您可以使用 posts_fields 過濾器來更改回傳的欄位。
您需要在 get_posts() 引數中傳遞 'suppress_filters => false 才能使該過濾器運行。
例子 :-
function alter_fields_zillion($fields) {
return 'ID,post_title'; // etc
}
add_filter('posts_fields','alter_fields_zillion');
或者您可以回圈瀏覽帖子,然后在帖子中添加 meta_data。
foreach ( $posts as $key => $post ) {
$posts[ $key ]->key1 = get_post_meta( $post->ID, 'key1', true );
$posts[ $key ]->key2 = get_post_meta( $post->ID, 'key2', true );
}
我希望它有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528838.html
