Có cách nào để có được các trường meta được bảo vệ thông qua bất kỳ API WordPress tích hợp sẵn nào không? (xmlrpc, wp-json)


7

WordPress có một số API tích hợp:

theo mặc định, họ không trả về các loại bài đăng tùy chỉnh hoặc các khóa meta được bảo vệ.

Tôi muốn truy cập các trường meta được bảo vệ của một plugin. Tôi đã cố gắng làm theo các ví dụ được đưa ra ở đâyở đây .

Tôi đã quản lý rằng API wp-json sẽ trả về các loại bài đăng tùy chỉnh bằng cách thêm mã này:

/**
 * Add REST API support to an already registered post type.
 */
add_action( 'init', 'my_custom_post_type_rest_support', 25 );

function my_custom_post_type_rest_support() {

  global $wp_post_types;

  // be sure to set this to the name of your post type!
  $post_type_name = 'tribe_venue';

  if( isset( $wp_post_types[ $post_type_name ] ) ) {
      $wp_post_types[$post_type_name]->show_in_rest = true;
      $wp_post_types[$post_type_name]->rest_base = $post_type_name;
      $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller';
  }

  $post_type_name2 = 'tribe_events';

  if( isset( $wp_post_types[ $post_type_name2 ] ) ) {
      $wp_post_types[$post_type_name2]->show_in_rest = true;
      $wp_post_types[$post_type_name2]->rest_base = $post_type_name2;
      $wp_post_types[$post_type_name2]->rest_controller_class = 'WP_REST_Posts_Controller';
  }
}

Nhưng tôi không thể bao gồm các khóa meta được bảo vệ trong phản hồi.

Tôi đã thử đoạn mã sau:

add_filter( 'is_protected_meta', function ( $protected, $key, $type ) {
    if ( $type === 'tribe_venue' && $key === '_VenueVenue' ) {
        return true;
    }
    return $protected;
}, 10, 3 );

add_filter( 'rae_include_protected_meta', '__return_true' );

và mã sau đây:

function custom_rest_api_allowed_public_metadata($allowed_meta_keys){
    $allowed_meta_keys[] = '_VenueVenue';
    $allowed_meta_keys[] = '_VenueAddress';
    $allowed_meta_keys[] = '_VenueCity';
    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

Nhưng không hoạt động.

Có ai biết những gì cần thiết để làm cho các trường được bảo vệ như vậy có thể truy cập được thông qua bất kỳ API nào không? Có một ví dụ làm việc ở bất cứ đâu?


Mục tiêu của bạn là bao gồm chúng với các tuyến mặc định hay chỉ là bất kỳ giải pháp nào như tạo tuyến đường / điểm cuối tùy chỉnh của bạn chỉ cho việc này?
kraftner

Câu trả lời:


1

Đối với tôi, giải pháp đơn giản nhất sẽ là tạo thêm trường trong phản hồi JSON và điền vào đó với meta bài đã chọn:

function create_api_posts_meta_field() {

    // "tribe_venue" is your post type name, 
    // "protected-fields" is a name for new JSON field

    register_rest_field( 'tribe_venue', 'protected-fields', [
        'get_callback' => 'get_post_meta_for_api',
        'schema' => null,
    ] );
}

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

/**
 * Callback function to populate our JSON field
 */
function get_post_meta_for_api( $object ) {

    $meta = get_post_meta( $object['id'] );

    return [
        'venue'   => $meta['_VenueVenue']   ?: '',
        'address' => $meta['_VenueAddress'] ?: '',
        'city'    => $meta['_VenueCity']    ?: '',
    ];
}

Bạn sẽ có thể thấy dữ liệu meta của mình cả trong /wp-json/wp/v2/tribe_venue//wp-json/wp/v2/tribe_venue/{POST_ID}


0

Với API REST, có một rest_query_varsbộ lọc bạn có thể sử dụng:

function my_allow_meta_query( $valid_vars ) {

    $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value') );

    return $valid_vars;
}

add_filter( 'rest_query_vars', 'my_allow_meta_query' );

Điều này cho phép bạn sử dụng một tuyến đường như thế này để truy vấn trường meta:

wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE

Cũng có những cách phức tạp hơn bạn có thể làm điều đó. Kiểm tra các liên kết nguồn dưới đây.

Nguồn: https://1fix.io/blog/2015/07/20/query-vars-wp-api/

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.