Cum se face o interogare meta folosind REST-API în WordPress 4.7+?
Î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.

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

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

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

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]==

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!
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.

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

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.

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

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

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.

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.
