2016-11-18 4 views
3

Я создал пользовательскую конечную точку REST API для первой страницы приложения, которое мы создаем, чтобы он возвращал 3 пользовательских запроса на основе типа post вместо того, чтобы создавать 3 разных HTTP-запроса для каждый тип сообщения, но не может понять, как получить настраиваемые поля для каждого сообщения для отображения. Не уверен куда идти дальше:Включение пользовательских полей в пользовательской конечной точке 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

' posts. *, $ Wpdb-> postmeta. * FROM $ wpdb-> posts LEFT JOIN $ WPDB-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id WHERE $ wpdb-> posts.post_status = 'publish' И $ wpdb-> posts.post_type = 'event' ORDER BY $ wpdb-> posts.post_date DESC "; $ events = $ wpdb-> get_results ($ querystr, OBJECT); ?> ' –

Смежные вопросы