WP_Query avanzado con meta_query y orderby

4 feb 2016, 23:03:25
Vistas: 30.9K
Votos: 2

Me pregunto si alguien puede ayudarme con esta consulta un poco compleja con ACF.

Hasta ahora tengo lo siguiente que debería mostrar:

  • Páginas,

  • Artículos de Noticias,

  • Artículos de Acerca de y

  • Artículos de Participación.

  • Mostrar: solo 4.

Solo mostrar si: la Clave Meta/ACF 'home_page' está seleccionada como 'yes'

Y

Ordenar por el valor numérico de la Clave Meta/ACF 'home_order' es decir 1,2,3 primero, segundo, tercero etc

      $args = array(
                // Tipos de post a mostrar
                'post_type' => array( 'page', 'news-articles', 'about-articles','involved-articles' ),
                'showposts' => 4,
                'meta_query' => array(
                         'relation' => 'AND',
                             array(
                                                 'key' => 'home_page',
                                                 'value' => 'yes',
                                                 'compare' => 'IN',
                             ),
                                         array(
                                                 'orderby'   => 'meta_value_num',
                                                 'meta_key'  => 'home_order',
                            ),
                 ),
            );

Creo que algo está fallando con el 'compare' y 'relation'

0
Todas las respuestas a la pregunta 2
2

Realmente deberías leer la documentación sobre meta_query

Esto es lo que está permitido en un meta_query

  • key (string) - Clave del campo personalizado.

  • value (string|array) - Valor del campo personalizado. Puede ser un array solo cuando compare es 'IN', 'NOT IN', 'BETWEEN', o 'NOT BETWEEN'. No es necesario especificar un valor cuando se usan las comparaciones 'EXISTS' o 'NOT EXISTS' en WordPress 3.9 y versiones posteriores.

    (Nota: Debido al bug #23268, se requiere un valor para que las comparaciones NOT EXISTS funcionen correctamente antes de la versión 3.9. Debes proporcionar alguna cadena para el parámetro value. Una cadena vacía o NULL NO funcionará. Sin embargo, cualquier otra cadena servirá y NO aparecerá en tu SQL cuando uses NOT EXISTS. ¿Necesitas inspiración? ¿Qué tal 'bug #23268'?)

  • compare (string) - Operador para comparar. Los valores posibles son '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' y 'NOT EXISTS'. El valor por defecto es '='.

  • type (string) - Tipo de campo personalizado. Los valores posibles son 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. El valor por defecto es 'CHAR'.

El ordenamiento debe realizarse fuera de tu meta_query. Puedes probar lo siguiente:

$args = [
    'post_type'      => ['page', 'news-articles', 'about-articles', 'involved-articles'],
    'posts_per_page' => 4,
    'meta_key'       => 'home_order',
    'orderby'        => 'meta_value_num',
    'meta_query'     => [
        [
            'key'      => 'home_page',
            'value'    => 'yes',
        ]
    ],
];

Notas adicionales:

  • A partir de PHP 5.4 puedes usar la sintaxis corta de arrays, es decir, puedes usar [] en lugar de array(). Si todavía usas cualquier versión anterior a PHP 5.6, deberías considerar seriamente actualizar.

  • showposts se ha dejado de usar en favor de posts_per_page, así que es mejor usar posts_per_page

5 feb 2016 06:36:14
Comentarios

@birgire gracias, sí, fue un error rápido de copiar y pegar ;-)

Pieter Goosen Pieter Goosen
5 feb 2016 08:46:44

Sí, leí todo eso pero no pude entenderlo completamente para ponerlo en el orden correcto. Lo resolví con algo de ayuda de otro lugar con lo siguiente..

user4630 user4630
5 feb 2016 11:52:48
1
$args = array(
                'posts_per_page'    => 4, // Número de posts a mostrar
                'post_type' => array( 'page', 'news-articles', 'about-gorilla','involved' ), // Tipos de post a incluir
                'orderby'   => 'meta_value_num', // Ordenar por valor numérico de meta campo
                'meta_key'  => 'home_order', // Meta clave para el orden
                'order'     => 'ASC', // Orden ascendente
                'meta_query'    => array( // Consulta de metadatos
                    array(
                        'key'       => 'home_page', // Clave del meta campo
                        'value'     => 'yes', // Valor a comparar
                        'compare'   => '=', // Operador de comparación
                    ),
                ),
            );
5 feb 2016 11:53:32
Comentarios

Por favor, no pegues el código como respuesta, añade algunas explicaciones, gracias. Pero esto se ve casi igual que la respuesta de @PieterGoosen, aparte del orden. Ten en cuenta que compare es = por defecto

birgire birgire
5 feb 2016 11:59:02