Plantillas de archivo personalizadas: una breve guía
Siempre que trabaje con plantillas de archivo en WordPress, las publicaciones generalmente se enumeran por fecha en orden descendente. Es decir, las publicaciones más recientes se enumeran en la parte superior y luego continúa desde allí.
Últimamente, he estado trabajando en algunos proyectos que se integran con API de terceros. Estas API devuelven fechas, a veces dos fechas, una fecha de inicio y una fecha de finalización, para un evento determinado y los clientes desean usar esa información para enumerar publicaciones en lugar de la fecha de la publicación. Es decir, quieren plantillas de archivo personalizadas.
No es demasiado difícil hacer esto, pero antes de hacerlo, creo que es importante brindar información general sobre cómo se construye el proyecto para que haya un poco más de contexto sobre por qué, digamos, se necesita una consulta personalizada y por qué puede o puede no es necesario buscar en pre_get_posts.
Sin embargo, comenzaré con un TL; DR primero. De esa manera, puedes hacerte una idea antes de leer todo.
Plantillas de archivo personalizadas
Entonces, el TL; DR detrás de todo esto es este:
- la información de fecha proporcionada por la API de terceros se mantiene en la tabla de metadatos de la publicación,
- la clave es la fecha de inicio y el valor es la fecha real,
- Ordeno el contenido en orden descendente y por el valor meta.
La paginación puede ser un problema, y si usa un tipo de publicación personalizada, necesitará algunos parámetros adicionales, pero esa es la idea general.
Ahora para toda la configuración.
Tipos de publicaciones personalizadas
Cuando se trata de interactuar con API de terceros, soy un gran admirador de los tipos de publicaciones personalizadas porque tiendo a pensar en ellos como un híbrido entre modelos y vistas.
- El componente del modelo incluye todo lo que está relacionado tangencialmente y se puede escribir en la base de datos. Esto significa cualquier información de taxonomía o metadatos de publicaciones.
- El componente de vista generalmente es cualquier cosa que se incluye en la plantilla que puede aprovechar cualquier etiqueta de plantilla preexistente, es cualquier cosa que deba crearse y que también lea información de la base de datos.
Para esta publicación, usaré acme-event como el tipo de publicación personalizada.
Publicar metadatos
Establecí las fechas en los metadatos de la publicación en lugar de en la publicación en sí porque si algo va a suceder en el futuro y los datos se establecen en el registro de la publicación en sí, WordPress lo tratará como una publicación programada que no está publicada. .
En cambio, prefiero publicar la publicación y luego cambiar la forma en que se muestran los metadatos en la plantilla.
Paginación
WordPress hace una distinción sutil con la paginación en su base de código. Es decir, la variable de consulta para sitios sin una página de inicio estática usa paged y el caso contrario usa page.
Esto importa cuando estás construyendo los argumentos para la consulta a la que llegaré en un momento.
Solo páginas de archivo
Recuerde que siempre que esté introduciendo la paginación, solo querrá cambiar la consulta siempre que esté en la página de archivo real.
Esto significa que no le importan los casos cuando se encuentra en el área administrativa de WordPress y no desea modificar la consulta de archivos de tipo de publicación no personalizados. Con ese fin, querrá asegurarse de que está configurando la variable de consulta correctamente en la devolución de llamada pre_get_posts.
Tenga en cuenta que puedo mostrar una función sobre cómo hacer esto, pero debido a cómo escribimos código en WordPress, es decir, algunos escriben código de procedimiento, otros escriben código orientado a objetos, simplemente lo mostraré en código de procedimiento.
Reuniéndolo todo
Primero, construiré la consulta:
<?php
$eventQuery = new WP_Query([
'post_type' => 'acme-events',
'post_status' => 'publish',
'orderby' => 'meta_value',
'order' => 'desc',
'meta_key' => 'acme-event-start-date-time',
'posts_per_archive_page' => 5,
'paged' => get_query_var('paged')? get_query_var('paged'): 1
]);
Tenga en cuenta que en el código anterior hay un argumento para paginado. Hablaré sobre el código para esto momentáneamente.
Luego, la plantilla incluirá cualquier información que elija mostrar. Elijo no compartir el código de mi plantilla en esta publicación porque es irrelevante para la gran idea que tenemos entre manos.
Además, tienes todo lo que necesitas para mostrar el contenido.
A continuación, configuraré la paginación. Primero, necesito hacer esto usando el gancho pre_get_posts para asegurarme de que se establece la variable de consulta adecuada :
<?php
add_action('pre_get_posts', 'setCustomQueryVariable');
public function setCustomQueryVariable($query)
{
if (is_admin() || !is_archive()) {
return;
}
if ($query->is_archive('acme-events')) {
set_query_var('posts_per_page', 5);
}
}
Luego implementaré la paginación usando la consulta personalizada:
<?php
<a class="next page-numbers" href="<?php echo esc_attr(get_next_posts_page_link($eventQuery->max_num_pages)); ?>">
Next Page
</a>
<a class="prev page-numbers" href="<?php echo esc_attr(get_previous_posts_page_link()); ?>">
Previous Page
</a>
Y después de eso, restableceré la variable global $post usando wp_reset_postdata() en caso de que se necesite usar algo de la publicación original.
<?php wp_reset_postdata(); ?>
De todos modos, esto generalmente se considera una buena limpieza cada vez que utiliza una consulta personalizada.
Enlaces útiles
A continuación hay una lista de funciones, páginas y referencias que pueden resultarle útiles en relación con el código anterior o cualquier trabajo futuro que pueda realizar.
- WP_Query
- Paginación
- pre_get_posts
- get_query_var
- set_query_var
- get_next_posts_page_link
- get_previous_posts_page_link
- actualización_post_meta
- wp_reset_postdata
- El código completo en este post.
Si ha estado trabajando con WordPress durante mucho tiempo, algunos de estos pueden parecer redundantes. En otros casos, puede parecer nuevo, o puede arrojar luz sobre áreas de las API de WordPress que no sabías que existen (al menos ese fue mi caso).
¿Por qué molestarse con todo esto?
Esto puede parecer una publicación larga para una tarea aparentemente simple, pero la información está un poco dispersa por toda la web en lo que respecta a hacer algo como esto.
Así que quería intentar reunirlo todo con explicaciones, código de ejemplo y enlaces a páginas que pueden ser de interés dependiendo de cómo se realice la implementación.
Después de todo, muchos de nosotros estamos usando WordPress más allá de la gestión básica de contenido en este momento, pero eso no significa que no debamos aprovechar sus funciones y API integradas cuando sea posible.
