2016-11-18 180 views
3

我为我们正在做一个应用程序的头版一个自定义的REST API端点,这样它会根据岗位类型,而不是使3个不同的HTTP请求返回3个自定义查询每个帖子类型,但不知道如何获取每个帖子的自定义字段显示。不知道下一步去哪里:在WordPress的REST API自启用自定义字段端点

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*/ 
     } 
    } 

回答

1

我发现了如何通过使用get_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); 
} 
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'替换为您想要使用的任何post_type即可。

+0

我试过了,它返回了38,000行代码,有很多重复的帖子。我们如何使用get_post_meta来简单地添加查询响应呢?我对此有点更熟悉 – borie88

+0

这个工作更好吗?' –

+0

'<?php $ querystr =“ SELECT $ wpdb-> posts。*,$ wpdb-> postmeta。* FROM $ wpdb-> posts LEFT JOIN $ WPDB-> postsmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id WHERE $ wpdb-> posts.post_status ='publish' AND $ wpdb-> posts.post_type ='event' ORDER BY $ wpdb-> posts.post_date DESC “; $ events = $ wpdb-> get_results($ querystr,OBJECT); ?>' –