Cum se face o interogare meta folosind REST-API în WordPress 4.7+?

30 iun. 2017, 15:11:24
Vizualizări: 35.6K
Voturi: 18

Încerc să filtrez folosind o interogare meta, dar indiferent ce încerc nu reușesc să o fac să funcționeze.

Practic, vreau să folosesc această interogare prin REST API:

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

Am încercat mai multe câmpuri personalizate, dar întotdeauna îmi returnează toate obiectele postării.

În fișierul meu functions.php am adăugat:

function api_allow_meta_query( $valid_vars ) {
    // Adăugăm meta_query la variabilele valide pentru interogare
    $valid_vars = array_merge( $valid_vars, array( 'meta_query') );
    return $valid_vars;
}
add_filter( 'rest_query_vars', 'api_allow_meta_query' );

Am încercat să găsesc documentație despre acest subiect, dar nu am reușit, și majoritatea întrebărilor similare nu sunt pentru WordPress 4.7, deoarece filter[xxx] a fost eliminat.

1
Comentarii

Posibil duplicat al Filtrarea mai multor câmpuri personalizate cu WP REST API 2

bueltge bueltge
2 ian. 2018 15:05:34
Toate răspunsurile la întrebare 3
2
21

Folosește filtrul rest_{CUSTOM_POST_TYPE}_query pentru a adăuga suport pentru meta post în WP Rest API pentru orice tip de postare.

Verifică Gist-ul căutare post după meta post cu REST API.

Cum se folosește?

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

Exemplu

Obține postările ale căror meta post already-visited are valoarea true.

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

Acesta listează DOAR postările ale căror cheie meta already-visited are valoarea true.

Pentru referință Căutare post după meta post cu REST API.

Filtre disponibile

  • rest_post_query
  • rest_page_query
  • rest_attachment_query
5 iun. 2018 13:59:21
Comentarii

Mulțumesc pentru acest lucru! Cred că acesta ar trebui să fie răspunsul acceptat, după părerea mea.

jagershark jagershark
1 oct. 2018 21:04:29

dar despre șirurile de caractere dacă vrem un câmp cu valoare (nu null) - pot prelua câmpurile de latitudine care sunt mai mari decât o anumită valoare filter[meta_key]=latitude&filter[meta_compare]=%3C&filter[meta_value]=34.7 dar am nevoie de un alt câmp șir, așa că vreau să obțin doar cele care au valoare

saber tabatabaee yazdi saber tabatabaee yazdi
20 feb. 2019 16:28:31
1
12

Poți să-ți scrii propriul handler REST pentru interogări personalizate dacă dorești. În cazul tău, interogarea poate fi realizată astfel:

// Înregistrează o rută REST
add_action( 'rest_api_init', function () {
    // Calea către ruta de meta interogare
    register_rest_route( 'tchernitchenko/v2', '/my_meta_query/', array(
            'methods' => 'GET', 
            'callback' => 'custom_meta_query' 
    ) );
});

// Realizează interogarea propriu-zisă și returnează datele
function custom_meta_query(){
    if(isset($_GET['meta_query'])) {
        $query = $_GET['meta_query'];
        // Setează argumentele pe baza parametrilor noștri GET
        $args = array (
            'relation' => $query[0]['relation'],
            array(
                'key' => $query[0]['key'],
                'value' => $query[0]['value'],
                'compare' => '=',
            ),
        );
        // Rulează o interogare personalizată
        $meta_query = new WP_Query($args);
        if($meta_query->have_posts()) {
            // Definește un array gol
            $data = array();
            // Stochează titlul fiecărui post în array
            while($meta_query->have_posts()) {
                $meta_query->the_post();
                $data[] =  get_the_title();
            }
            // Returnează datele
            return $data;
        } else {
            // Dacă nu există postări
            return 'Nu există postări de afișat';
        }
    }
}

Acum, tot ce trebuie să faci este să accesezi:

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]==
30 iun. 2017 16:34:42
Comentarii

