REST API サポートを持つカスタム投稿タイプの登録
カスタム投稿タイプを登録する際、REST API 経由で利用可能にしたい場合は、'show_in_rest' => true
を register_post_type
に渡す引数に設定する必要があります。この引数を true に設定すると、wp/v2
名前空間にルートが追加されます。
/**
* Register a book post type, with REST API support
*
* Based on example at: https://developer.wordpress.org/reference/functions/register_post_type
*/
add_action( 'init', 'my_book_cpt' );
function my_book_cpt() {
$args = array(
'public' => true,
'show_in_rest' => true,
'label' => 'Books'
);
register_post_type( 'book', $args );
}
オプションで、rest_base
引数を設定してベース URL を変更できます。そうしないと、デフォルトで投稿タイプの名前が使用されます。以下の例では、「books」が rest_base
の値として使用されています。これにより、ルートの URL は wp-json/wp/v2/books
になり、wp-json/wp/v2/book/
というデフォルトの URL にはなりません。
さらに、rest_controller_class
の引数を渡すこともできます。このクラスは WP_REST_Controller
のサブクラスである必要があります。デフォルトでは、WP_REST_Posts_Controller
がコントローラーとして使用されます。カスタムコントローラーを使用している場合、wp/v2
名前空間内にはない可能性があります。
以下は、完全なラベル、REST API のサポート、カスタマイズされた rest_base、およびデフォルトコントローラーの明示的な登録を伴う投稿タイプの登録の例です:
/**
* Register a book post type, with REST API support
*
* Based on example at: https://developer.wordpress.org/reference/functions/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 );
}
カスタム rest_controller_class
を使用している場合、REST API は特定の投稿のルートを自動的に決定できません。この場合、rest_route_for_post
フィルターを使用してこの情報を提供できます。これにより、カスタム投稿タイプが検索エンドポイントで適切にフォーマットされ、自動発見リンクが有効になります。
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 );
REST API サポートを持つカスタムタクソノミーの登録
REST API サポートを持つカスタムタクソノミーの登録は、カスタム投稿タイプの登録と非常に似ています:'show_in_rest' => true
を register_taxonomy
に渡す引数に設定します。オプションで、rest_base
を渡してタクソノミーのルートのベース URL を変更できます。
タクソノミーのデフォルトコントローラーは WP_REST_Terms_Controller
です。カスタムコントローラーを使用する場合は、rest_controller_class
でこれを変更できます。
以下は、REST API サポートを持つカスタムタクソノミーを登録する方法の例です:
/**
* Register a genre post type, with REST API support
*
* Based on example at: https://developer.wordpress.org/reference/functions/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 );
}
カスタム rest_controller_class
を使用している場合、REST API は特定の用語のルートを自動的に決定できません。この場合、rest_route_for_term
フィルターを使用してこの情報を提供できます。これにより、カスタムタクソノミーが検索エンドポイントで適切にフォーマットされ、自動発見リンクが有効になります。
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 );
既存のコンテンツタイプに REST API サポートを追加する
カスタム投稿タイプやカスタムタクソノミーに対して、例えば使用しているテーマやプラグインの制御ができない場合に REST API サポートを追加する必要がある場合、WordPress バージョン 4.6.0 以降に存在する register_post_type_args
フィルターフックを使用できます。
/**
* 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';
$args['rest_controller_class'] = 'WP_REST_Posts_Controller';
}
return $args;
}
カスタムタクソノミーの場合もほぼ同じです。WordPress バージョン 4.4.0 以降に存在する register_taxonomy_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'] = 'genres';
$args['rest_controller_class'] = 'WP_REST_Terms_Controller';
}
return $args;
}
カスタムリンク関係
タクソノミーとカスタム投稿タイプは WordPress 内で組み込みの関連付けを持っていますが、2 つのカスタム投稿タイプの間にリンクを確立したい場合はどうでしょうか?これは WordPress 自体では正式にサポートされていませんが、_link
関係を使用して任意のコンテンツタイプ間に独自の接続を作成できます。