Paginación de WordPress: una utilidad simple (y por qué)
Al crear plantillas para WordPress, generalmente tiene funciones de paginación que provienen de la propia aplicación.
Estos incluyen cosas como:
Y hay algunas otras publicaciones que le brindan una mayor granularidad en torno a taxonomías como get_adjacent_post().
Recomiendo leer todos los enlaces anteriores porque son útiles si está creando un tema, trabajando con tipos de publicaciones personalizadas o simplemente buscando una comprensión más profunda de algunas de las etiquetas de plantilla comunes.
Sin embargo, si está buscando una manera fácil de escribir su utilidad de paginación de WordPress (cuya razón explicaré momentáneamente), entonces el resto de esta publicación cubrirá exactamente eso.
Paginación personalizada de WordPress
En primer lugar, siempre que esté creando una aplicación web para alguien, es probable que haya matices en los que la funcionalidad nativa de WordPress puede no funcionar. Tal vez no funcione como se esperaba, no funcione según lo previsto o no satisfaga sus necesidades.
Cualquiera que sea el caso, eso no significa que la paginación no pueda construirse para servir a sus propósitos. Después de todo, el núcleo de la paginación, especialmente en lo que se refiere a la paginación de una sola publicación, es básicamente esto:
Desde la publicación actual, vea si existe una publicación anterior y vea si existe una publicación posterior. Si existe algún tipo de publicación, proporcione un enlace a la misma; de lo contrario, no lo hagas.
A partir de aquí, podemos determinar que necesitaremos las siguientes características:
- una forma de determinar si existe una publicación detrás de la publicación actual,
- una forma de determinar si existe una publicación después de la publicación actual,
- una forma de recuperar una publicación dada,
- una forma de obtener el enlace permanente para la publicación dada.
Sin embargo, trabajo para ser muy particular en el lenguaje anterior, porque una publicación que está "detrás" o "después" de una publicación determinada puede no tener una identificación que sea uno menos que la identificación de la publicación actual.
Es simplemente la primera publicación que se publica y se puede recuperar en cualquier dirección, ¿verdad?
Entonces, con eso en mente, esto significa que necesitaremos dos consultas:
- una consulta para recuperar la publicación detrás de la publicación actual,
- una consulta para recuperar la publicación después de la publicación actual.
Para este ejemplo, asumo que tienes acceso al ID de la publicación actual a través de la función get_the_ID().
Obtener una publicación detrás de la publicación actual
Para hacer esto, necesitamos crear una consulta simple que tome una publicación publicada de la base de datos del tipo de publicación especificado, y que esté relacionada con la posición de la publicación actual.
Podemos hacer esto limitando el conjunto de resultados a uno, ordenando los resultados en orden descendente y comparando el valor de la ID de la publicación:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID < (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID DESC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID DESC
LIMIT 1
",
get_the_ID(),
'acme-custom-post-type',
'publish',
'acme-custom-post-type',
'publish') );
Esto devolverá una serie de resultados que veremos cómo administrar en un momento.
Obtener la publicación después de la publicación actual
Para la próxima publicación, escribimos una consulta similar. Pero en su lugar, buscamos el siguiente valor que es más grande y que está por delante de la ID actual:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID > (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC
LIMIT 1
",
get_the_ID(),
'acme-custom-post-type',
'publish',
'acme-custom-post-type',
'publish') );
Ahora necesitamos algunas funciones para determinar si existen publicaciones. Podemos hacer esto con la matriz de resultados que se devuelve.
Comprobar si existe una publicación
Tenga en cuenta que en el siguiente ejemplo, la función acepta la matriz de resultados y simplemente regresa si hay una publicación anterior. Los resultados que se pasan a esta función deben ser de la consulta anterior anterior.
En segundo lugar, tenga en cuenta que es privado. Es posible que desee hacer público el suyo según cómo desee construir sus plantillas.
<?php
/**
* @param array $results the results of the query to determined if there are past posts
*
* @return bool true if there is a previous post; otherwise, false
*/
private function hasPreviousPost($results)
{
return isset($results[0]);
}
Y luego, para la próxima publicación, se ve igual, pero recuerde que los resultados que se pasan a esta función provienen de una consulta diferente.
<?php
/**
* @param array $results the results of the query to determined if there are future posts
*
* @return bool true if there is a next post; otherwise, false
*/
private function hasNextPost($results)
{
return isset($results[0]);
}
Y finalmente, podemos usar estas funciones condicionales para obtener el enlace permanente.
Obtener el enlace
Recuerde, la forma en que usa esta función puede variar de la implementación que he proporcionado. Entonces, si no necesita que sea privado, cambie su visibilidad y utilícelo en su plantilla según sea necesario.
<?php
/**
* @param array $results the results of the array from which to retrieve the post ID
*
* @return string the ID of the post to which we're going to link
*/
private function getPostLink($results)
{
return get_the_permalink($results[0]->ID);
}
Finalmente, tenga en cuenta que esta función acepta los resultados que le pasa desde cualquier consulta y recuperará la propiedad ID del primer índice de los resultados.
Esto se debe a que los resultados se limitan a uno y se basan en su uso de las funciones condicionales. Es decir, puedes hacer algo como:
- si hay una próxima publicación, obtenga el enlace de la próxima publicación
Pero su implementación puede variar.
¿Por qué es esto necesario?
Puede que no sea necesario. Eso es todo: si está utilizando WordPress listo para usar con muy poca personalización o extensión y no necesita hacer nada más allá de lo que puede proporcionar, es posible que no necesite esto.
Si, por otro lado, está buscando una forma de introducir la funcionalidad de paginación de WordPress en una sola publicación, entonces esta es una forma de hacerlo que puede manejar adecuadamente el caso de publicaciones que son de un tipo de publicación específico pero no t tiene identificaciones secuenciales (y que funcionan solo con un estado de publicación).