Get custom posts using the WP REST API

2019-08-17 03:43发布

问题:

I'm trying to get custom post types, but I can not seem to find any solution. The WP REST API documentation only returns blog posts.

Note: I'm using the Dooplay theme

The code below is in the file tipo.php

directory: inc > includes > series

if( ! function_exists( 'doo_series' ) ) {
    function doo_series() {
        $labels = array(
            'name'                => _x('TV Shows', 'Post Type General Name','mtms'),
            'singular_name'       => _x('TV Show', 'Post Type Singular Name','mtms'),
            'menu_name'           => __d('TV Shows %%PENDING_COUNT_TV%%'),
            'name_admin_bar'      => __d('TV Shows'),
            'all_items'           => __d('TV Shows'),
        );
        $rewrite = array(
            'slug'                => get_option('dt_tvshows_slug','tvshows'),
            'with_front'          => true,
            'pages'               => true,
            'feeds'               => true,
        );
        $args = array(
            'label'               => __d('TV Show'),
            'description'         => __d('TV series manage'),
            'labels'              => $labels,
            'supports'            => array('title', 'editor','comments','thumbnail','author'),
            'taxonomies'          => array('genres'),
            'hierarchical'        => false,
            'public'              => true,
            'show_ui'             => true,
            'show_in_menu'        => true,
            'menu_position'       => 5,
            'menu_icon'           => 'dashicons-welcome-view-site',
            'show_in_admin_bar'   => true,
            'show_in_nav_menus'   => false,
            'can_export'          => true,
            'has_archive'         => true,
            'exclude_from_search' => false,
            'publicly_queryable'  => true,
            'rewrite'             => $rewrite,
            'capability_type'     => 'post',
        );
        register_post_type('tvshows', $args );
    }
    add_action('init', 'doo_series', 0 );
    get_template_part('inc/includes/series/metabox');
}

回答1:

Compare with

register_post_type( 'post', array(
    'labels' => array(
        'name_admin_bar' => _x( 'Post', 'add new from admin bar' ),
    ),
    'public'  => true,
    '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
    '_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */
    'capability_type' => 'post',
    'map_meta_cap' => true,
    'menu_position' => 5,
    'hierarchical' => false,
    'rewrite' => false,
    'query_var' => false,
    'delete_with_user' => true,
    'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
    'show_in_rest' => true,
    'rest_base' => 'posts',
    'rest_controller_class' => 'WP_REST_Posts_Controller',
) );

which registers the built in post type post. Observe the last three fields. These fields must be set to make the post type accessible via REST.

ADDENDUM

Actually only 'show_in_rest' is required as WordPress has default values for the other two. Also, if a developer wrote his own WP_REST_Controller for the custom post type instead of using the builtin WP_REST_Posts_Controller then even this is not required as his own WP_REST_Controller can call the register_rest_route() functions by some other means.