Intereting Posts
Как отредактировать ссылку «<- старше» на странице архива в теме Blankslate? wordpress – добавьте настраиваемый раздел admin с полями для имени, адреса, города, состояния и загрузки фотографий wp_schedule_event необходимо отключить повторение плагина Альтернативные строки и столбцы каждые X сообщений Сохранить что-то в глобальном var в add_filter Как можно использовать сайт WordPress за внутренней сетью? Добавить второе меню в тему, которая поддерживает только 1 меню WP_Query: исключить скрытые продукты из списка продуктов WooCommerce Можно ли клонировать WP в другой каталог на том же сервере? Создание короткого кода WordPress с переменной Нет сообщений в категории <plugin-list-category-post> WP the_posts () на single-cars.php Получить ссылку категории WordPress – изображение href для домашнего меню nav не работает Создайте обычную страницу с сообщением Как узнать, может ли плагин использоваться с моей темой

Есть ли способ получить защищенные метаполя через любой из доступных встроенных API WordPress? (xmlrpc, wp-json)

В WordPress реализовано несколько API:

  • XML-RPC
  • API REST

по умолчанию они не возвращают пользовательские типы сообщений или защищенные мета-ключи.

Я хочу получить доступ к защищенным мета-полям плагина. Я попытался следовать приведенным здесь и здесь примерам.

Я действительно справился с тем, что wp-json API вернет пользовательские типы сообщений, добавив этот код:

/** * 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'; } } 

Но я не смог включить защищенные мета-ключи в ответ.

Я попробовал следующий код:

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

и следующий код:

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

но не работает.

Кто-нибудь знает, что нужно, чтобы сделать такие защищенные поля доступными через любой из API? Есть ли какой-нибудь рабочий пример?

В REST API есть фильтр rest_query_vars вы можете использовать:

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

Это позволяет использовать такой маршрут для запроса мета-поля:

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

Есть и более сложные способы, которыми вы можете это сделать. Проверьте ссылку на источник ниже.

Источник: https://1fix.io/blog/2015/07/20/query-vars-wp-api/

Для меня самым простым решением было бы создание дополнительного поля в ответе JSON и заполнение его выбранной метатемой сообщений:

 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'] ?: '', ]; } 

Вы должны увидеть свои метаданные как в /wp-json/wp/v2/tribe_venue/ и в /wp-json/wp/v2/tribe_venue/{POST_ID}