我为我们正在制作的应用的首页制作了一个自定义REST API端点,以便它会根据帖子类型返回3个自定义查询,而不是为每种帖子类型发出3个不同的HTTP请求,但可以&# 39;弄清楚如何获取要显示的每个帖子的自定义字段。不知道下一步该去哪里:
class Home_Custom_Route extends WP_REST_Controller {
/**
* Register the routes for the objects of the controller.
*/
public function my_register_routes() {
$version = 'v2';
$namespace = 'wp/' . $version;
$base = 'home';
register_rest_route( $namespace, '/' . $base, array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_items' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
'args' => array(
),
),
) );
register_rest_route( $namespace, '/' . $base . '/schema', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_public_item_schema' ),
) );
}
/**
* Get a collection of items
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|WP_REST_Response
*/
public function get_items( $request ) {
$eventargs = array(
'post_type' => 'event',
'posts_per_page' => 3,
'meta_key' => 'wpcf-event-start',
'meta_value' => current_time( 'timestamp', 1 ),
'meta_compare' => '<=',
);
$main_events = new WP_Query( $eventargs );
$listingargs = array(
'post_type' => 'listings',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
);
$main_listings = new WP_Query( $listingargs );
$ticketsargs = array(
'post_type' => 'product',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'tickets',
)
),
);
$main_tickets = new WP_Query( $ticketsargs );
$data = array(
'events' => $main_events->posts,
'listings' => $main_listings->posts,
'tickets' => $main_tickets->posts,
);
return new WP_REST_Response( $data, 200 );
}
/**
* Get one item from the collection
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|WP_REST_Response
*/
public function get_item( $request ) {
//get parameters from request
$params = $request->get_params();
$item = array();//do a query, call another class, etc
$data = $this->prepare_item_for_response( $item, $request );
//return a response or error based on some conditional
if ( 1 == 1 ) {
return new WP_REST_Response( $data, 200 );
}else{
return new WP_Error( 'code', __( 'Couldnt find it', 'xxx' ) );
}
}
/**
* Check if a given request has access to get items
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|bool
*/
public function get_items_permissions_check( $request ) {
return true; //<--use to make readable by all
}
/**
* Check if a given request has access to get a specific item
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|bool
*/
public function get_item_permissions_check( $request ) {
return $this->get_items_permissions_check( $request );
}
/**
* Prepare the item for the REST response
*
* @param mixed $item WordPress representation of the item.
* @param WP_REST_Request $request Request object.
* @return mixed
*/
public function prepare_item_for_response( $item, $request ) {
/*pretty sure this is where custom fields are enabled, but not sure how to do that*/
}
}
答案 0 :(得分:1)
我发现如何通过使用get_post_meta来解决这个问题,但是我的答案在每个查询中执行多次调用,因此可能优化以首先拉取所有post meta,然后只抓取我需要的字段。
public function get_items( $request ) {
$eventargs = array(
'post_type' => 'event',
'posts_per_page' => 3,
'meta_key' => 'wpcf-event-start',
'meta_value' => current_time( 'timestamp', 1 ),
'meta_compare' => '<=',
);
$main_events = new WP_Query( $eventargs );
$events = $main_events->posts;
foreach($events as $event) {
foreach( array( 'wpcf-event-start', 'wpcf-event-end', 'wpcf-event-website' ) as $field ){
$event->$field = get_post_meta( $event->ID, $field, true );
}
}
$listingargs = array(
'post_type' => 'listings',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
);
$main_listings = new WP_Query( $listingargs );
$listings = $main_listings->posts;
foreach($listings as $listing) {
foreach( array( 'wpcf-listing-hours', 'wpcf-correct-address', 'wpcf-total-ratings', 'wpcf-average-rating' ) as $field ){
$listing->$field = get_post_meta( $listing->ID, $field, true );
}
}
$ticketsargs = array(
'post_type' => 'product',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'tickets',
)
),
);
$main_tickets = new WP_Query( $ticketsargs );
$tickets = $main_tickets->posts;
foreach($tickets as $ticket) {
foreach( array( '_price', '_stock', '_stock_status' ) as $field ){
$ticket->$field = get_post_meta( $ticket->ID, $field, true );
}
}
$data = array(
'events' => $events,
'listings' => $listings,
'tickets' => $tickets,
);
return new WP_REST_Response( $data, 200 );
}
答案 1 :(得分:0)
帖子查询数据不会提取自定义字段,只会提取原始帖子数据。您必须使用get_post_meta()
但是,因为您正在创建REST API端点,所以最好自定义$ wpdb查询。
<?php
$querystr = "
SELECT $wpdb->posts.*, $wpdb->postmeta.*
FROM $wpdb->posts, $wpdb->postmeta
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'event'
ORDER BY $wpdb->posts.post_date DESC
";
$events = $wpdb->get_results($querystr, OBJECT);
?>
您只需要替换“#event”事件&#39;使用你想要使用的任何post_type。