web-dev-qa-db-fra.com

Comment faire une méta requête en utilisant l'API REST dans WordPress 4.7+?

J'essaye de filtrer par une méta-requête mais peu importe ce que j'essaie, je ne peux pas le faire fonctionner.

En gros, je veux cette requête via l'API restante:

wp-json/wp/v2/books?meta_query[relation]=OR&meta_query[0][key]=arkivera&meta_query[0][value]=1&meta_query[0][compare]==

J'ai essayé plusieurs champs personnalisés différents, mais il retournera toujours tous les objets post.

Dans mon fichier de fonctions, j'ai ajouté:

function api_allow_meta_query( $valid_vars ) {

  $valid_vars = array_merge( $valid_vars, array( 'meta_query') );
  return $valid_vars;
}
add_filter( 'rest_query_vars', 'api_allow_meta_query' );

J'ai essayé de terminer la documentation à ce sujet mais je n'ai pas pu, et la plupart des questions similaires ne concernent pas wordpress 4.7, car le filtre [xxx] est supprimé.

6
Tchernitchenko

Vous pouvez écrire votre propre gestionnaire REST pour des requêtes personnalisées si vous le souhaitez. Dans votre cas, la requête peut être effectuée ainsi:

// Register a REST route
add_action( 'rest_api_init', function () {
    //Path to meta query route
    register_rest_route( 'tchernitchenko/v2', '/my_meta_query/', array(
            'methods' => 'GET', 
            'callback' => 'custom_meta_query' 
    ) );
});

// Do the actual query and return the data
function custom_meta_query(){
    if(isset($_GET['meta_query'])) {
        $query = $_GET['meta_query'];
        // Set the arguments based on our get parameters
        $args = array (
            'relation' => $query[0]['relation'],
            array(
                'key' => $query[0]['key'],
                'value' => $query[0]['value'],
                'compare' => '=',
            ),
        );
        // Run a custom query
        $meta_query = new WP_Query($args);
        if($meta_query->have_posts()) {
            //Define and empty array
            $data = array();
            // Store each post's title in the array
            while($meta_query->have_posts()) {
                $meta_query->the_post();
                $data[] =  get_the_title();
            }
            // Return the data
            return $data;
        } else {
            // If there is no post
            return 'No post to show';
        }
    }
}

Il ne vous reste plus qu'à accéder à:

wp-json/tchernitchenko/v2/my_meta_query?meta_query[relation]=OR&meta_query[0][key]=arkivera&meta_query[0][value]=1&meta_query[0][compare]==
5
Jack Johansson

Le code suivant devrait ajouter plusieurs fonctionnalités de méta-requêtes à tous vos types de publication. Il prend en charge CPT (type de message personnalisé) et ACF (champ personnalisé avancé). Le code source est également disponible sur Github .

Ajoutez-le à votre function.php

add_action( 'rest_api_init', 'wp_rest_filter_add_filters' );
 /**
  * Add the necessary filter to each post type
  **/
function wp_rest_filter_add_filters() {
    foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
        add_filter( 'rest_' . $post_type->name . '_query', 'wp_rest_filter_add_filter_param', 10, 2 );
    }
}
/**
 * Add the filter parameter
 *
 * @param  array           $args    The query arguments.
 * @param  WP_REST_Request $request Full details about the request.
 * @return array $args.
 **/
function wp_rest_filter_add_filter_param( $args, $request ) {
    // Bail out if no filter parameter is set.
    if ( empty( $request['filter'] ) || ! is_array( $request['filter'] ) ) {
        return $args;
    }
    $filter = $request['filter'];
    if ( isset( $filter['posts_per_page'] ) && ( (int) $filter['posts_per_page'] >= 1 && (int) $filter['posts_per_page'] <= 100 ) ) {
        $args['posts_per_page'] = $filter['posts_per_page'];
    }
    global $wp;
    $vars = apply_filters( 'rest_query_vars', $wp->public_query_vars );
    function allow_meta_query( $valid_vars )
    {
        $valid_vars = array_merge( $valid_vars, array( 'meta_query', 'meta_key', 'meta_value', 'meta_compare' ) );
        return $valid_vars;
    }
    $vars = allow_meta_query( $vars );

    foreach ( $vars as $var ) {
        if ( isset( $filter[ $var ] ) ) {
            $args[ $var ] = $filter[ $var ];
        }
    }
    return $args;
}

IMHO, un meilleur moyen d'inclure la fonction supplémentaire en tant que plugin séparé. Ainsi, même lorsque l'utilisateur change de thème, vos appels d'API ne seront pas affectés.

J'ai donc développé un plugin pour méta-requête dans WordPress. Mieux encore, il prend également en charge ACF!

WP REST Filtre

Après l’installation, il suffit de faire une requêteGETau format suivant.

https://domain.com/wp-json/acf/v3/customposttype?filter[meta_key]=acfkey&filter[meta_value]=acfvalue

Découvrez le code source du plugin depuis Github .

3
Jack Song

Utilisez le filtre rest_ {CUSTOM_POST_TYPE} _query pour ajouter la prise en charge des méta-publications dans WP API Reste pour tout type de publication.

Consultez le Gist recherche poste par poste méta avec rest API .

Comment utiliser?

http://example.org/wp-json/wp/v2/post?meta_key=<my_meta_key>&meta_value=<my_meta_value>

Exemple

Obtenir les messages qui post meta already-visited valeur est true.

http://example.org/wp-json/wp/v2/post?meta_key=already-visited&meta_value=true

Elle répertorie UNIQUEMENT les publications pour lesquelles la clé méta already-visited a la valeur true.

Pour référence Recherche poste par poste meta with rest api .

Filtres disponibles

  • rest_post_query
  • rest_page_query
  • rest_attachment_query
2
maheshwaghmare