WordPress a plusieurs API intégrées dans:
par défaut, ils ne renvoient pas de types de messages personnalisés ni de clés méta protégées.
Je veux accéder aux méta-champs protégés d'un plugin. J'ai essayé de suivre les exemples donnés ici et ici .
J'ai réussi à faire en sorte que l'API wp-json renvoie des types de publication personnalisés en ajoutant ce code:
/**
* 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';
}
}
Mais je n'ai pas pu inclure de clé méta protégée dans la réponse.
J'ai essayé le code suivant:
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' );
et le code suivant:
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' );
mais ni fonctionne.
Est-ce que quelqu'un sait ce qui est nécessaire pour rendre de tels champs protégés accessibles via l'une des API? Y a-t-il un exemple de travail quelque part?
Pour moi, la solution la plus simple serait de créer un champ supplémentaire dans la réponse JSON et de le renseigner avec les méta-publications sélectionnées:
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'] ?: '',
];
}
Vous devriez pouvoir voir vos métadonnées à la fois dans /wp-json/wp/v2/tribe_venue/
et /wp-json/wp/v2/tribe_venue/{POST_ID}
Avec l'API REST, il existe un filtre rest_query_vars
que vous pouvez utiliser:
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' );
Cela vous permet d'utiliser un itinéraire comme celui-ci pour interroger un champ méta:
wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE
Il y a aussi des façons plus complexes de le faire. Consultez le lien source ci-dessous.