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
- Usar
pre_get_posts
para modificar su consulta principal. Utilice unWP_Query
objeto (método 2) para bucles secundarios en las páginas de la plantilla. - 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:
-
Desea mostrar una lista de publicaciones o publicaciones de tipo de publicación personalizada en una página (usando una plantilla de página)
-
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?
-
Es más intuitivo para un administrador (¿su cliente?): Pueden ver la página en las ‘Páginas’
-
Es mejor agregarlo a los menús (sin la página, tendrían que agregar la URL directamente)
-
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.