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.