web-dev-qa-db-ja.com

削除する推奨方法 WP REST APIがカスタム投稿のデータを返しました

カスタム投稿タイプに対して返された応答を変更するための適切な方法を探しています。その方法を見つけましたが、公式の文書ではこの方法を推奨していません。

それは私が構築したアプリケーションの一部だけがそれと相互作用するカスタム投稿タイプであるため、私は個人的には問題にならないと思いますが、それでも適切な方法でやりたいと思います。

Wordpressでは、レスポンスからデータを削除する前にカスタムコンテキストを作成することを推奨していますが、その方法を示すドキュメントが見つかりません。誰かがこれを行うことに正しい方向に私を指すことができます。

私は彼らがこの習慣を強く推奨しないことを知っていますが、私がこれらのうち5/6しか必要としないとき、私は配列とオブジェクトを含む20以上のフィールドを得ています。私はそれがアプリケーションのスピードと応答性に大きな違いをもたらすと確信しています。

1
Courtney

docsの状態 -

APIでは応答の変更を防ぐことはできませんが、コードはこれを強く推奨しないように構成されています。内部的には、 フィールド登録はフィルタ 、および によって強化されています。これらは、他に選択肢がない場合に使用できます。

thereISほとんどの場合に別の選択肢、すなわち: カスタムエンドポイント/ルート

CPTに休息コントローラクラスを割り当てることもできます。そのため、 WP_Rest_Posts_Controller およびset カスタムエンドポイント、それらのルート 、パラメータ、そして必要なものに対応するための対応するコールバックを拡張できます。

必要な手順は次のとおりです。

  1. カスタム投稿タイプ(CPT)にrest_controller_classを設定
  2. Extend WP_REST_ControllerまたはWP_REST_Posts_Controller
  3. ルートを登録してメソッドを定義する
  4. スキーマを使用しておそらく応答形式を制御する

注:WP_REST_Posts_Controller自体は WP_REST_Controller を拡張しています。

CPTに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;
} 
0
hwl