it-swarm.com.de

Wie mache ich eine Meta-Abfrage mit der REST-API in WordPress 4.7+?

Ich versuche nach einer Meta-Abfrage zu filtern, aber egal was ich versuche, ich kann es nicht zum Laufen bringen.

Grundsätzlich möchte ich diese Abfrage über die 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]==

Ich habe verschiedene benutzerdefinierte Felder ausprobiert, aber es werden immer alle Post-Objekte zurückgegeben.

In meiner Funktionsdatei habe ich hinzugefügt:

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' );

Ich habe versucht, einige Dokumentationen zu diesem Thema fertigzustellen, konnte dies aber nicht. Die meisten ähnlichen Fragen gelten nicht für WordPress 4.7, da Filter [xxx] entfernt wurde.

6
Tchernitchenko

Sie können Ihren eigenen REST -Handler für benutzerdefinierte Abfragen schreiben, wenn Sie möchten. In Ihrem Fall kann die Abfrage folgendermaßen ausgeführt werden:

// 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';
        }
    }
}

Jetzt müssen Sie nur noch auf Folgendes zugreifen:

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

Der folgende Code sollte allen Ihren Beitragstypen mehrere Metaabfragen hinzufügen. Es unterstützt CPT (Custom Post Type) und ACF (Advanced Custom Field). Quellcode auch verfügbar auf Github .

Fügen Sie es Ihrer function.php hinzu

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;
}

Meiner Meinung nach wäre eine bessere Möglichkeit, die Zusatzfunktion als separates Plugin einzuschließen. Selbst wenn der Benutzer das Thema ändert, sind Ihre API-Aufrufe nicht betroffen.

Deshalb habe ich ein Plugin für die Meta-Abfrage in WordPress entwickelt. Besser noch, es unterstützt auch ACF!

WP REST Filter

Führen Sie nach der Installation einfach eineGET-Anforderung im folgenden Format aus.

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

Checkt den Quellcode des Plugins aus Github .

3
Jack Song

Verwenden Sie filter rest_ {CUSTOM_POST_TYPE} _query , um die Post-Meta-Unterstützung in WP Rest API für einen beliebigen Post-Typ hinzuzufügen.

Überprüfen Sie die Gist Suche Post für Post Meta mit Rest API .

Wie benutzt man?

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

Beispiel

Erhalten Sie Beiträge, deren Post-Meta-Wert already-visitedtrue ist.

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

Es werden NUR die Posts aufgelistet, deren Post-Metaschlüssel already-visited den Wert true hat.

Als Referenz Suche Post für Post Meta mit Rest API .

Verfügbare Filter

  • rest_post_query
  • rest_page_query
  • rest_attachment_query
2
maheshwaghmare