it-swarm.com.de

Abfrage WP REST API v2 mit mehreren Metaschlüsseln

Unter Verwendung von v2 der REST -API möchte ich einige Posts mit mehreren Metaschlüsseln abfragen. Mit v1 konnte ich die URL wie &filter[meta_value][month]=12&[meta_value][year]=2015 formatieren und es funktionierte (nachdem ich die Meta-Werte der API zur Verfügung gestellt hatte).

Jetzt mit v2 kann ich dies nur mithilfe der in diesem GitHub-Thread aufgelisteten Methoden zum Laufen bringen: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Grundsätzlich werden die Metafelder mit dem rest_query_vars-Filter wie folgt hinzugefügt:

add_filter( 'rest_query_vars', 'flux_allow_meta_query' ); function flux_allow_meta_query( $valid_vars ) { $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value', 'meta_compare' ) ); return $valid_vars; }

Damit kann ich mit einer URL wie wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on nach one meta key filtern.

Es hört sich jedoch so an, als ob der einzige Weg, nach mehreren Metaschlüsseln zu filtern, darin besteht, einen benutzerdefinierten Filter zu schreiben. Könnte mich jemand in die richtige Richtung weisen?

9
Trevan Hetzel

Das Hinzufügen eines benutzerdefinierten Endpunkts ist ziemlich einfach.

Ich habe auch die URL geändert, damit sie aussieht

http://example.com/wp-json/namespace/v2/posts?filter[meta_value][month]=12&filter[meta_value][year]=2015

function wp_json_namespace_v2__init()
{

    // create json-api endpoint

    add_action('rest_api_init', function () {

        // http://example.com/wp-json/namespace/v2/posts?filter[meta_value][month]=12&filter[meta_value][year]=2015

        register_rest_route('namespace/v2', '/posts', array (
            'methods'             => 'GET',
            'callback'            => 'wp_json_namespace_v2__posts',
            'permission_callback' => function (WP_REST_Request $request) {
                return true;
            }
        ));
    });

    // handle the request

    function wp_json_namespace_v2__posts($request)
    {
        // json-api params

        $parameters = $request->get_query_params();

        // default search args

        $args = array(
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'numberposts'    => -1,
            // limit to only ids
            // 'fields'      => 'ids', 
        );

        // check the query and add valid items

        if (isset($parameters['filter']['meta_value'])) {
            foreach ($parameters['filter']['meta_value'] as $key => $value) {
                switch ($key) {

                    case 'month':
                        if (is_numeric($value))
                            $args['monthnum'] = $value;
                        break;

                    case 'year':
                        if (is_numeric($value))
                            $args['year'] = $value;
                        break;
                }
            }
        }

        // run query

        $posts = get_posts($args);

        // return results

        $data = array(
            'success' => true,
            'request' => $parameters,
            'count' => count($posts),
            'posts' => $posts,
        );

        return new WP_REST_Response($data, 200);
    }

    flush_rewrite_rules(true); // FIXME: <------- DONT LEAVE ME HERE
}

add_action('init', 'wp_json_namespace_v2__init');
4
jgraup