Paginação de fixação com o arquivo personalizado de taxonomia

Eu tenho tentado configurar uma maneira de escrever posts em uma série no meu site. A idéia é que cada publicação pode pertencer a uma série diferente em uma taxonomia personalizada. Eu consegui quase tudo configurado da maneira que eu quero … com uma exceção.

Registrando a Taxonomia

Esta parte está funcionando. Abaixei o seguinte código para um plug-in:

function jdm_build_series_taxonomy() { $labels = array( 'name' => _x('Series Labels', 'taxonomy general name'), 'singular_name' => _x('Series Label', 'taxonomy singular name'), 'search_items' => __('Search Series Labels'), 'popular_items' => __('Popular Series Labels'), 'all_items' => __('All Series Labels'), 'parent_item' => __('Parent Series Label'), 'parent_item_colon' => __('Parent Series Label:'), 'edit_item' => __('Edit Series Label'), 'update_item' => __('Update Series Label'), 'add_new_item' => __('Add New Series Label'), 'new_item_name' => __('New Series Label Name') ); register_taxonomy( 'series', 'post', array( 'hierarchical' => true, 'label' => __('Series'), 'labels' => $labels, 'query_var' => true, 'rewrite' => true ) ); } add_action( 'init', 'jdm_build_series_taxonomy', 0 ); 

Isso adiciona “Etiquetas da série” ao menu suspenso Publicações e me dá uma checkbox “Etiquetas de série” na canvas de edição de postagem. Tudo está funcionando, e eu posso marcar postagens como parte de uma série perfeitamente. O problema reside na próxima seção …

Listando itens na Taxonomia

Meu objective é permitir que os leitores caminhem através de uma série de uma publicação por vez, começando com a postagem mais antiga e avançando cronologicamente. Isso é diferente de uma página de arquivo típica, porque eu tenho 10 posts por página para meus arquivos, mas obviamente quero apenas uma publicação por página para o arquivo da série.

Criei um arquivo taxonomy-series.php dentro do meu modelo. E a metade funciona. A primeira página funcionará bem – http://localhost/wp/series/my-test-series/ exibe o primeiro artigo da série com o link “Próxima input” na parte inferior da página. Por enquanto, tudo bem …

