Включение настраиваемых полей в настраиваемой конечной точке Wordpress REST API

Я создал настраиваемую конечную точку REST API для главной страницы создаваемого нами приложения, чтобы оно возвращало 3 настраиваемых запроса на основе типа сообщения вместо выполнения трех разных HTTP-запросов для каждого типа сообщения, но не могу понять, как это сделать. получить настраиваемые поля для каждого сообщения для отображения. Не уверен, куда идти дальше:

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

person borie88    schedule 18.11.2016    source источник


Ответы (2)


Я узнал, как решить эту проблему с помощью 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 );
}
person borie88    schedule 19.11.2016

Данные пост-запроса не извлекают настраиваемые поля, а просто извлекают исходные данные публикации. Вам нужно будет использовать 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, который вы хотите использовать.

person Connie Santora    schedule 18.11.2016
comment
Я попробовал это, и он вернул 38 000 строк кода с множеством повторяющихся сообщений. Как бы мы это сделали, используя get_post_meta просто для добавления к ответу на запрос? Я немного больше знаком с этим - person borie88; 18.11.2016
comment
Левое соединение должно прекратить повторение. - person Connie Santora; 18.11.2016
comment
На этот раз кажется, что он только что сбросил кучу временных данных, например, для Wordpress доступно новое обновление вместо данных публикации. Я очень признателен за помощь! Я нашел, как сделать настраиваемые поля доступными для каждого сообщения, но то, как я это делаю, делает доступными только эти поля, а не обычные поля, такие как идентификатор сообщения и т. Д., Если я не добавлю все эти поля в массив , что кажется неэффективным - person borie88; 19.11.2016
comment
После аргументов code $main_events = new WP_Query( $eventargs ); $events = $main_events->get_posts(); $return = array(); foreach($events as $event) { $newPost = array(); foreach( array( 'wpcf-event-start', 'wpcf-event-end', 'wpcf-event-website' ) as $field ){ $newPost[str_replace('-', '_', $field)] = get_post_meta( $event->ID, $field, true ); } $return[] = $newPost; } - person borie88; 19.11.2016