it-swarm-pt.tech

Corrigindo Paginação com Arquivo de Taxonomia Customizado

Eu tenho tentado criar uma maneira de escrever posts em uma série no meu site. A ideia é que cada postagem possa pertencer a uma série diferente em uma taxonomia personalizada. Eu tenho quase tudo configurado do jeito que eu quero ... com uma exceção.

Registrando a taxonomia

Esta parte está funcionando. Eu coloquei o seguinte código em 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 "Series Labels" ao menu suspenso Posts e me fornece uma caixa "Series Labels" na tela de edição de postagens. Tudo está funcionando e posso marcar posts como parte de uma série perfeitamente. O problema está na próxima seção ...

Listagem de itens na taxonomia

Meu objetivo é permitir que os leitores percorram uma série de postagens de cada vez, começando pelo posto mais antigo e avançando cronologicamente. Isto é diferente de uma página de arquivo típica, porque eu tenho 10 posts por página para meus arquivos, mas eu obviamente quero apenas um post por página para o meu arquivo de série.

Eu criei um arquivo taxonomy-series.php dentro do meu template. E isso 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 entrada" na parte inferior da página. Por enquanto, tudo bem ...

Mas quando você clica em "Next Entry" e vai para a próxima página (http://localhost/wp/series/my-test-series/page/2/) é a) o artigo errado eb) o modelo errado!

No entanto, se eu definir "Mostrar páginas do blog no máximo:" como "1" na página Leitura (normalmente é definido como 10), as coisas funcionam bem. Página 2 exibe o segundo artigo, a página 3 exibe o terceiro, etc.

Então ... o que preciso verificar para forçar a página de arquivo de taxonomia a exibir apenas uma postagem 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);

sem sucesso ... ideias? Dicas? Sugestões?

4
EAMann

Oi @EAMann :

Eu me arrepio sempre que preciso fazer algo criativo com URLs no WordPress, já que o sistema de URL é, na minha opinião, de longe o aspecto mais deselegante do WordPress. Eu sempre sinto que estou tendo que lutar contra o WordPress para fazê-lo fazer o que eu quero, e que o WordPress está ativamente me lutando de volta relacionado 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 acha que é o que você está procurando, tudo bem, por favor, não baixe ninguém, porque eu estou apenas tentando ajudar.

Taxonomia não é um incremento único e não tem meta

Um dos problemas com o que você está tentando fazer é o sistema de taxonomia não possui um único ordenamento de incremento e ele não possui meta . Por exemplo, em uma série de 3 postagens, você pode encontrar termos com IDs de 373, 411 e 492; você pode descobrir que 373 = #1, 411 = #2 e 492 = #3 mas isso é tudo que acontece 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 o seu código será armazenado. É claro que posso escrever código para descobrir tudo e mapeá-los, mas isso fica complicado e não tenho certeza se você obteria muito valor ao tentar descobrir isso em vez de usar uma abordagem diferente.

Atribuir explicitamente seus números de página

Então, a primeira coisa que eu sugiro é que você atribua explicitamente your números de página para cada post em sua série usando pós meta/campos customizados (escolhi o termo installment de page porque fazia mais sentido para mim, mas claramente você poderia usar qualquer termo que se encaixe no seu caso de uso.

Atribuir números de página/parcela tem o benefício de você estar no controle completo e dessa forma você saberá o que consertar quando algo estiver fora de sintonia e se você quiser reordenar você pode fazer isso apenas mudando os números. Eu estou supondo que você terá um metabox de edição para um nome de campo personalizado _installment para selecionar os números de parcelas (e pode até gerenciar/juggle números de parcelas via AJAX se você quiser ser criativo para que você nunca tem páginas fora de sincronia.)

Use $wp_rewrite->add_rule() para atribuir seu URL de forma explícita

Eu não irei a fundo, já que eu sei que você geralmente enlouquece com o WordPress skilz, então vou apenas apontar que $wp_rewrite->add_rule() é a cruz de conseguir que tudo isso funcione. Tudo o resto está apenas fornecendo suporte em torno do resultado dessa função. Use o gancho init para atribuir 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 o gancho parse_query para Traduzir URL para o Query Vars

A segunda metade desta solução usa o gancho parse_query com o qual eu sei que você está familiarizado. Em geral, capturamos o query_vars definido em init e capturamos por meio da regra de URL e os convertemos no que precisamos para consultar posts do WordPress com taxonomy + term manipulando seu series e meta_key + meta_value manipulando a parcela/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 aprofundado muito mais explicando uma resposta, mas é tarde, eu tive muito pouco sono nas últimas 48 horas e, o mais importante, eu sei que você pode descobrir, você provavelmente só precisava de uma coisa que eu mencionei aqui .

Então, eu 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, é o que você precisa, mesmo se quiser manter sua arquitetura original. Boa sorte e ansioso para vê-lo quando o tiver feito e online!

De qualquer forma, espero que isso ajude.

6
MikeSchinkel

Aqui está 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 puder fazer isso funcionar com a taxonomia personalizada, tente com o nativo (categorias, tags) para verificar se o problema está com o próprio código, com a taxonomia ou algo totalmente diferente.

Também não tenho certeza se você perdeu isto ou deixou de fora, mas $ paged não é variável global. Deve ser obtido como get_query_var ('paged')

2
Rarst

Depois de ter enfrentado problema sobre isso e passou tempos difíceis às horas, puxando o cabelo. Eu pesquisei 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. A paginação da página do arquivo de taxonomia realmente personalizada depende de algumas configurações de argumentos de funções relacionadas. Então, eu estou realmente indo aqui compartilhando meus pensamentos de resolver o problema de paginação do arquivo de taxonomia.

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

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

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

(3) Ao consultar dentro de new WP_Query ($args)

i) Se não definido no admin static front page use antes 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 definido em admin front page estática use antes de 'new 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 o parâmetro posts_per_page e paged na matriz de argumentos new WP_Query($arg).

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

(4) Use a função paginate_links( $args ) do Wordpress 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 função paginate_links() produz a listagem ul li com a classe page-numbers. Se você usar a classe bootstrap inject pagination para o ul com a ajuda de javascript ou jquery e uma paginação de Nice será gerada.

Espero que agora você possa desfrutar de paginação no modelo de arquivo de taxonomia sem qualquer problema 404 :-)

0
saifulmasud