Anexando conteúdo com <! - nextpage -> quebrado em 4.4

14

Atualização 2016-01-21

Todos os testes atuais do meu lado estão sendo feitos em novas instalações da 4.4.1 com as seguintes configurações: Plain permalinks Twentysixteen Theme No plugins activated

Se a postagem tiver apenas 1 página (ou seja <!--nextpage-->, não aparecer na postagem), as páginas extras serão anexadas com êxito (mesmo se você anexar várias páginas extras¹).

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

Se a postagem tiver mais de 2 páginas , as páginas extras 404 e o redirecionamento canônico para a página 1 da postagem.

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

<!--nextpage-->

This is page 2

No segundo caso, $wp_query->queried_objectestá vazio quando você acessa as páginas extras. Você precisará desativar o redirecionamento canônico para ver issoremove_filter('template_redirect', 'redirect_canonical');

As duas correções principais a seguir foram tentadas, separadamente e em conjunto, sem alterações no comportamento: https://core.trac.wordpress.org/ticket/35344#comment:16

https://core.trac.wordpress.org/ticket/35344#comment:34

Para facilitar o uso, este é o código com o qual estou testando atualmente:

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1";
    $post->post_content .= $content;
}

add_filter('content_pagination', 'custom_content_two', 10, 2);
function custom_content_two($pages, $post) {
    if ( in_the_loop() && 'post' === $post->post_type ) {
        $content = "This is the extra page v2";

        $pages[] = $content;
    }
    return $pages;
}

add_action('the_post', 'custom_content_three');
function custom_content_three() {
    global $multipage, $numpages, $pages;
    $content = "This is the extra page v3";

    $multipage = 1;
    $numpages++;
    $pages[] = $content;
}

¹Este é o código que usei para testar várias páginas extras em uma única página

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1-1\n<!--nextpage-->\nThis is the extra page v1-2\n<!--nextpage-->\nThis is the extra page v1-3";
    $post->post_content .= $content;
}

Pergunta original

Antes da 4.4, eu era capaz de anexar uma página adicional a uma postagem de mutlipage com o seguinte:

add_action('template_redirect', 'custom_content');
function custom_content() {
    global $post;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));
    $post->post_content .= $content;
}

Com get_option ('custom_content') sendo algo como:

<!--nextpage-->
Hello World

Desde a atualização para 4.4, o código não funcionou; navegar para a página adicional aciona um erro 404 e redirect_canonical os envia de volta ao link permanente da postagem. Desativar redirect_canonical permite visualizar a página extra e o conteúdo adicional está lá, mas ainda aciona um erro 404.

Eu tentei várias soluções alternativas, nenhuma das quais resolve o erro 404, incluindo:

add_action('the_post', 'custom_content');
function custom_content() {
    global $multipage, $numpages, $pages;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $multipage = 1; // ensure post is considered multipage: needed for single page posts
    $numpages++; // increment number of pages
    $pages[] = $content;
}

Também tentei aproveitar o novo filtro content_pagination que foi adicionado no 4.4:

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $pages[] = $content;
    return $pages;
}

Neste ponto, estou sem idéias sobre como restaurar essa funcionalidade e qualquer assistência seria apreciada.

Milamber
fonte
Tudo bem, então eu tenho uma atualização para isso, infelizmente não é positivo. Aparentemente, ele funciona na nova instalação se a extrapágina for a página 2. No entanto, se a página extra for a página 3 (ou superior, ela será quebrada). / pulso
Milamber
1
ENCONTROU O ERRO !!!!! SIM!!!!. Atualizarei minha resposta em breve #
Pieter Goosen

Respostas:

8

ATUALIZAÇÃO 21-01-2016 19:35 SA TIME - BUG ENCONTRADO !!!!! SIM!!!!!!

Finalmente encontrei o bug. Como você afirmou em sua última atualização, a falha só acontece quando $post_contenthá uma <!--nextpage-->tag no conteúdo. Eu testei e confirmei que qualquer outra página após a página depois do <!--nextpage-->retorno de 404 e a página é redirecionada de volta para a primeira página.

Isso ocorre devido às seguintes linhas de código no handle_404()método introduzido na WPclasse no WordPress 4.4

// check for paged content that exceeds the max number of pages
$next = '<!--nextpage-->';
if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {
    $page = trim( $this->query_vars['page'], '/' );
    $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );
}

O que este código faz é, sempre que a <!--nextpage-->tag está situado no post_content, ele retornará a 404 quando qualquer página é acessada, que é anexado depois que o conteúdo através do content_paginationfiltro. Devido ao fato de um 404 ser definido, redirect_canonical()redireciona qualquer página anexada de volta à primeira página

Arquivei um ticket trac sobre esse problema, que você pode conferir aqui

No momento da redação deste documento, ainda não havia nenhum feedback, portanto, verifique regularmente o status do ticket

SOLUÇÃO ATUAL - FEEDBACK A / W TRAC TICKET

Por enquanto, até recebermos comentários e possíveis correções em versões futuras, exclua essas linhas da WPclasse até novo aviso

QUE HORA É ...... É DEBUGGING TIME !!!!!

Eu tive tempo para testar isso completamente. Peguei seu código e testei em:

  • Minha instalação local v4.3

  • Minha instalação local v4.4.0

  • Minha instalação local v4.4.1

  • Conclua a nova instalação local v4.4.1 apenas com a Hello Worldpostagem e a Sample Pagepágina

com meus permalinks definidos como

  • default e

  • Post Name

Aqui está o meu código de teste para criar 4 páginas dentro do meu post de teste.

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        'Hello World Page 2',
        'Hello World Page 3',
        'Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

Eu também testei

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        '<!--nextpage--> Hello World Page 2',
        '<!--nextpage--> Hello World Page 3',
        '<!--nextpage--> Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

para uma boa medida

Em toda e qualquer estrutura de instalação e link permanente, todo o seu código funciona ( exceto o content_paginationque é esperado na v4.3 ).

Também defini Sample Pagecomo uma página inicial estática, mas que falhou na página 2 como conformação ao bug, conforme descrito na minha RESPOSTA ORIGINAL e ** EDIT

Portanto, a conclusão é que isso não tem nada a ver com o bug no núcleo ou com qualquer outro bug no núcleo. Nos comentários, algo está desmarcando o objeto consultado nas páginas de postagem paginadas, e é algo que precisamos depurar. Infelizmente, como esse problema agora está localizado, não posso fornecer soluções exatas.

DEBUGGANDO A QUESTÃO

Você precisa usar o seguinte fluxo de trabalho para depurar o problema

  • Consiga uma quantidade enorme de café com alto teor de cafeína e muito açúcar

  • Faça um backup de você db

  • Baixe e instale os seguintes plug-ins ( não tenho afiliação com nenhum plug-in )

    • Objetos de depuração para depuração normal. Depois de instalado e configurado, repare todos os erros óbvios que podem ser destacados pelo plug-in. Não continue para o próximo ponto principal se tiver bugs óbvios. Corrija-os primeiro

    • Gerenciador de banco de dados que você usará para reparar e limpar seu banco de dados antes de continuar no próximo ponto

  • Limpar todos os caches, navegadores e plugins

  • Desative todos os plugins e limpe todos os caches novamente para uma boa medida. Como esse problema parece um problema de redirecionamento, eu provavelmente desativaria primeiro todos os plug-ins que possam ter algo a ver com o redirecionamento. Pode ser que um plug-in ainda não seja compatível com a v4.4. Verifique se o problema persiste, se persistir, continue para o próximo item, caso contrário, vamos ver isso com mais detalhes

    Comece desativando todos os plug-ins. Você também pode começar desativando os plug-ins que podem ser óbvios por causar o problema. Teste corretamente sua instalação após a ativação de cada plug-in. O primeiro plugin ativado que causou o problema será o culpado. Nesse caso, entre em contato com o autor do plug-in com os detalhes da depuração. Apenas certifique-se de limpar seus caches após cada ativação de plug-in apenas por uma boa medida

  • Se você chegou a esse ponto, o marcador anterior não resolveu seu problema. O próximo passo deve ser mudar para um tema em pacote para eliminar seu tema como o problema. Mais uma vez, limpe os caches.

  • Se tudo falhar, você terá mais duas opções

    • Exclua .htaccesse deixe o WordPress criar um novo

    • Reinstalar o WordPress

Isso deve resolver seu problema. Caso contrário, é necessário considerar um bug no núcleo do WordPress que pode estar causando o problema.

Espero que isso ajude a pegar o bug

ATUALIZAR

Na verdade, eu deveria ter ligado ao seguinte bilhete trac que parece explicar tudo mais detalhadamente

Patches interessantes e bastante relevantes do ticket trac acima

Não posso testar nada concretamente nesse momento, mas você deve trabalhar com os patches sugeridos e testá-los. O que posso entender é que o mesmo código redirect_canonical()responsável pela paginação de páginas estáticas também é responsável pela paginação em páginas únicas.

RESPOSTA ORIGINAL

Páginas únicas ( como páginas estáticas ) usam get_query_var( 'page' )para paginar. Com o WordPress 4.4 ( e na v4.4.1 ), ocorreu um erro que causa problemas na paginação ao usarget_query_var( 'page' ) para paginação.

Os relatórios de erros atuais, como o ticket trac # 35365 , apenas mencionam as primeiras páginas estáticas que têm problemas com a paginação, mas, como o bug está relacionado get_query_var( 'page' ), eu acho que isso também causaria problemas com a paginação de postagem única que também usa get_query_var( 'page' ).

Você deve tentar os patches conforme descrito nos tickets do trac. Se isso funcionar, você pode aplicar o patch e aguardar a v4.4.2, que terá esse bug corrigido

Pieter Goosen
fonte
1
Espero que este seja o problema do OP, parece muito provável (não é possível investigar isso hoje ;-).
precisa saber é
1
Tentei a correção, também permalinks desabilitados; nenhuma mudança.
Milamber
1
Vou analisar isso assim que tiver tempo. Eu sinto que a resposta está no erro, é apenas para localizá-lo. Espero que você encontre uma solução em breve
Pieter Goosen
2
Verificar o meu update, eu encontrei o bug e também apresentou um relatório de bug
Pieter Goosen
2
Confirmei que todos os três métodos funcionam depois que essas linhas são comentadas :) ticket fechado 35544 a favor do seu
Milamber
4

Observe que há um erro de sintaxe para todos os três exemplos que você forneceu:

add_filter('content_pagination', 'custom_content'), 10, 2);

add_action('the_post', 'custom_content'));

add_action('template_redirect', 'custom_content'));

onde um extra )é adicionado.

Substitua estas linhas para:

add_filter( 'content_pagination', 'custom_content', 10, 2);

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Eu não recomendaria mexer com objetos globais em geral, então acho que seu último exemplo com o content_paginationfiltro é o caminho a seguir aqui.

Você também pode evitar anexar páginas vazias com:

if( ! empty( $content ) )
    $pages[] = $content;

Há também uma falta )aqui:

$content = html_entity_decode(stripslashes(get_option('custom_content'));
Birgire
fonte
1
Meu erro, o extra) foi deixado de copiá-los e colá-los fora da classe em que eles estão com minha implementação real. Eu os removi da operação. Infelizmente, a versão content_pagination também não corrige o erro 404.
Milamber
1
Também está faltando) na linha de conteúdo $ - veja a atualização. @Milamber
birgire
1
Obrigado, consertado. Quaisquer erros de sintaxe que você vê no código operacional são da simplificação para a postagem.
Milamber
2
ok, eu testei isso em uma instalação WP 4.4 de baunilha com o tema Twenty Sixteen e funciona como esperado lá, então acho que pode ser algo mais na sua configuração que está lhe dando o problema. @Milamber
birgire
1
Estranho, eu tentei em 2 ambientes de desenvolvimento diferentes com o Twentyfifteen e ambos tiveram o mesmo resultado. Vou dar uma outra olhada, obrigado @birgire
Milamber