Tengo el siguiente wp_query:
$args = array(
'post_type' => 'news',
'orderby' => 'meta_key',
'order' => 'ASC',
'meta_key'=>'custom_author_name',
'post_per_page'=>-1
);
$query = new WP_Query($args);
echo $query->found_posts;
echo = 10 resultados porque solo hay 10 news
publicaciones con a meta_key = custom_author_name
. Pero hay cientos de news
publicaciones que no tienen una fila post_meta con esa meta_key específica. Tenga en cuenta que no hay meta_query involucrado. No se asigna meta_value, porque solo intento ordenar las publicaciones por meta_key, y no filtrar por meta_value.
¿No debería ordenar por seleccionar todas las publicaciones? y solo ordenarlos?
Si es así, ¿por qué se filtra el resultado? Si no se encuentra la meta_key, ¿por qué no usar una cadena vacía o una coincidencia?
¿Si no, porque no?
Si ingreso una meta_key en cada publicación de noticias (incluso si es una cadena vacía), obtengo el resultado esperado. Pero eso parece una gran cantidad de filas de tablas que no necesitan estar allí.
fuente
'orderby' => 'meta_value'
, cambió el orden, pero no tenía nada que ver con el metacampo real.Intenté aplicar la respuesta de @Manny Fleurmond y, al igual que @Jake, no pude hacerlo funcionar incluso después de corregir el error tipográfico que
'orderby' => 'meta_key'
debería ser'orderby' => 'meta_value'
. (Y para completar, hay que'posts_per_page'
no'post_per_page'
, pero que no afecta a la cuestión está examinando.)Si observa la consulta SQL realmente generada por la respuesta de @Manny Fleurmond (después de corregir los errores tipográficos), esto es lo que obtiene:
Esto ilustra la forma en que WP analiza los vars de consulta: está creando una tabla para cada cláusula meta_query, luego descubre cómo unirlos y por qué ordenarlos. El orden funcionaría bien si solo usara una sola cláusula con
'compare' => 'EXISTS'
, pero unir la segunda'compare' => 'NOT EXISTS'
cláusula con OR (como debemos) arruina el orden. El resultado es que LEFT JOIN se usa para unir tanto la primera cláusula / tabla como la segunda cláusula / tabla, y la forma en que WP reúne todo significa que la tabla creada usando en'compare' => 'EXISTS'
realidad se llena con meta_valores de CUALQUIER campo personalizado, no solo el'custom_author_name'
campo en el que estamos interesados. Así que creo que ordenar por esa cláusula / tabla solo dará los resultados deseados si el post_type particular de 'noticias' solo tiene un campo personalizado único.La solución que funcionó para mi situación fue ordenar por la otra cláusula / tabla, la NO EXISTENTE. Parece contradictorio, lo sé, pero debido a la forma en que WP analiza los vars de consulta, es en esta tabla donde
meta_value
se completa solo el campo personalizado que buscamos.(La única forma en que descubrí esto fue ejecutando el equivalente de esta consulta para mi caso:
Todo lo que he hecho es cambiar las columnas que se muestran y eliminar la cláusula GROUP BY. Esto luego me mostró lo que estaba sucediendo: que la columna postmeta.meta_value estaba obteniendo valores de todas las meta_keys, mientras que la columna mt1.meta_value estaba obteniendo solo meta_valores del campo personalizado de noticias).
La solución
Como dice @Manny Fleurmond, es la primera cláusula que se usa para el pedido, por lo que la respuesta es simplemente cambiar las cláusulas, dando esto:
Alternativamente, puede hacer que las cláusulas sean matrices asociativas y se ordenen por la clave correspondiente, de esta manera:
fuente
custom_author_name
está configurada y luego desactivada, esometa_key
responderáEXISTS
y el efecto será que esas burbujas aparecerán junto a las publicaciones que sí tienencustom_author_name
. En mi caso, tengo una casilla de verificación, así que estoy usando en"value" => "1"
lugar deEXISTS
, pero las cadenas necesitarán un enfoque diferente.Así es como funciona.
Si desea hacerlo sin agregar filas de la tabla, tendrá que hacer dos consultas. Uno con la meta_key que tiene los resultados limitados, y el otro que obtiene la lista completa; luego use PHP para comparar los dos resultados de la consulta (posiblemente eliminando los resultados de meta_key de la otra consulta para eliminar duplicados, o lo que tenga sentido en su configuración).
fuente
Desafortunadamente, no es así como
WP_Query
funciona. Tan pronto como agregue ese componente "meta", habrá creado una especie de filtro. Volcado$query->request
y verás lo que quiero decir.En segundo lugar,
WP_Query
no admite el pedido por una meta clave en absoluto. Se puede pedir por un meta valor para una clave particular, pero no por la propia llave. Nuevamente, volcar la consulta para ver a qué me refiero. Notarás que los componentes de "pedido" desaparecen si lo intentas.La forma más limpia de hacer que esto funcione, en mi opinión, es un par de filtros cortos:
fuente