Saltar al contenido

Wordpress – Cuándo usar WP_query (), query_posts () y pre_get_posts

Te damos la bienvenida a proyecto on line, ahora encontrarás la solucíon a lo que estabas buscando.

Solución:

Tienes razón al decir:

Nunca usar query_posts ya no

pre_get_posts

pre_get_posts es un filtro, para alterar alguna consulta. Se usa con mayor frecuencia para modificar solo la ‘consulta principal’:

add_action('pre_get_posts','wpse50761_alter_query');
function wpse50761_alter_query($query)

      if( $query->is_main_query() )
        //Do something to main query
      

(También comprobaría que is_admin() devoluciones false – aunque esto puede ser redundante). La consulta principal aparece en sus plantillas como:

if( have_posts() ):
    while( have_posts() ): the_post();
       //The loop
    endwhile;
endif;

Si alguna vez siente la necesidad de editar este bucle, use pre_get_posts. es decir, si tiene la tentación de utilizar query_posts() – usar pre_get_posts en lugar de.

WP_Query

La consulta principal es una instancia importante de WP_Query object. WordPress lo usa para decidir qué plantilla usar, por ejemplo, y todos los argumentos que se pasan a la URL (por ejemplo, la paginación) se canalizan a esa instancia del WP_Query objeto.

Para bucles secundarios (por ejemplo, en barras laterales o listas de ‘publicaciones relacionadas’), querrá crear su propia instancia separada del WP_Query objeto. P.ej

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

Aviso wp_reset_postdata(); – esto se debe a que el bucle secundario anulará el global $post variable que identifica la ‘publicación actual’. Esto esencialmente restablece eso al $post estamos en.

get_posts ()

Esto es esencialmente un contenedor para una instancia separada de un WP_Query objeto. Esto devuelve un array de objetos de publicación. Los métodos utilizados en el ciclo anterior ya no están disponibles para usted. Esto no es un ‘bucle’, simplemente un array del objeto de publicación.

    5, 'offset'=> 1, 'category' => 1 ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?>
  • ">

En respuesta a sus preguntas

  1. Usar pre_get_posts para modificar su consulta principal. Utilice un WP_Query objeto (método 2) para bucles secundarios en las páginas de la plantilla.
  2. Si desea modificar la consulta del bucle principal, utilice pre_get_posts.

Hay dos contextos diferentes para los bucles:

  • principal bucle que ocurre según la solicitud de URL y se procesa antes de que se carguen las plantillas
  • secundario bucles que suceden de cualquier otra manera, llamados desde archivos de plantilla o de otra manera

Problema con query_posts() es que es un bucle secundario que intenta ser el principal y falla estrepitosamente. Por lo tanto, olvídese de que existe.

Para modificar el bucle principal

  • no use query_posts()
  • usar pre_get_posts filtrar con $query->is_main_query() cheque
  • usar alternativamente request filtro (un poco demasiado áspero, por lo que arriba es mejor)

Para ejecutar el bucle secundario

Usar new WP_Query o get_posts() que son bastante intercambiables (la última es una envoltura delgada para la primera).

Limpiar

Usar wp_reset_query() si usaste query_posts() o metido en global $wp_query directamente, por lo que casi nunca lo necesitará.

Usar wp_reset_postdata() si usaste the_post() o setup_postdata() o enredado con global $post y necesita restaurar el estado inicial de las cosas relacionadas con la publicación.

Hay escenarios legítimos para usar query_posts($query), por ejemplo:

  1. Desea mostrar una lista de publicaciones o publicaciones de tipo de publicación personalizada en una página (usando una plantilla de página)

  2. Quieres que la paginación de esas publicaciones funcione

Ahora, ¿por qué querría mostrarlo en una página en lugar de usar una plantilla de archivo?

  1. Es más intuitivo para un administrador (¿su cliente?): Pueden ver la página en las ‘Páginas’

  2. Es mejor agregarlo a los menús (sin la página, tendrían que agregar la URL directamente)

  3. Si desea mostrar contenido adicional (texto, miniatura de publicación o cualquier metacontenido personalizado) en la plantilla, puede obtenerlo fácilmente de la página (y todo tiene más sentido para el cliente también). Vea si usó una plantilla de archivo, necesitaría codificar el contenido adicional o usar, por ejemplo, opciones de tema / complemento (lo que lo hace menos intuitivo para el cliente)

Aquí hay un código de ejemplo simplificado (que estaría en la plantilla de su página, por ejemplo, page-page-of-posts.php):

/**
 * Template Name: Page of Posts
 */

while(have_posts())  // original main loop - page content
  the_post();
  the_title(); // title of the page
  the_content(); // content of the page
  // etc...


// now we display list of our custom-post-type posts

// first obtain pagination parametres
$paged = 1;
if(get_query_var('paged')) 
  $paged = get_query_var('paged');
 elseif(get_query_var('page')) 
  $paged = get_query_var('page');


// query posts and replace the main query (page) with this one (so the pagination works)
query_posts(array('post_type' => 'my_post_type', 'post_status' => 'publish', 'paged' => $paged));

// pagination
next_posts_link();
previous_posts_link();

// loop
while(have_posts()) 
  the_post();
  the_title(); // your custom-post-type post's title
  the_content(); // // your custom-post-type post's content


wp_reset_query(); // sets the main query (global $wp_query) to the original page query (it obtains it from global $wp_the_query variable) and resets the post data

// So, now we can display the page-related content again (if we wish so)
while(have_posts())  // original main loop - page content
  the_post();
  the_title(); // title of the page
  the_content(); // content of the page
  // etc...

Ahora, para que quede perfectamente claro, podríamos evitar usar query_posts() aquí también y usa WP_Query en su lugar – así:

// ...

global $wp_query;
$wp_query = new WP_Query(array('your query vars here')); // sets the new custom query as a main query

// your custom-post-type loop here

wp_reset_query();

// ...

Pero, ¿por qué haríamos eso cuando tenemos una función tan agradable disponible para ello?

Comentarios y calificaciones

Nos encantaría que puedieras compartir este escrito si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *