Mirando el código de widgets del core de WordPress me he encontrado con un parámetro para WP_Query que no conocía y que, en estos momentos, no está documentado. Se trata de no_found_rows. He estado buscando información y he encontrado poca pero suficiente para convencerme de implementarlo en todos los querys en los que no voy a utilizar ningún tipo de paginación, por ejemplo, en los widgets de posts recientes o de posts relacionados. Veamos que hace y como se utiliza.

¿Qué hace?

Según he podido leer, WordPress utiliza por defecto SQL_CALC_FOUND_ROWS para calcular el número de filas (lease posts) que coinciden con los criterios de un determinado query aunque sólo se quieran obtener unos pocos resultados. Esto es imprescindible para construir listados paginados pero si no vamos a utilizar paginación podemos suprimir ese cálculo y mejorar la velocidad de los queries. Y eso es precisamente lo que conseguimos si pasamos no_found_rows => true a WP_Query. En webs pequeñas no tendrá un gran impacto, yo diría que imperceptible, pero puede suponer una mejora importante en webs con tráfico intenso y miles de registros en la base de datos.

Esto NO afecta a get_posts() ya que esta función pone no_found_rows en true dese WP 3.1; lo cual es bastante lógico pues con get_posts() ni siquiera hay forma de acceder a $wp_query->found_posts y no se puede utilizar para construir listados paginados.

¿Cómo se utiliza?

El parámetro no_found_rows es tipo lógico y admite valores true o false. Si es true se suprime SQL_CALC_FOUND_ROWS. Por ejemplo:

$args = array(
  'post_type'           => 'post',
  'posts_per_page'      => 5,
  'no_found_rows'       => true
);

$query = new WP_Query( $args );

Happy querying!!