web-dev-qa-db-fra.com

Existe-t-il un moyen d'obtenir des méta-champs protégés via l'une des API WordPress intégrées disponibles? (xmlrpc, wp-json)

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?

7
samy

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}

1
Levi Dulstein

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.

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

0
J.C. Hiatt