Fragen Sie die WP REST API v2 nach mehreren Metaschlüsseln ab

9

Mit v2 der REST-API möchte ich einige Beiträge nach mehreren Metaschlüsseln abfragen . Mit v1 konnte ich die URL wie folgt formatieren &filter[meta_value][month]=12&[meta_value][year]=2015und es funktionierte (nachdem die Metawerte der API zugänglich gemacht wurden).

Mit v2 kann ich dies nur mit den in diesem GitHub-Thread aufgeführten Methoden zum Laufen bringen: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Grundsätzlich wurden die Metafelder mithilfe des rest_query_varsFilters 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 nach einem Meta-Schlüssel filtern wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on.

Es klingt jedoch so, als ob die einzige Möglichkeit zum Filtern nach mehreren Metaschlüsseln darin besteht, einen benutzerdefinierten Filter zu schreiben. Könnte mich jemand in die richtige Richtung weisen?

Trevan Hetzel
quelle

Antworten:

4

Das Hinzufügen eines benutzerdefinierten Endpunkts ist ziemlich einfach.

Ich habe auch die URL so geändert, dass sie eher so 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');
jgraup
quelle
Wie kann ich das vorgestellte Bild an diese Antwort anhängen?
Shinya Koizumi