Există o modalitate de a extinde această funcționalitate la WooCommerce Legacy API?

Amjad Amjad
16 ian. 2021 01:49:41
9

Următorul cod ar trebui să adauge capabilitatea de interogări multiple meta pentru toate tipurile de postări. Suportă CPT (Custom Post Type - Tipuri Personalizate de Postări) și ACF (Advanced Custom Field - Câmpuri Personalizate Avansate). Codul sursă este disponibil și pe Github.

Adăugați-l în fișierul functions.php

add_action( 'rest_api_init', 'wp_rest_filter_add_filters' );
 /**
  * Adaugă filtrul necesar fiecărui tip de postare
  **/
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 );
    }
}
/**
 * Adaugă parametrul de filtrare
 *
 * @param  array           $args    Argumentele interogării.
 * @param  WP_REST_Request $request Detalii complete despre cerere.
 * @return array $args.
 **/
function wp_rest_filter_add_filter_param( $args, $request ) {
    // Ieși dacă nu este setat niciun parametru de filtrare.
    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, o abordare mai bună ar fi includerea funcției suplimentare ca un plugin separat. Astfel, chiar dacă utilizatorul schimbă tema, apelurile API nu vor fi afectate.

De aceea am dezvoltat un plugin pentru interogări meta în WordPress. Și mai bine, suportă și ACF!

WP REST Filter

După instalare, efectuați o cerere GET în următorul format.

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

Consultați codul sursă al pluginului pe Github.

24 ian. 2018 22:58:04
Comentarii

Plugin frumos, dar sortarea după dată nu funcționează pentru câmpurile de dată ACF!

Advena Advena
30 apr. 2018 13:43:05

Bună Tanckom. Mulțumim pentru mesaj. Poți să ne explici mai detaliat problema? Ce ai încercat? Te rugăm să trimiteți problema pe https://wordpress.org/support/plugin/wp-rest-filter. Echipa noastră de suport te va contacta acolo. Mulțumim.

Jack Song Jack Song
30 apr. 2018 20:43:29

Salut Jack, Am descoperit că URL-ul corect pentru a prelua data din câmpul ACF și a o sorta ascendent sau descendent este următorul: https://domain.com/wp-json/wp/v2/events?filter[meta_key].acf=evt_date&per_page=100&filter[order]=asc

Advena Advena
30 apr. 2018 23:49:44

Super! Mă bucur că plugin-ul nostru a fost de ajutor! :D

Jack Song Jack Song
1 mai 2018 06:53:08

Chiar a fost, continuați cu treaba bună! :)

Advena Advena
1 mai 2018 13:21:13

O singură întrebare, cum aș putea filtra după date în acest format "2018-09-25 19:30:00 GMT+02:00". Date and Time picker pentru ACF nu permite formatul ISO :( Am încercat asta dar fără succes domain.com/wp-json/wp/v2/events?filter[meta_key].acf=date&[meta_value]=2018-09-25

Advena Advena
1 mai 2018 19:50:08

Convertește la ora GMT, yyyy-mm-dd'T'HH:mm:ss , apoi domain.com/wp-json/wp/v2/events?filter[meta_key]=date&[meta_value]=2018-09-25T23:59:59. Cred că ACF salvează datele în format IOS în MySQL, deci ar trebui să funcționeze.

Jack Song Jack Song
2 mai 2018 05:12:42

Din păcate, nu este posibil să obții Data și Ora fără spații cu Add-on-ul pentru ACF "Date and Time Picker" :/ De aceea a trebuit să procedez în acest fel.

Advena Advena
2 mai 2018 18:20:08

Putem ajuta cu asta. Te rugăm să ne trimiți un email cu detaliile problemei la hi@sk8.tech. Voi reveni cât mai curând posibil.

Jack Song Jack Song
3 mai 2018 00:55:13
Arată celelalte 4 comentarii