WP JSON REST API (Ryan McCue) Wie werden Beiträge mit bestimmten Metadaten mit 'AND'-Beziehung abgefragt?

7

Ich verwende die Wp_query-Klasse, um meine Beiträge abzufragen. 15 Beiträge befinden sich in einer Vorlage, die beim Laden der Seite abgerufen wird, und ihre Filterung funktioniert einwandfrei. Infinity-Scroll-Abrufe für andere Posts mithilfe von JSON Restful Services . Der Filter auf der Serverseite funktioniert einwandfrei, aber ich weiß nicht, wie ich die Logik vom Server auf eine ordnungsgemäße Abfrage übertragen soll.

Meta_query-Array, das auf dem Server an Wp_query übergeben wurde:

meta_query

  0 =>  array (size=3)
    'key' => string 'homepage' (length=8)
    'value' => string 'false' (length=5)
    'compare' => string 'NOT EXISTS' (length=10)
  1 => array (size=2)
    'key' => string '_newsml_id' (length=10)
    'compare' => string 'NOT EXISTS' (length=10)
  'relation' => string 'AND' (length=3)

Wie übersetze ich das in die Abfrage? etwas wie:

/ wp-json / posts? filter [meta_query] [key] = homepage, _newsml_id & [meta_query] [compare] = NOTEXISTS

oder

/ wp-json / posts? filter [meta_query] [key] = homepage & filter [meta_query] [key] = _ newsml_id & [meta_query] [compare] = NOTEXISTS

DamianS1987
quelle

Antworten:

9

Es tut mir leid, dass ich meine eigene Frage beantwortet habe, aber es kann auch einigen anderen Entwicklern helfen.

Ich habe diesen zusätzlichen Filter 'json_query_var-meta_query' erstellt, der die erforderlichen Argumente zurückgibt.

function adjustQrry($data){
    $args = array();
    $args['relation'] = 'AND';

    foreach ($data as $key=>$value) {
        if ( 'relation' === $key ) {
            $args['relation'] = $data['relation'];
        }
        if (  substr($key, 0, 3) === 'key' ) {
            $arg_num = substr($key, 3);
            $args[(int)$arg_num]['key'] = $value;
        }
        if (  substr($key, 0, 7) === 'compare' ) {
            $arg_num_comp = substr($key, 7);
            $args[(int)$arg_num_comp]['compare'] = $value;
        }
    }
    return $args;
}

add_filter('json_query_var-meta_query', 'adjustQrry', 10, 1);

Jetzt kann ich JSON so restful aufrufen, um den Wp_query-Posts-Filter nachzuahmen, der sich bereits auf dem Server befindet:

?filter[meta_query][key]=_newsml_categories_newsstream&filter[meta_query][key2]=homepage&filter[meta_query][relation]=AND&filter[meta_query][compare]=NOT%20EXISTS&filter[meta_query][compare2]=NOT%20EXISTS

Ref: https://github.com/WP-API/WP-API/issues/337

DamianS1987
quelle
5
Sie müssen sich nicht für die Beantwortung Ihrer eigenen Frage entschuldigen, das sollten Sie tun, wenn Sie dazu in der Lage sind :)
Ian Dunn
Wie @IanDunn betont, ist die Beantwortung Ihrer eigenen Frage definitiv eine gute Sache. Sie können auch Ihre eigene Antwort akzeptieren, damit andere wissen, dass Sie eine Lösung gefunden haben
Phatskat
0

Was ist mit WP REST API V2? Ich denke, das funktioniert nicht auf v2!

add_filter('json_query_var-meta_query', 'adjustQrry', 10, 1);

sollte es so sein

add_filter('rest_query_vars-meta_query', 'adjustQrry', 10, 1);
Amino
quelle
3
Ich denke, Sie sollten keine neue Frage als Antwort erstellen, sondern als neue Frage. Wie auch immer, ich denke das würde funktionieren: github.com/WP-API/WP-API/issues/2452
Websupporter
@websupporter danke. Ja, das ist auch meine Frage :) Du hast viel geholfen. Danke noch einmal.
Amino