web-dev-qa-db-ja.com

利用可能な組み込みWordPress APIのいずれかを介して保護されたメタフィールドを取得する方法はありますか? (xmlrpc、wp-json)

WordPressにはいくつかのAPIが組み込まれています。

デフォルトでは、カスタムの投稿タイプや保護されたメタキーは返されません。

プラグインの保護されたメタフィールドにアクセスしたいです。 here および here の例に従ってみました。

このコードを追加することで、wp-json APIがカスタム投稿タイプを返すように管理しました。

/**
 * Add REST API support to an already registered post type.
 */
add_action( 'init', 'my_custom_post_type_rest_support', 25 );

function my_custom_post_type_rest_support() {

  global $wp_post_types;

  // be sure to set this to the name of your post type!
  $post_type_name = 'tribe_venue';

  if( isset( $wp_post_types[ $post_type_name ] ) ) {
      $wp_post_types[$post_type_name]->show_in_rest = true;
      $wp_post_types[$post_type_name]->rest_base = $post_type_name;
      $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller';
  }

  $post_type_name2 = 'tribe_events';

  if( isset( $wp_post_types[ $post_type_name2 ] ) ) {
      $wp_post_types[$post_type_name2]->show_in_rest = true;
      $wp_post_types[$post_type_name2]->rest_base = $post_type_name2;
      $wp_post_types[$post_type_name2]->rest_controller_class = 'WP_REST_Posts_Controller';
  }
}

しかし、レスポンスに保護されたメタキーを含めることはできませんでした。

私は次のコードを試してみました:

add_filter( 'is_protected_meta', function ( $protected, $key, $type ) {
    if ( $type === 'tribe_venue' && $key === '_VenueVenue' ) {
        return true;
    }
    return $protected;
}, 10, 3 );

add_filter( 'rae_include_protected_meta', '__return_true' );

そして次のコード:

function custom_rest_api_allowed_public_metadata($allowed_meta_keys){
    $allowed_meta_keys[] = '_VenueVenue';
    $allowed_meta_keys[] = '_VenueAddress';
    $allowed_meta_keys[] = '_VenueCity';
    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

しかしどちらもうまくいきません。

誰が何が必要なのか知っていますか?そのため、そのような保護されたフィールドをAPIのいずれかを介してアクセス可能にしますか?実用的な例はどこかにありますか?

7
samy

私にとって最も簡単な解決策は、JSONレスポンスに追加のフィールドを作成し、選択した投稿メタを追加することです。

function create_api_posts_meta_field() {

    // "tribe_venue" is your post type name, 
    // "protected-fields" is a name for new JSON field

    register_rest_field( 'tribe_venue', 'protected-fields', [
        'get_callback' => 'get_post_meta_for_api',
        'schema' => null,
    ] );
}

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

/**
 * Callback function to populate our JSON field
 */
function get_post_meta_for_api( $object ) {

    $meta = get_post_meta( $object['id'] );

    return [
        'venue'   => $meta['_VenueVenue']   ?: '',
        'address' => $meta['_VenueAddress'] ?: '',
        'city'    => $meta['_VenueCity']    ?: '',
    ];
}

あなたは/wp-json/wp/v2/tribe_venue//wp-json/wp/v2/tribe_venue/{POST_ID}の両方であなたのメタデータを見ることができるはずです

1
Levi Dulstein

REST AP​​Iには、使用できるrest_query_varsフィルタがあります。

function my_allow_meta_query( $valid_vars ) {

    $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value') );

    return $valid_vars;
}

add_filter( 'rest_query_vars', 'my_allow_meta_query' );

これにより、メタフィールドを照会するために次のようなルートを使用することができます。

wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE

もっと複雑な方法もあります。下記のソースリンクをチェックしてください。

ソース: https://1fix.io/blog/2015/07/20/query-vars-wp-api/

0
J.C. Hiatt