Estoy trabajando en una plantilla de página de término de taxonomía personalizada donde queremos que los elementos que están conectados al término estén ordenados por una fecha de publicación (campo de fecha personalizado), y si hay varios elementos en el mismo día (formateados como AAAA-MM- DD) para luego ordenarlos por título y, finalmente, ordenar por título si el campo personalizado no se ha completado (elementos más antiguos).
Entonces, lo intenté de cientos de maneras diferentes con un WP_query y devuelve la mayoría de los resultados como los quiero, pero en este caso solo devuelve los elementos que tienen la meta_key de publishing_date. Todos los demás elementos se ignoran y no se muestran. Intenté una meta_query usando una relación de "o" y comparé la fecha de publicación como EXISTS y NOT EXISTS, pero eso arrojó 0 resultados para mí.
Además, el sitio todavía está ejecutando 3.5.2 y no quieren actualizar.
Aquí está mi consulta más reciente que me muestra las publicaciones que tienen el campo personalizado publishing_date mostrado en el orden correcto:
$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => $term->name,
)),
'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));
También intenté usar wpdb y ejecutar una consulta SQL, pero realmente no estoy seguro de cómo lograr lo que quiero hacer. ¡Si alguien pudiera ayudarme, eso sería increíble!
Gracias por adelantado.
fuente
'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),
pero el orden no funciona: \Respuestas:
¡Gracias a todos por su ayuda!
Al final, la consulta a continuación me dio los resultados que deseaba, que era mostrar y ordenar las publicaciones por un campo personalizado de "fecha_publicación" primero, ordenar por fecha y si había varios de la misma fecha (digamos, 4 marcados Junio de 2013), los ordenaría por título. Luego, una vez que se ejecuta a través de todas las publicaciones que tienen la fecha de publicación completa, volverá a recorrer las publicaciones restantes, alfabéticamente por título.
Esto me da los resultados establecidos en la misma consulta y mantiene mi paginación:
fuente
meta_query
en la misma tecla!meta_key
automáticamente no lo incluye ni siquiera conNOT EXISTS
. Realmente espero estar haciendo algo mal.'meta_key' => 'publication_date',
.Pocos años después, el código publicado por CSSGirl no funcionaba para mí porque había algunas publicaciones que no tenían la metaclave o la metaclave estaba vacía, así que esto es lo que tuve que hacer para ordenar todas las publicaciones por fecha y muestre primero los que tienen un valor de metaclave:
fuente
Creo que necesitarías hacer 2 bucles separados. Puede capturar todas las publicaciones encontradas en el primer bucle y excluirlas del bucle secundario con bastante facilidad:
Luego ejecuta tu segundo ciclo.
fuente
echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
¿Hay alguna razón por la que no pueda hacer que exista la metaclave publishing_date para cada publicación solo con un valor vacío?
Entonces, en su
save_post
acción, agregaría / actualizaría la meta clave si el$_POST
valor está vacío o no.Tendría que ejecutar un script de actualización para recorrer sus publicaciones anteriores y agregar la clave con un valor vacío, por ejemplo:
Ejecútelo navegando a http://example.com/wp-admin/?update_old_posts
Entonces puede usar la misma consulta que tiene. Es posible que desee agregar un filtro adicional para permitirle ordenar por diferentes columnas en diferentes direcciones, tendría sentido para mí ordenar por fecha en orden descendente y título en orden ascendente.
fuente
Creé una cláusula where personalizada. Lo probé usando
$wp_query->request
justo antes de mi bucle principal, realmente no conozco bien SQL, pero esto pareció hacer que las cosas funcionen.Alternativamente, podría establecer
compare
a'EXISTS'
y cambiar la línea en add_trending_where a$where .= " OR ($wpdb->postmeta.post_id IS NULL)";
. Entonces solo tendría que cambiar el valor de la clave en un lugar. Nuevamente, repita$wp_query->request
y juegue si quiere entender esto mejor o modificarlo.EDITAR: Acabo de notar que esto no funciona si
meta_key
está configurado en la consulta. Podrías usar$query->set('meta_key', NULL);
si es necesario.EDIT 2: Obtuve esto trabajando con el método anterior. Por alguna razón no fue al principio (tal vez se configuró meta_key ... No lo sé).
fuente