REST API를 사용하여 사용자 정의 포스트 메타를 얻는 방법


9

워드 프레스 작업 관리자 플러그인을 사용하여 시설 목록에 사용되는 워드 프레스 웹 사이트에 대한 REST API를 만들려고합니다.

\ plugins \ rest-api \ plugin.php에 사용자 정의 게시물 인 taxonomies를 등록했습니다.

아래 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

안녕하세요, JSON으로 응답하고 있습니다.
Hari Soni

크롬 플러그인 우편 배달부를 사용하여 서비스를 시작했습니다. 어떤 종류의 인증도 사용하지 않습니다. 요청 본문에 데이터가없는 간단한 API 요청입니다.
Hari Soni

그렇다면 실제로 올바른 게시물을 실행한다는 것을 어떻게 알 수 있습니까? 당신은 그 콜백에 도착합니까?.
Mark Kaplun

저는 PHP와 워드 프레스를 처음 사용합니다. 나는 오랫동안 자바와 협력하고 있습니다. 함수 호출 여부를 확인하는 방법을 알려주시겠습니까? 포스트 오브젝트를 인쇄하려고했지만 값을 볼 수 없었습니다.
Hari Soni

답변:


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 );

동일한 필터를 사용하여 응답에서 필드 / 데이터를 제거하고 데이터를 조작 할 수도 있습니다.


OP가하는 것처럼 각 요청을 다른 요청으로 얻는 것보다 더 나은 방법 일 수 있으므로 +1입니다.
Mark Kaplun

이 솔루션은 나를 위해 완벽하게 작동했습니다
Asif

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.