[API] Adding REST API Support To Existing Content Types [ok]

https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-rest-api-support-for-custom-content-types/

Ta thế đường dẫn cũ http://localhost/api/wp-json/wp/v2/books trở thành

Ta thế đường dẫn cũ http://localhost/api/wp-json/wp/v2/genre trở thành‌

http://localhost/api/wp-json/wp/v2/genre_ct

<?php
/**
 * Register a book post type, with REST API support
 *
 * Based on example at: https://codex.wordpress.org/Function_Reference/register_post_type
 */
/**
 * Register a book post type, with REST API support
 *
 * Based on example at: https://codex.wordpress.org/Function_Reference/register_post_type
 */
add_action('init', 'my_book_cpt');
function my_book_cpt() {
  $labels = array(
    'name'               => _x('Books', 'post type general name', 'your-plugin-textdomain'),
    'singular_name'      => _x('Book', 'post type singular name', 'your-plugin-textdomain'),
    'menu_name'          => _x('Books', 'admin menu', 'your-plugin-textdomain'),
    'name_admin_bar'     => _x('Book', 'add new on admin bar', 'your-plugin-textdomain'),
    'add_new'            => _x('Add New', 'book', 'your-plugin-textdomain'),
    'add_new_item'       => __('Add New Book', 'your-plugin-textdomain'),
    'new_item'           => __('New Book', 'your-plugin-textdomain'),
    'edit_item'          => __('Edit Book', 'your-plugin-textdomain'),
    'view_item'          => __('View Book', 'your-plugin-textdomain'),
    'all_items'          => __('All Books', 'your-plugin-textdomain'),
    'search_items'       => __('Search Books', 'your-plugin-textdomain'),
    'parent_item_colon'  => __('Parent Books:', 'your-plugin-textdomain'),
    'not_found'          => __('No books found.', 'your-plugin-textdomain'),
    'not_found_in_trash' => __('No books found in Trash.', 'your-plugin-textdomain'),
  );
  $args = array(
    'labels'                => $labels,
    'description'           => __('Description.', 'your-plugin-textdomain'),
    'public'                => true,
    'publicly_queryable'    => true,
    'show_ui'               => true,
    'show_in_menu'          => true,
    'query_var'             => true,
    'rewrite'               => array('slug' => 'book'),
    'capability_type'       => 'post',
    'has_archive'           => true,
    'hierarchical'          => false,
    'menu_position'         => null,
    'show_in_rest'          => true,
    'rest_base'             => 'books',
    'rest_controller_class' => 'WP_REST_Posts_Controller',
    'supports'              => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
  );
  register_post_type('book', $args);
}
function my_plugin_rest_route_for_post($route, $post) {
  if ($post->post_type === 'book') {
    $route = '/wp/v2/books/' . $post->ID;
  }
  return $route;
}
add_filter('rest_route_for_post', 'my_plugin_rest_route_for_post', 10, 2);
/**
 * Register a genre post type, with REST API support
 *
 * Based on example at: https://codex.wordpress.org/Function_Reference/register_taxonomy
 */
add_action('init', 'my_book_taxonomy', 30);
function my_book_taxonomy() {
  $labels = array(
    'name'              => _x('Genres', 'taxonomy general name'),
    'singular_name'     => _x('Genre', 'taxonomy singular name'),
    'search_items'      => __('Search Genres'),
    'all_items'         => __('All Genres'),
    'parent_item'       => __('Parent Genre'),
    'parent_item_colon' => __('Parent Genre:'),
    'edit_item'         => __('Edit Genre'),
    'update_item'       => __('Update Genre'),
    'add_new_item'      => __('Add New Genre'),
    'new_item_name'     => __('New Genre Name'),
    'menu_name'         => __('Genre'),
  );
  $args = array(
    'hierarchical'          => true,
    'labels'                => $labels,
    'show_ui'               => true,
    'show_admin_column'     => true,
    'query_var'             => true,
    'rewrite'               => array('slug' => 'genre'),
    'show_in_rest'          => true,
    'rest_base'             => 'genre',
    'rest_controller_class' => 'WP_REST_Terms_Controller',
  );
  register_taxonomy('genre', array('book'), $args);
}
function my_plugin_rest_route_for_term($route, $term) {
  if ($term->taxonomy === 'genre') {
    $route = '/wp/v2/genre/' . $term->term_id;
  }
  return $route;
}
add_filter('rest_route_for_term', 'my_plugin_rest_route_for_term', 10, 2);
/**
 * Add REST API support to an already registered post type.
 */
add_filter('register_post_type_args', 'my_post_type_args', 10, 2);
function my_post_type_args($args, $post_type) {
  if ('book' === $post_type) {
    $args['show_in_rest'] = true;
    // Optionally customize the rest_base or rest_controller_class
    $args['rest_base']             = 'books_ct';
    $args['rest_controller_class'] = 'WP_REST_Posts_Controller';
  }
  return $args;
}
/**
 * Add REST API support to an already registered taxonomy.
 */
add_filter('register_taxonomy_args', 'my_taxonomy_args', 10, 2);
function my_taxonomy_args($args, $taxonomy_name) {
  if ('genre' === $taxonomy_name) {
    $args['show_in_rest'] = true;
    // Optionally customize the rest_base or rest_controller_class
    $args['rest_base']             = 'genre_ct';
    $args['rest_controller_class'] = 'WP_REST_Terms_Controller';
  }
  return $args;
}
?>

Nếu bạn cần thêm hỗ trợ API REST cho một loại bài đăng tùy chỉnh hoặc phân loại tùy chỉnh mà bạn không kiểm soát, chẳng hạn như chủ đề hoặc plugin bạn đang sử dụng, bạn có thể sử dụng móc lọc register_post_type_args đã tồn tại từ phiên bản WordPress 4.6.0.

Đối với các đơn vị phân loại tùy chỉnh thì gần như giống nhau. Bạn có thể sử dụng bộ lọc register_taxonomy_args đã tồn tại từ phiên bản WordPress 4.4.0.

Last updated