Mas quando você clica em “Próxima input” e vai para a próxima página ( http://localhost/wp/series/my-test-series/page/2/ ), é um artigo errado e b) o modelo errado!

No entanto, se eu definir “Páginas do Blog mostram no máximo:” para “1” na página de Leitura (normalmente é definido como 10), então as coisas funcionam bem. A página 2 exibe o segundo artigo, a página 3 exibe o terceiro, etc.

Então … o que preciso verificar novamente para forçar a página do arquivo de taxonomia a exibir apenas uma publicação em cada página? Eu tentei o seguinte:

 $new_query = wp_parse_args( $query_string, array( 'posts_per_page' => 1, 'paged' => $paged ) ); query_posts($new_query); 

e

 query_posts($query_string.'&posts_per_page=1&paged='.$paged); 

em vão … idéias? Dicas? Sugestões?

Solutions Collecting From Web of "Paginação de fixação com o arquivo personalizado de taxonomia"

Oi @EAMann :

Eu me encolerizo sempre que preciso fazer algo criativo com URLs no WordPress, já que o sistema de URL é, na minha opinião, o aspecto mais inelegante do WordPress. Eu sempre sinto que estou tendo que lutar contra o WordPress para que ele faça o que eu quero, e que o WordPress está me lutando ativamente em relação aos URLs. Então com esse abridor …

Pensando em seu problema, vou fazer uma sugestão que não é exatamente o que você pediu. Se você não achar que é o que você está procurando, tudo bem, por favor, não faça votação, porque eu apenas estou tentando ajudar.

Taxonomia não é Incremento único e não tem Meta

Um dos problemas com o que você está tentando fazer é que o sistema de taxonomia não faz um único incremento de pedidos e não possui meta . Por exemplo, em uma série de 3 postagens, você pode encontrar termos com ID s de 373 , 411 e 492 ; você pode descobrir que 373 = #1 , 411 = #2 e 492 = #3 mas isso é tudo acontecido e relativo um ao outro. É como tentar localizar a raiz do seu site WordPress no código do plugin, mas você não sabe quantos níveis de profundidade seu código será armazenado. Claro que pode escrever código para descobrir tudo e mapeá-los, mas isso fica complicado e não tenho certeza de que você obteria muito valor tentando descobrir isso em vez de usar uma abordagem diferente.

Atribua explicitamente os números das suas páginas

Então, a primeira coisa que eu sugeriria é que você atribua explicitamente seus números de página para cada publicação em sua série usando campos pós meta / personalizados (eu escolhi a installment do termo em vez da page porque fazia mais sentido para mim, mas claramente você poderia usar qualquer termo que se adapta ao seu caso de uso.)

A atribuição de números de página / prestação tem o benefício de você estar no controle completo e dessa forma você saberá o que corrigir quando algum tempo sair do whack e se você deseja reorganizar você pode fazê-lo apenas alterando os números. Estou assumindo que você terá uma metabox de edição para um nome de campo personalizado _installment para selecionar os números de plotmento (e até mesmo gerenciar / fazer malabarismos com o AJAX se você quiser ficar criativo para que você nunca tenha páginas fora de sincronia. )

Use $wp_rewrite->add_rule() para Explicitly Assign Your URL

Eu não vou entrar em profundidade, porque eu sei que você geralmente ficou louco WordPress skilz, então eu vou apenas ressaltar que $wp_rewrite->add_rule() é o cruz de conseguir que tudo funcione. Tudo o resto está apenas fornecendo suporte em torno do resultado dessa function. Use o gancho de init atribua sua regra de URL:

 < ?php add_action('init', 'add_series_installment_url'); function add_series_installment_url() { global $wp,$wp_rewrite; $wp->add_query_var('series'); $wp->add_query_var('installment'); $wp_rewrite->add_rule('series/([^/]+)/(installment-\d+)','index.php?series=$matches[1]&installment=$matches[2]','top'); $wp_rewrite->flush_rules(false); // This should really be done in a plugin activation } 

Use parse_query hook no Translate URL to Query Vars

A segunda metade desta solução usa o gancho parse_query que eu conheço, você conhece muito. Em geral, capturamos as query_vars definidas no init e capturadas através da regra de URL e convertem-nas para o que precisamos para consultar postagens do WordPress com taxonomy + term manipulam suas series e meta_key + meta_value gerenciando a plot / página explicitamente atribuída:

 < ?php add_action('parse_query', 'apply_series_installment_to_query'); function apply_series_installment_to_query(&$query) { if (isset($query->query['series']) && isset($query->query['installment']) && preg_match('#^installment-(\d+)$#',$query->query['installment'],$match)) { $query->query_vars['post_type'] = 'post'; $query->query_vars['taxonomy'] = 'series'; $query->query_vars['term'] = $query->query['series']; $query->query_vars['meta_key'] = '_installment'; $query->query_vars['meta_value'] = $match[1]; unset($query->query_vars['series']); // You don't need this unset($query->query_vars['installment']); // or this unset($query->query_vars['name']); // or this } } 

Resumo

Normalmente, eu teria passado muito mais profundamente explicando uma resposta, mas é tarde, eu tive pouco sono nas últimas 48 horas e, o mais importante, eu sei que você consegue entender, você provavelmente precisou de uma coisa que mencionei aqui .

Então espero que você goste desta solução. Mesmo se você não fizer as duas partes com init e parse_query e $wp_rewrite->add_rule() e $query->query_vars[] respectivamente, são o que você precisa mesmo se você quiser ficar com sua arquitetura original. Boa sorte e ansioso para vê-lo quando você tiver feito isso e online!

De qualquer forma, espere que isso ajude.

Aqui é o código que uso para modificar o número de postagens em páginas de arquivo de categorias e tags:

 query_posts( array_merge( array( 'posts_per_page' => 1 ), $wp_query->query ) ); 

Se você não pode fazer isso funcionar com taxonomia personalizada tente com nativo (categorias, tags) para verificar se o problema é com o próprio código, com taxonomia ou algo diferente inteiramente.

Também não tenho certeza se você perdeu isso ou deixou de ser excluído, mas $ paginado não é uma variável global. Ele deve ser buscado como get_query_var (‘paged’)

Uma vez que enfrentei um problema sobre isso e passei tempos difíceis até horas, puxando o cabelo. Eu procurei e não encontrei nenhuma solução específica sobre os tópicos. Eu encontrei o artigo de vários talentos, mas eles não estavam satisfazendo meus problemas. Na verdade, a paginação da página de arquivo de taxonomia personalizada depende de algumas configurações de argumentos de funções relacionadas. Então, estou realmente indo aqui, compartilhando meus pensamentos de resolver o problema da paginação de arquivo de taxonomia.

Cinco coisas que você precisa para a paginação da página de arquivo de taxonomia personalizada funcionando perfeitamente:

(1) Não coloque a chave de parâmetro exclude_from_search como parâmetro do argumento register_post_type ou configure-o 'exclude_from_search' => false . Por padrão, ele é definido como false .

(2) A taxonomia que será usada com o tipo de postagem personalizado define 'taxonomies' => 'custom_taxonomy_name' como parâmetro de argumento register_post_type ou use register_taxonomy_for_object_type() diretamente. As taxonomias personalizadas ainda precisam ser registradas com register_taxonomy() .

(3) Ao consultar no new WP_Query ($args)

i) Se não estiver configurado na static front page administrador static front page use antes do new WP_Query($args)

 $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; 

e use $query = new WP_Query( array( 'paged' => $paged ) );

ii) Se configurado na página frontal estática do administrador use antes de ‘novo WP_Query ($ args)’:

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1; 

e use $query = new WP_Query( array( 'page' => $paged ) );

Lembre-se de usar posts_per_page e paged parameter na new WP_Query($arg) matriz de argumentos new WP_Query($arg) .

Se não for definido a página inicial estática, então você deve usar o parâmetro da page na new WP_Query ($arg) matriz de argumentos new WP_Query ($arg) .

(4) Use a function WordPress paginate_links( $args ) como o exemplo abaixo para renderizar paginação no arquivo de modelo de arquivo.

 < ?php $big = 999999999; // need an unlikely integer echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', or '/paged=%#%', // if using pretty permalink 'current' => max( 1, get_query_var('paged') ), 'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page ?> 

(5) A function paginate_links() exibe a lista ul li com class de page-numbers . Se você usar bootstrap injetar class de pagination para o ul com a ajuda de javascript ou jquery e uma boa paginação extravagante será exibida.

Espero que você possa aproveitar a paginação no modelo de arquivo de taxonomia sem qualquer problema 404 🙂