Wordpress API - 如何在单数与复数自定义 post 类型响应中显示不同的数据
Wordpress API - how to show different data in singular vs plural custom post type responses
我有一个自定义 post 类型 'product' returns 在 API 响应中有相当多的数据,最多 400 posts很多节点。几乎所有数据都来自高级自定义字段(我使用 ACF 到 API 插件来公开它)。
在'products'页面,我只需要显示产品的标题和图片。有没有办法在使用 https://example.com/wp-json/wp/v2/product
请求所有产品时删除所有其他字段,但在使用 https://example.com/wp-json/wp/v2/product/123
请求特定产品时保留该数据?
您最好为所有产品创建自定义端点。在您的自定义插件中添加以下代码或将其添加到主题的 functions.php 中(不过我会推荐自定义插件方法)
然后您可以使用 https://example.com/wp-json/custom/v1/all-products
访问它
add_action( 'rest_api_init', 'rest_api_get_all_products' );
function rest_api_get_all_products() {
register_rest_route( 'custom/v1', '/all-products', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'rest_api_get_all_products_callback',
'args' => array(
'page' => array(
'sanitize_callback' => 'absint'
),
'posts_per_page' => array(
'sanitize_callback' => 'absint'
)
)
));
}
function rest_api_get_all_products_callback( $request ) {
$posts_data = array();
$paged = $request->get_param( 'page' );
$posts_per_page = $request->get_param( 'posts_per_page' );
$paged = ( isset( $paged ) || ! ( empty( $paged ) ) ) ? $paged : 1;
$posts_per_page = ( isset( $posts_per_page ) || ! ( empty( $posts_per_page ) ) ) ? $posts_per_page : 10;
$query = new WP_Query( array(
'paged' => $paged,
'posts_per_page' => $posts_per_page,
'post_status' => 'publish',
'ignore_sticky_posts' => true,
'post_type' => array( 'product' )
)
);
$posts = $query->posts;
if( empty( $posts ) ){
return new WP_Error( 'no_post_found', 'No Products Found.', array( 'status' => 404 ) );
}
foreach( $posts as $post ) {
$id = $post->ID;
$post_thumbnail = ( has_post_thumbnail( $id ) ) ? get_the_post_thumbnail_url( $id ) : null;
$posts_data[] = (object) array(
'id' => intval($id),
'title' => $post->post_title,
'featured_img' => $post_thumbnail
);
}
$response = rest_ensure_response( $posts_data );
return $response;
}
我有一个自定义 post 类型 'product' returns 在 API 响应中有相当多的数据,最多 400 posts很多节点。几乎所有数据都来自高级自定义字段(我使用 ACF 到 API 插件来公开它)。
在'products'页面,我只需要显示产品的标题和图片。有没有办法在使用 https://example.com/wp-json/wp/v2/product
请求所有产品时删除所有其他字段,但在使用 https://example.com/wp-json/wp/v2/product/123
请求特定产品时保留该数据?
您最好为所有产品创建自定义端点。在您的自定义插件中添加以下代码或将其添加到主题的 functions.php 中(不过我会推荐自定义插件方法)
然后您可以使用 https://example.com/wp-json/custom/v1/all-products
add_action( 'rest_api_init', 'rest_api_get_all_products' );
function rest_api_get_all_products() {
register_rest_route( 'custom/v1', '/all-products', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'rest_api_get_all_products_callback',
'args' => array(
'page' => array(
'sanitize_callback' => 'absint'
),
'posts_per_page' => array(
'sanitize_callback' => 'absint'
)
)
));
}
function rest_api_get_all_products_callback( $request ) {
$posts_data = array();
$paged = $request->get_param( 'page' );
$posts_per_page = $request->get_param( 'posts_per_page' );
$paged = ( isset( $paged ) || ! ( empty( $paged ) ) ) ? $paged : 1;
$posts_per_page = ( isset( $posts_per_page ) || ! ( empty( $posts_per_page ) ) ) ? $posts_per_page : 10;
$query = new WP_Query( array(
'paged' => $paged,
'posts_per_page' => $posts_per_page,
'post_status' => 'publish',
'ignore_sticky_posts' => true,
'post_type' => array( 'product' )
)
);
$posts = $query->posts;
if( empty( $posts ) ){
return new WP_Error( 'no_post_found', 'No Products Found.', array( 'status' => 404 ) );
}
foreach( $posts as $post ) {
$id = $post->ID;
$post_thumbnail = ( has_post_thumbnail( $id ) ) ? get_the_post_thumbnail_url( $id ) : null;
$posts_data[] = (object) array(
'id' => intval($id),
'title' => $post->post_title,
'featured_img' => $post_thumbnail
);
}
$response = rest_ensure_response( $posts_data );
return $response;
}