WP_Query avanzado con meta_query y orderby
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'

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 oNULL
NO funcionará. Sin embargo, cualquier otra cadena servirá y NO aparecerá en tu SQL cuando usesNOT 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 dearray()
. 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 deposts_per_page
, así que es mejor usarposts_per_page

$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
),
),
);
