カスタム投稿タイプに対して返された応答を変更するための適切な方法を探しています。その方法を見つけましたが、公式の文書ではこの方法を推奨していません。
それは私が構築したアプリケーションの一部だけがそれと相互作用するカスタム投稿タイプであるため、私は個人的には問題にならないと思いますが、それでも適切な方法でやりたいと思います。
Wordpressでは、レスポンスからデータを削除する前にカスタムコンテキストを作成することを推奨していますが、その方法を示すドキュメントが見つかりません。誰かがこれを行うことに正しい方向に私を指すことができます。
私は彼らがこの習慣を強く推奨しないことを知っていますが、私がこれらのうち5/6しか必要としないとき、私は配列とオブジェクトを含む20以上のフィールドを得ています。私はそれがアプリケーションのスピードと応答性に大きな違いをもたらすと確信しています。
APIでは応答の変更を防ぐことはできませんが、コードはこれを強く推奨しないように構成されています。内部的には、 フィールド登録はフィルタ 、および によって強化されています。これらは、他に選択肢がない場合に使用できます。
thereISほとんどの場合に別の選択肢、すなわち: カスタムエンドポイント/ルート 。
CPTに休息コントローラクラスを割り当てることもできます。そのため、 WP_Rest_Posts_Controller およびset カスタムエンドポイント、それらのルート 、パラメータ、そして必要なものに対応するための対応するコールバックを拡張できます。
必要な手順は次のとおりです。
rest_controller_class
を設定Extend WP_REST_Controller
またはWP_REST_Posts_Controller
注:WP_REST_Posts_Controller
自体は WP_REST_Controller
を拡張しています。
rest_controller_class
引数を設定する:1)登録中の$args
配列内
$labels = array( ... );
$args = array(
'labels' => $labels,
...
...
'show_in_rest' => true,
'rest_base' => 'my_rest_base',
//'rest_controller_class' => 'WP_REST_Posts_Controller',
'rest_controller_class' => 'My_CPT_Controller_Class'
);
register_post_type( 'my-post-type', $args );
2)CPTの登録後に追加するには、フィルタフックを使用します。 register_post_type_args
function add_rest_stuff( $args, $post_type ) {
$custom_post_type = 'my-post-type';
if ( $post_type !== $custom_post_type ) {
return $args;
}
$args['show_in_rest'] = true;
$args['rest_base'] = 'my_rest_base';
$args['rest_controller_class'] = 'My_CPT_Controller_Class';
return $args;
}
add_filter('register_post_type_args', 'make_it_public' );
WP_REST_Controller
を拡張する:出発点としての簡単な部分的な例( 前の答え から)
class My_CPT_Controller_Class extends WP_REST_Controller {
public function __construct() {
add_action( 'rest_api_init', array( $this, 'register_routes' ) );
}//end __construct
public function register_routes() {
$version = '1';
$namespace = 'my-fancy-namespace/v' . $version;
$base = 'my-route-base';
// so, site.com/wp-json/my-fancy-namespace/v1/my-route-base/
register_rest_route( $namespace, '/'. $base, array(
array(
'methods' => 'GET',
'callback' => array( $this, 'my_get_callback' ),
'permission_callback' => array( $this, 'key_permissions_check' ),
),
array(
'methods' => 'POST',
'callback' => array( $this, 'my_post_callback' ),
'permission_callback' => array( $this, 'key_permissions_check' ),
),)
);
$base2 = 'my-second-base';
// so, site.com/wp-json/my-fancy-namespace/v1/my-second-base/
register_rest_route( $namespace, '/'. $base2, array(
array(
'methods' => 'GET',
'callback' => array( $this, 'my_get_callback_two' ),
'permission_callback' => array( $this, 'key_permissions_check' ),
),
array(
'methods' => 'POST',
'callback' => array( $this, 'my_post_callback_two' ),
'permission_callback' => array( $this, 'key_permissions_check' ),
),)
);
}//register_routes
public function key_permissions_check() {
//do permissions check stuff
}
public function my_get_callback( WP_REST_Request $request ) {
//do stuff with $request
//see the methods mentioned below
}//end
}//end class
WP_Rest_Requestクラスはいくつかのメソッドを提供します$request
を扱うための/。
スキーマ を調べて、応答を構築してください。
このページの下からprefix_get_comment()
の例を追加しました。それは簡単な例だからです。
function prefix_register_my_comment_route() {
register_rest_route( 'my-namespace/v1', '/comments', array(
// Notice how we are registering multiple endpoints the 'schema' equates to an OPTIONS request.
array(
'methods' => 'GET',
'callback' => 'prefix_get_comment_sample',
),
// Register our schema callback.
'schema' => 'prefix_get_comment_schema',
) );
}
/**
* Get our sample schema for comments.
*/
function prefix_get_comment_schema() {
$schema = array(
// This tells the spec of JSON Schema we are using which is draft 4.
'$schema' => 'http://json-schema.org/draft-04/schema#',
// The title property marks the identity of the resource.
'title' => 'comment',
'type' => 'object',
// In JSON Schema you can specify object properties in the properties attribute.
'properties' => array(
'id' => array(
'description' => esc_html__( 'Unique identifier for the object.', 'my-textdomain' ),
'type' => 'integer',
'context' => array( 'view', 'edit', 'embed' ),
'readonly' => true,
),
'author' => array(
'description' => esc_html__( 'The id of the user object, if author was a user.', 'my-textdomain' ),
'type' => 'integer',
),
'content' => array(
'description' => esc_html__( 'The content for the object.', 'my-textdomain' ),
'type' => 'string',
),
),
);
return $schema;
}