Algunos antecedentes:
Estoy ejecutando la siguiente consulta en mi file de funciones:
function modify_queries( $query ) { global $wpdb; if ( $query->is_post_type_archive('days') && $query->is_main_query() ) { // Get Days with a date within the archive range $year = substr($query->query_vars['m'],0,4); $month = substr($query->query_vars['m'],4,2); $day = substr($query->query_vars['m'],6,2); if (is_year()) { $startDate = date('U', mktime(0, 0, 0, 1, 1, $year)); $endDate = date('U', mktime(0, 0, 0, 12, 31, $year)); } if (is_month()) { $startDate = date('U', mktime(0, 0, 0, $month, 1, $year)); $endDate = date('U', mktime(0, 0, 0, $month, cal_days_in_month(CAL_GREGORIAN, $month, $year), $year)); } if (is_day()) { $startDate = date('U', mktime(0, 0, 0, $month, $day, $year)); $endDate = date('U', mktime(0, 0, 0, $month, $day, $year)); } $request = "SELECT ID FROM $wpdb->posts, $wpdb->postmeta"; $request .= " WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id"; $request .= " AND post_status='publish' AND post_type='days'"; $request .= " AND $wpdb->postmeta.meta_key = 'dates' AND $wpdb->postmeta.meta_value >= $startDate AND $wpdb->postmeta.meta_value <= $endDate LIMIT 0 , 30"; $postsList = $wpdb->get_results($request,ARRAY_N); if ($postsList) { foreach ($postsList as $thePost) { $thePostList[] = $thePost[0]; } $query->set( 'post__in', $thePostList); $query->set( 'post_type', 'days'); return; } else { return false; } } add_action( 'pre_get_posts', 'modify_queries',1 );
Según tengo entendido, esto debería tomar el resultado de la consulta y simplemente replace la consulta normal por una con los ID devueltos por la consulta SQL. Sin embargo, solo devuelve las 5 publicaciones más recientes de 'días'.
En la actualidad, el file archive.php consiste únicamente en lo siguiente, por lo que podemos descartar cualquier interferencia:
<? while ( have_posts() ) : the_post(); global $post; the_title(); endwhile; ?>
Obtengo las 5 publicaciones de 'días' publicadas más recientemente, y parece ignorar las ID que el filter pre_get_posts debería haberle pasado.
Tengo una ligera sospecha de que parte del problema se relaciona con la configuration de 'post_id' en la consulta principal, en lugar de 'p', pero no parece get ningún resultado con este último.
He buscado, pero no puedo encontrar mucha documentation sobre pre_get_posts aparte de lo útil y beneficioso que es como reemploop de query_posts.
Salida de debugging en vivo en: http://dev.daysoftheyear.com/days/2012/10
Puede encontrar la documentation en el filter pre_get_post
aquí http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
Me parece que el problema es, de hecho, cómo está configurando los post_id que desea recuperar. Si se refiere al enlace anterior, puede ver los diferentes valores que se pueden establecer en el object $query
que se pasa al filter, y post_id
no es uno de ellos, por lo que "funciona" cuando lo establece y "no funciona" cuando configura p
. El último es para una identificación de publicación única, por lo que si solo quisiera 100, usaría $query->set('p', 100)
. Si desea devolver resultados donde el ID de publicación está en una matriz, use $query->set('post__in', array(100, 120))
. Su código SQL simplemente está devolviendo la ID, por lo que en lugar de devolver objects, puede get una matriz directamente: supongo que repetir el título y las líneas print_r
solo están depurando:
// get results as a numeric array $post_ids = $wpdb->get_results($request, ARRAY_N); // pass post id array to $query $query->set( 'post__in', $post_ids );
También puede que no obtenga resultados si hay parameters conflictivos existentes establecidos en la $query
. Puede verificar estos valores con var_dump($query->query_vars)
y establecer cualquiera que pueda estar en conflicto con una cadena vacía, en su caso $query->set( 'm', '' );
Creo que lo he clavado; le dio a 'm' un valor en blanco para detenerlo pensando que era una consulta basada en dates. ¡Gracias! 🙂