WP REST API orderby meta_value

3 minutos de lectura

avatar de usuario
daniel macfarland

Debe poder ordenar los resultados de una consulta de publicación personalizada de API REST por un valor meta.

Tener dificultad para hacerlo.

He hecho que mi tipo de publicación esté disponible para la API REST y puedo ordenar por fecha, título, etc.

Pero cuando pruebo el Post Meta no funciona.

He agregado el siguiente código para intentar habilitar la funcionalidad, pero por defecto ordena por fecha.

function my_add_meta_vars ($current_vars) {
  $current_vars = array_merge ($current_vars, array('meta_key', 'meta_value'));
  return $current_vars;
}
add_filter ('query_vars', 'my_add_meta_vars');
add_filter ('rest_query_vars', 'my_add_meta_vars');

Mi consulta de API REST es

mysite.com/wp-json/wp/v2/hh_equipment?filter[orderby]=meta_value_num&meta_key=equipment_price&order=desc

he probado siguiendo las instrucciones aquí en vano.

Ejecuté WordPress 4.8 e intenté probar en 4.7 sin éxito

avatar de usuario
Oksana Romániv

Lo tengo funcionando con el rest_' . $post_type . '_collection_params filtrar y rest_' . $post_type . '_query filtre así (cambie $post_type al slug de tipo de publicación necesario):

// Add meta your meta field to the allowed values of the REST API orderby parameter
add_filter(
    'rest_' . $post_type . '_collection_params',
    function( $params ) {
        $params['orderby']['enum'][] = 'YOUR_META_KEY';
        return $params;
    },
    10,
    1
);

// Manipulate query
add_filter(
    'rest_' . $post_type . '_query',
    function ( $args, $request ) {
        $order_by = $request->get_param( 'orderby' );
        if ( isset( $order_by ) && 'YOUR_META_KEY' === $order_by ) {
            $args['meta_key'] = $order_by;
            $args['orderby']  = 'meta_value'; // user 'meta_value_num' for numerical fields
        }
        return $args;
    },
    10,
    2
);

El primer filtro agrega su metacampo a los valores posibles del ordeby parámetros, ya que la API REST predeterminada solo admite: autor, fecha, id, incluir, modificado, padre, relevancia, slug, include_slugs, título (verifique el ordeby param en el manual de la API REST de WP)

El segundo filtro le permite manipular la consulta que devuelve los resultados cuando tiene su clave meta dentro del orderby. Aquí tenemos que restablecer orderby a ‘meta_value’ o ‘meta_value_num’ (lea más sobre esto en Descripción de la clase de consulta WP) y establezca la clave meta en su clave de campo personalizado.

avatar de usuario
Gnanasekaran Loganathan

Consulte el método a continuación, modifiqué las rutas existentes para agregar una nueva entrada de argumentos que valida el meta_key valores que están permitidos. Tampoco es necesario modificar las variables de consulta restantes de esta manera.

add_filter('rest_endpoints', function ($routes) {
    // I'm modifying multiple types here, you won't need the loop if you're just doing posts
    foreach (['some', 'types'] as $type) {
        if (!($route =& $routes['/wp/v2/' . $type])) {
            continue;
        }

        // Allow ordering by my meta value
        $route[0]['args']['orderby']['enum'][] = 'meta_value_num';

        // Allow only the meta keys that I want
        $route[0]['args']['meta_key'] = array(
            'description'       => 'The meta key to query.',
            'type'              => 'string',
            'enum'              => ['my_meta_key', 'another key'],
            'validate_callback' => 'rest_validate_request_arg',
        );
    }

    return $routes;
});

ÁRBITRO: https://github.com/WP-API/WP-API/issues/2308

  • tambien tenia que agregar esto Enlace para que funcione. $type = 'custom_post_type'; add_filter('rest_' . $type . '_query', function ($args, $request) { if ($key = $request->get_param('meta_key')) { $args['meta_key'] = $key; } return $args; }, 10, 2);

    –Daniel McFarland

    29 de junio de 2017 a las 12:25


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad