Paginação do WordPress: um utilitário simples (e por quê)
Ao criar templates para WordPress, você geralmente tem funções de paginação que vêm do próprio aplicativo.
Estes incluem coisas como:
E há algumas outras postagens que oferecem maior granularidade em torno de taxonomias, como get_adjacent_post().
Eu recomendo ler todos os links acima porque eles são úteis se você estiver criando um tema, trabalhando com tipos de postagem personalizados ou simplesmente procurando uma compreensão mais profunda de algumas das tags de modelo comuns.
Se, no entanto, você estiver procurando uma maneira fácil de escrever seu utilitário de paginação do WordPress (para o qual explicarei a lógica momentaneamente), o restante deste post abordará exatamente isso.
Paginação personalizada do WordPress
Primeiro, sempre que você estiver criando um aplicativo da Web para alguém, haverá nuances nas quais a funcionalidade nativa do WordPress pode não funcionar. Talvez não funcione como esperado, não funcione como pretendido ou não atenda às suas necessidades.
Seja qual for o caso, isso não significa que a paginação não possa ser construída para servir aos seus propósitos. Afinal, o núcleo da paginação – especialmente no que se refere à paginação de postagem única – é basicamente isso:
A partir do post atual, veja se existe um post antes dele e veja se existe um post depois dele. Se um dos tipos de postagem existir, forneça um link para ele; caso contrário, não.
A partir daqui, podemos determinar que precisaremos dos seguintes recursos:
- uma maneira de determinar se uma postagem existe atrás da postagem atual,
- uma maneira de determinar se uma postagem existe após a postagem atual,
- uma maneira de recuperar uma determinada postagem,
- uma maneira de obter o permalink para o determinado post.
Eu trabalho para ser muito específico na linguagem acima, no entanto, porque uma postagem que está "atrás" ou "depois" de uma determinada postagem pode não ter um ID menor que o ID da postagem atual.
É simplesmente o primeiro post publicado e pode ser recuperado em qualquer direção, certo?
Então, com isso em mente, isso significa que precisaremos de duas consultas:
- uma consulta para recuperar a postagem por trás da postagem atual,
- uma consulta para recuperar a postagem após a postagem atual.
Para este exemplo, estou assumindo que você tem acesso ao ID da postagem atual por meio da função get_the_ID().
Obter uma postagem por trás da postagem atual
Para fazer isso, precisamos criar uma consulta simples que pegará uma postagem publicada do banco de dados do tipo de postagem especificada e que esteja relacionada à posição da postagem atual.
Podemos fazer isso limitando o conjunto de resultados a um, ordenando os resultados em ordem decrescente e comparando o valor do ID do post:
<?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') );
Isso retornará uma série de resultados que veremos como gerenciar daqui a pouco.
Obter a postagem após a postagem atual
Para o próximo post, escrevemos uma consulta semelhante. Mas, em vez disso, procuramos o próximo valor maior e à frente do ID atual:
<?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') );
Agora precisamos de algumas funções para determinar se as postagens existem. Podemos fazer isso com o array results que é retornado.
Verificar se existe uma postagem
Observe que no exemplo a seguir, a função aceita o array de resultados e simplesmente retorna se houver um post anterior. Os resultados que são passados para esta função devem ser da consulta de postagem anterior acima.
Em segundo lugar, observe que é privado. Você pode querer tornar o seu público dependendo de como deseja construir seus modelos.
<?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]);
}
E então, para o próximo post, parece o mesmo, mas lembre-se de que os resultados que estão sendo passados para essa função são de uma 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]);
}
E, finalmente, podemos usar essas funções condicionais para obter o permalink.
Obtenha o link
Lembre-se, a maneira como você usa essa função pode variar do que a implementação que forneci. Portanto, se você não precisar que seja privado, altere sua visibilidade e use-o em seu modelo conforme necessário.
<?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);
}
Por fim, observe que esta função aceita os resultados que você passa para ela de qualquer consulta e recuperará a propriedade ID do primeiro índice dos resultados.
Isso ocorre porque os resultados são limitados a um e se baseiam no uso das funções condicionais. Ou seja, você pode fazer algo como:
- se houver uma próxima postagem, obtenha o link da próxima postagem
Mas sua implementação pode variar.
Por que isso é necessário?
Pode não ser necessário. Isso é tudo: se você estiver usando o WordPress pronto para uso com muito pouca personalização ou extensão e não precisar fazer nada além do que ele pode fornecer, talvez você não precise disso.
Se, por outro lado, você está procurando uma maneira de introduzir a funcionalidade de paginação do WordPress em uma única postagem, essa é uma maneira de fazer isso que pode lidar adequadamente com o caso de postagens que são de um tipo de postagem específico, mas não t têm IDs sequenciais (e que funcionam apenas com um status de postagem de publicação).