REST APIを使用してカスタム投稿メタを取得する方法


9

ワードプレスジョブマネージャープラグインを使用して施設リストに使用されるワードプレスウェブサイト用のREST APIを作成しようとしています。

\ plugins \ rest-api \ plugin.phpにカスタム投稿の分類を登録しました。

以下のAPIは、デフォルトの応答ですべてのリストを表示します。

http:// localhost / sports / wp-json / wp / v2 / joblisting /

以下のコードを使用して、JSON応答に投稿メタを追加したいと思いました。

function slug_register_phone_number() {
            register_rest_field( 'job_listing',
                'phone',
            array(
                'get_callback' => 'slug_get_phone_number',
                'update_callback' => null,
                'schema' => null,
            )
        );
    }

    function slug_get_phone_number($post, $field_name, $request) {
        return get_post_meta($post->id, '_phone' );
    }
}

上記のコードを使用すると、REST応答として「phone」を追加できますが、応答で常にphone = falseが返されます。wp_postmetaテーブルの正しいデータが表示されていません。

参考までに、以下のリンクをたどりました。

http://v2.wp-api.org/extending/modifying/

詳細を接続します。1. WPジョブマネージャー2. rest-api

どんな助けも本当に役立つでしょう。


「偽」はどこにありますか?ブラウザのネットワークツールを使用して、実際に「ワイヤ」で何が行われているのかを確認しましたか?
Mark Kaplun、2016年

こんにちは私は応答としてJSONを取得しています。
Hari Soni、2016年

私はサービスを打つためにクロムプラグインの郵便配達員を使用しています。私は、いかなる種類の認証も使用していません。リクエスト本文にデータが含まれていない単純なAPIリクエストです。
Hari Soni、2016年

次に、実際に正しい投稿をトリガーしたことをどのようにして知っていますか?あなたもそのコールバックに到達しますか?
Mark Kaplun、2016年

PHPとワードプレスは初めてです。私は長い間JAVAで働いています。関数が呼び出されたかどうかを確認する方法を教えてください。私は..値を見ることができるポストオブジェクトを印刷しようとしたが、ない
ハリ曽爾

回答:


5

$postコールバック関数配列ではなくオブジェクトです。したがって、は使用できません$post->id。それを次のように変更すると$post['id']、機能するはずです。

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post['id'], '_phone', true);
}

アンダースコアの接頭辞を付けずにに変更_phoneすることをお勧めしphone_numberます。_プライベートメタキーでよく使用されるためです。_接頭辞付きのメタキーを持つカスタムフィールドを投稿に直接追加してみてください。私の意図がわかります。


16

WP APIには、JSON応答を変更するために使用できるrest_prepare_postフィルター(またはrest_prepare_CPTカスタム投稿を使用している場合)があります。あなたの場合はそうなりますrest_prepare_joblisting

function filter_joblisting_json( $data, $post, $context ) {
$phone = get_post_meta( $post->ID, '_phone', true );

if( $phone ) {
    $data->data['phone'] = $phone;
}

return $data;
}
add_filter( 'rest_prepare_joblisting', 'filter_joblisting_json', 10, 3 );

同じフィルターを使用して、応答からフィールド/データを削除し、データの操作を行うこともできます。


+1は、OPが行うように異なるリクエストで各情報を取得するよりもおそらく良い方法です。
Mark Kaplun、2016年

このソリューションは、私にとって完璧に機能しました
Asif 2017

2

このメソッドをfunction.phpに追加するだけです

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //get the id of the post object array
 $post_id = $object['id'];

 //return the post meta
 return get_post_meta( $post_id );
}

0

OOPの例を次に示します。

class MetaDataFetcher{

    public function enableAPIroute(){
        add_action ('rest_api_init', array($this, 'doRegisterRoutes'));
    }

    public function doRegisterRoutes(){
        register_rest_route(
            'yournamespace/vXX',
            'fetch-post-meta',
            array(
                'methods'               => array('GET','POST'),
                'callback'              => array($this, 'returnMetaData'),

                //You should have a better auth, or this endpoint will be exposed
                permission_callback'   => function(){return TRUE;}
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST['post-id']))){
            return "ERROR: No post ID";
        }
        $postID = $_REQUEST['post-id'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.