WordPress pre_get_posts no funciona

Algunos antecedentes:

  • Estoy intentando replace la consulta principal pnetworkingeterminada para las templates de file y devolver un subset de un tipo de publicación personalizado ('días') donde los valores meta frente a las 'dates' key se encuentran entre un cierto valor
  • El tipo de publicación personalizada 'días' tiene un campo variable personalizado de 'dates' que almacena filas de bases de datos individuales en la tabla wp_postmeta estándar para cada date asociada con esa publicación, almacenadas en formatting Epoch ('U')
  • Estoy bastante seguro de que la consulta SQL está funcionando correctamente; las identificaciones de publicación que devuelve parecen ser correctas en cada caso para el intervalo de dates consultado.

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! 🙂