web-dev-qa-db-ja.com

Jetpack JSON APIを通してカスタム投稿メタを取得しようとしています

私はJetpack for Wordpressを使って私の イベント カスタム投稿タイプのJSON APIを作成しています。

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100

ただし、このCPTには、 カスタムメタボックスおよびWordpress用フィールドによって生成されたポストメタフィールドもかなり含まれています 。これらのフィールドには、次のようなものがあります。

  • _ecmb_supporting_bands
  • _ecmb_tickets_avail
  • _ecmb_event_agelim

そしてデフォルトではこれらのフィールドはJSON APIによって返されません...私は以下のようなクエリを実行しようとしました:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key='_ecmb_supporting_bands'

またはメタキーを引用符なしで囲む:https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=_ecmb_supporting_bands

残念ながらこれはうまくいきません。 JSONレスポンスでこれらのカスタムメタフィールドを返す方法を誰かが知っていますか?

4
Jody Heavener

ドキュメントから:

によると - JetPack JSON APIドキュメント

デフォルトでは、保護されていないキーである限り、すべてのメタデータキーがAPIで許可されています。 _で始まるメタデータキーはデフォルトで保護されています。ただし、保護されたメタデータキーは、各操作に応じてedit_post_meta(編集および表示に使用される)、add_post_metaおよびdelete_post_meta機能を使用してユーザーがアクセスおよび編集できます。キーが保護されている場合でも、特定のメタデータキーが任意のユーザーによってアクセスされるように特別にホワイトリストに登録できるようにするフィルタrest_api_allowed_public_metadataも追加しました。

だからrest_api_allowed_public_metadataフィルタはあなたが探しているものです。

ソースコードから:

JetPackのソースコードをチェックすると、この部分が見つかります。

    function is_metadata_public( $key ) {
            if ( empty( $key ) )
                    return false;

            // whitelist of post types that can be accessed
            if ( in_array( $key, apply_filters( 'rest_api_allowed_public_metadata', array() ) ) )
                    return true;

            return false;
    }

ファイルclass.json-api-endpoints.php内。

このrest_api_allowed_public_metadataフィルタの実装方法についてはallow_bbpress_public_metadata()関数 here をチェックすることもできます。

例:

これはあなたの場合の同様の例です。

/**
 * Whitelist protected meta keys
 *
 * @param array $allowed_meta_keys 
 * @return array $allowed_meta_keys 
 */
function custom_rest_api_allowed_public_metadata( $allowed_meta_keys )
{
    // only run for REST API requests
    if ( ! defined( 'REST_API_REQUEST' ) || ! REST_API_REQUEST )
        return $allowed_meta_keys;

    $allowed_meta_keys[] = '_ecmb_supporting_bands';
    $allowed_meta_keys[] = '_ecmb_tickets_avail';
    $allowed_meta_keys[] = '_ecmb_event_agelim';

    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

jSONの出力は次のようになります。

"metadata":[{"id":"196711","key":"_ecmb_event_agelim","value":"18"},
            {"id":"196709","key":"_ecmb_supporting_bands","value":"The Rolling Stones"}, 
            {"id":"196710","key":"_ecmb_tickets_avail","value":"5500"}]
3
birgire

@birgire返信に加えて、フィルタコードをどこかに置くのは難しいかもしれません。

  • テーマの "functions.php"ファイルの下に置くと、テーマの更新によってコードが上書きされる可能性があります。
  • 単にフィルタを追加するためのプラグインを書くことは多くのファズです

これが私がしたことがあなたがそれを失うことを心配する必要なしにあなたがWordpress管理者パネル内にあなたのカスタムアクションとフィルターを書くことを可能にする次のプラグインを使うことだった理由です。 http://wordpress.org/plugins/add-actions-and-filters/ /。

私はあなたと同じ問題を抱えていました、そして今フィルタを含めた後にそれは魅力のように働きます。