Cách nhận meta bài đăng tùy chỉnh bằng API REST


9

Tôi đang cố gắng tạo API REST cho trang web wordpress của mình, được sử dụng cho danh sách cơ sở bằng cách sử dụng plugin quản lý công việc wordpress.

Tôi đã đăng ký bài đăng tùy chỉnh của mình, các nguyên tắc phân loại trong \ plugins \ rest-api \ plugin.php.

API bên dưới cung cấp cho tôi tất cả các danh sách với phản hồi mặc định.

http: // localhost / sports / wp-json / wp / v2 / danh sách công việc /

Tôi muốn thêm meta bài đăng trong phản hồi JSON bằng mã dưới đây.

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

Sử dụng mã ở trên tôi có thể thêm "phone" làm phản hồi REST nhưng tôi luôn nhận được phone = false trong phản hồi. Nó không hiển thị dữ liệu chính xác từ bảng wp_postmeta.

Tôi đã theo các liên kết được đề cập dưới đây để tham khảo.

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

Cắm chi tiết. 1. Trình quản lý công việc WP 2. rest-api

Bất kỳ trợ giúp sẽ thực sự hữu ích.


Bạn thấy "sai" ở đâu? Bạn đã kiểm tra những gì thực sự xảy ra trên "dây" với các công cụ mạng của trình duyệt chưa?
Đánh dấu Kaplun

Xin chào tôi đang nhận được trong JSON như là một phản ứng.
Hari Soni

Tôi đang sử dụng chrome plugin postman để nhấn dịch vụ. Tôi không sử dụng bất kỳ loại xác thực. Đây là một yêu cầu API đơn giản mà không có bất kỳ dữ liệu nào trong phần yêu cầu.
Hari Soni

Sau đó, làm thế nào để bạn biết rằng bạn thực sự kích hoạt bài viết đúng? bạn thậm chí có nhận được cuộc gọi lại đó không?
Đánh dấu Kaplun

Tôi chưa quen với PHP và wordpress. Tôi đang làm việc với JAVA trong một thời gian dài. Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể kiểm tra xem chức năng của tôi có được gọi hay không? Tôi đã cố in đối tượng bài nhưng không thể thấy giá trị ..
Hari Soni

Câu trả lời:


5

$posttrong hàm gọi lại là một mảng, không phải là một đối tượng. Vì vậy, bạn không thể sử dụng $post->id. Thay đổi nó $post['id']và nó sẽ hoạt động:

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

Tôi khuyên bạn nên thay đổi _phonethành phone_numberhoặc một cái gì đó khác mà không có tiền tố gạch dưới. Bởi vì _thường được sử dụng với các khóa meta riêng tư. Hãy thử thêm một trường tùy chỉnh có khóa meta với _tiền tố trực tiếp vào bài đăng của bạn, bạn sẽ thấy ý tôi là gì.


16

API WP có một rest_prepare_postbộ lọc (hoặc rest_prepare_CPTnếu bạn đang làm việc với các bài đăng tùy chỉnh) mà bạn có thể sử dụng để sửa đổi phản hồi JSON. Trong trường hợp của bạn nó sẽ được 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 );

Sử dụng cùng một bộ lọc, bạn cũng có thể xóa các trường / dữ liệu khỏi phản hồi và thực hiện mọi thao tác xử lý dữ liệu.


+1 vì đây có thể là một cách tốt hơn so với việc cố gắng nhận từng thông tin trong các yêu cầu khác nhau như OP dường như làm.
Đánh dấu Kaplun

Giải pháp này hoạt động hoàn hảo với tôi
Asif

2

Chỉ cần thêm phương thức này vào 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

Đây là một ví dụ 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.