Filtrar e listar postagens de uma taxonomia personalizada

Eu tenho uma taxonomia personalizada chamada ‘proprietário’ e tem várias postagens como nomes de proprietários (Usando como uma categoria) para que eu possa filtrar mensagens por taxonomia ‘proprietário’.

Estou tentando fazer uma página de índice de todos os nomes dos proprietários que começa com a letra ‘A’. Pude listar todos os proprietários com o seguinte código.

foreach ( get_terms( 'owner' ) as $o ){ $owner = $o -> name; if($owner[0] === 'A'){ // Coding here... } } 

A questão que enfrento é que eu quero mostrar uma paginação na parte inferior da página porque existem centenas de estrelas de autores com ‘A’.

Solutions Collecting From Web of "Filtrar e listar postagens de uma taxonomia personalizada"

Antes de olhar para a paginação, pelo que recebi na sua pergunta, você só precisa de termos que começam com A Se assim for, você pode usar o parâmetro get_terms em get_terms para obter apenas termos que começa com A Apenas uma nota sobre isso, a operação do parâmetro foi alterada no WordPress V3.7, então você precisará aplicar o seguinte filtro para que isso funcione como esperado ( Crédito para @s_ha_dum, veja sua resposta aqui . NOTA: O código requer PHP 5.4+ )

 add_filter( 'terms_clauses', function ($clauses) { remove_filter( 'term_clauses', __FUNCTION__ ); $pattern = '|(name LIKE )\'%(.+%)\'|'; $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); return $clauses; }); $terms = get_terms( 'ownwer' ['name__like' => 'A'] ); 

Para ordenar uma lista de termos, precisamos:

  • O número da página atual

  • A quantidade total de termos na lista

  • O número total de páginas será

Para obter o número de página da página atual ou qualquer página é fácil. Isso funcionará em todas as páginas, incluindo páginas da frente estáticas e páginas de publicação única

 if ( get_query_var( 'paged' ) ) { $current_page = get_query_var( 'paged' ); } elseif ( get_query_var( 'page' ) ) { $current_page = get_query_var( 'page' ); } else { $current_page = 1; } 

Agora precisamos saber a quantidade total de termos da taxonomia. Aqui podemos usar wp_count_terms() , que usa get_terms() ou use get_terms() si. Lembre-se, se get_terms() o filtro para obter termos por uma letra / nome específico, o filtro será aplicado a esta corrida de get_terms() / wp_count_terms() , bem como estamos fazendo uso de um fechamento

 $terms_count = get_terms( 'owner', ['name__like' => 'A', 'fields' => 'count'] ); 

Agora, temos a quantidade total de termos que combinam nossos critérios. Basta lembrar, se você estiver usando wp_count_terms() , lembre-se de configurar hide_empty como verdadeiro se não precisar include termos vazios. Por padrão, wp_count_terms() define isso como false

Agora podemos calcular nossa quantidade máxima de páginas

 // Set the amount of terms we need to display per page $terms_per_page = 10; // Get the total amount of pages $max_num_pages = $terms_count / $terms_per_page; 

Para obter links de paginação para páginas próximas e anteriores, é realmente fácil. A única coisa que uma function de paginação precisa conhecer de qualquer consulta é a quantidade máxima de páginas, nada mais. Não precisa saber o que deve ser paginado. Então, podemos simplesmente usar as next_posts_link() e previous_posts_link() . Você também pode usar paginate_links() ou mesmo escrever sua própria function para atender às suas necessidades. Basta lembrar de passar $max_num_pages como a quantidade máxima de páginas para a function de paginação

 next_posts_link( 'Next terms', $max_num_pages ); previous_posts_link( 'Previous terms' ); 

A única coisa que ainda precisamos fazer é paginar get_terms() , o que também é realmente fácil. Usaremos o parâmetro de deslocamento para compensar os termos de acordo com a página e o number para obter a quantidade necessária de termos por página

 // Calculate offset $offset = ( $current_page == 1) ? 0 : ( ($current_page - 1) * $terms_per_page ); // Setup our arguments $args = [ 'number' => $terms_per_page, 'offset' => $offset ]; 

Agora podemos juntar tudo

TODOS JUNTOS AGORA

Pouco antes de nós, algumas notas importantes

  • Todo o código não foi testado

  • O código precisa de pelo menos o PHP 5.4, que é a versão mínima absoluta do PHP que você deveria estar executando no momento desta postagem

  • Modifique e rasgue conforme necessário

Aqui está o código, finalmente

 add_filter( 'terms_clauses', function ($clauses) { remove_filter( 'term_clauses', __FUNCTION__ ); $pattern = '|(name LIKE )\'%(.+%)\'|'; $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); return $clauses; }); $taxonomy = 'owner'; $terms_count = get_terms( $taxonomy, ['name__like' => 'A', 'fields' => 'count'] ); if ( $terms_count && !is_wp_error( $terms ) ) { if ( get_query_var( 'paged' ) ) { $current_page = get_query_var( 'paged' ); } elseif ( get_query_var( 'page' ) ) { $current_page = get_query_var( 'page' ); } else { $current_page = 1; } // Set the amount of terms we need to display per page $terms_per_page = 10; // Get the total amount of pages $max_num_pages = $terms_count / $terms_per_page; // Calculate offset $offset = ( $current_page == 1) ? 0 : ( ($current_page - 1) * $terms_per_page ); // Setup our arguments $args = [ 'number' => $terms_per_page, 'offset' => $offset, 'name__like' => 'A' ]; $terms = get_terms( $taxonomy, $args ); // Do what you need to do with $terms next_posts_link( 'Next terms', $max_num_pages ); previous_posts_link( 'Previous terms' ); } 

Se você deseja apenas limitar visualmente o número de nomes exibidos, você pode usar javascript ou jQuery e CSS para paginar os resultados em pedaços menores que os visitantes podem ler. Mas isso não criará páginas reais e distintas.

Vou atualizar esta resposta com um pedaço de código que usei para limitar uma longa lista em X números de itens, que você navega com um link anterior / seguinte, mas também pode facilmente adicionar uma paginação numerada.

Caso contrário, uma pesquisa rápida produziu esse plugin (WordPress), mas não o testei e não tenho certeza sobre a compatibilidade com as versões atuais do WP: http://wordpress.mfields.org/plugins/taxonomy-list-shortcode/ Parece faz exatamente o que você quer (PHP) sob a forma de um shortcode.

Atualização: eu tinha eliminado a maior parte deste código de algum lugar e modificado para atender às minhas necessidades. Na minha aplicação, usei funções para desativar e ativar elementos, etc., que eu revertei aqui em jQuery direto, então, considere que pode haver uma peça ou outra de código personalizado que permaneça lá, que precisará mudar para trabalhar com o seu.

Isso em jQuery:

 var paginate_list = function(items) { var pageSize = items; // How many items per page var numberOfPages = Math.ceil(($('.lists li').length)/pageSize); // I used list items but you can use anything, this counts how many elements in total, and divides by the previous to know how many pages total var pageCounter = $("#current-page"); // I store the current page number in a hidden input value for my particular situation but you can keep track of it anyway else var prev = $('#navigation .key-prev'); var next = $('#navigation .key-next'); // the navigation buttons pageCounter.val(1); // initialize to page 1, also peculiar to my application prev.attr('disable', true); // disable prev button if page 1 if ( numberOfPages < = 1 ) { next.attr('disable', true); // disable next if only 1 page } next.on('click', function () { // calculate the list offset $(".lists li:nth-child(-n+" + ((pageCounter.val() * pageSize) + pageSize) + ")").show(); $(".lists li:nth-child(-n+" + pageCounter.val() * pageSize + ")").hide(); pageCounter.val(Number(pageCounter.val()) + 1); // update page counter if (pageCounter.val() != 1) { prev.attr('disable', false); // enable previous button } if (pageCounter.val() == numberOfPages) { $(this).attr('disable', true); // disable the next button when you reach the end } }); prev.on('click', function () { // the same in reverse pageCounter.val(Number(pageCounter.val()) - 1); $(".lists li").hide(); $(".lists li:nth-child(-n+" + (pageCounter.val() * pageSize) + ")").show(); $(".lists li:nth-child(-n+" + ((pageCounter.val() * pageSize) - pageSize) + ")").hide(); if (pageCounter.val() == 1) { $(this).attr('disable', true); } if (pageCounter.val() < numberOfPages) { next.attr('disable', false); } }); }; 

E funcionaria com listas como esta: