2016-11-18 11 views
3

3つの異なるHTTPリクエストを作成するのではなく、投稿タイプに基づいて3つのカスタムクエリを返すように、作成するアプリのフロントページ用にカスタムREST APIエンドポイントを作成しましたそれぞれの投稿タイプは表示されますが、表示する各投稿のカスタムフィールドを取得する方法を理解することはできません。わからないところ次に行き: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); 
?> 

「イベント」を使用する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 = '公開' AND $ wpdb-> posts.post_type = 'イベント' ORDER BY $ wpdb-> posts.post_date DESC "; $ events = $ wpdb-> get_results($ querystr、OBJECT); ?> ' –

関連する問題