Aggiunta di contenuti con <! - pagina successiva -> interrotta in 4.4


14

Aggiornamento 21-01-2016

Tutti i test attuali da parte mia vengono eseguiti su nuove installazioni di 4.4.1 con le seguenti impostazioni: Plain permalinks Twentysixteen Theme No plugins activated

Se il post ha solo 1 pagina (cioè <!--nextpage-->non appare nel post), le pagine extra vengono aggiunte correttamente (anche se aggiungi più pagine extra¹).

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

Se il post ha 2+ pagine, le pagine extra 404 e il reindirizzamento canonico alla pagina 1 del post.

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

<!--nextpage-->

This is page 2

Nel secondo caso $wp_query->queried_objectè vuoto dopo aver toccato le pagine extra. Per vedere questo, dovrai disabilitare il reindirizzamento canonicoremove_filter('template_redirect', 'redirect_canonical');

Entrambe le seguenti correzioni principali sono state provate, separatamente e insieme, senza alcun cambiamento nel comportamento: https://core.trac.wordpress.org/ticket/35344#comment:16

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

Per facilità d'uso questo è il codice con cui sto attualmente testando:

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;
}

¹Questo è il codice che ho usato per testare più pagine extra su un singolo post

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;
}

Domanda originale

Prima della 4.4 ero in grado di aggiungere una pagina aggiuntiva a un post di mutlipage con il seguente:

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

Con get_option ('custom_content') è qualcosa del tipo:

<!--nextpage-->
Hello World

Dall'aggiornamento a 4.4 il codice non ha funzionato; la navigazione nella pagina aggiuntiva genera un errore 404 e redirect_canonical li rimanda al permalink del post. La disabilitazione di redirect_canonical mi consente di visualizzare la pagina aggiuntiva e il contenuto aggiuntivo è lì, ma provoca ancora un errore 404.

Ho provato una serie di soluzioni alternative, nessuna delle quali risolve l'errore 404, tra cui:

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;
}

Ho anche provato a sfruttare il nuovo filtro content_pagination che è stato aggiunto in 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;
}

A questo punto non ho idea di come ripristinare questa funzionalità e qualsiasi assistenza sarebbe apprezzata.


Bene, quindi ho un aggiornamento, purtroppo non è positivo. Apparentemente funziona sulla nuova installazione se la pagina aggiuntiva è pagina 2. Tuttavia, se la pagina aggiuntiva è pagina 3 (o successiva, allora si interrompe). / polso
Milamber

1
TROVATO IL BUG !!!!! SI!!!!. Aggiornerò presto la mia risposta
Pieter Goosen,

Risposte:


8

AGGIORNAMENTO 21-01-2016 19:35 SA TIME - BUG FOUND !!!!! SI!!!!!!

Finalmente ho trovato il bug. Come indicato nell'ultimo aggiornamento, l'errore si verifica solo quando $post_contentè presente un <!--nextpage-->tag nel contenuto. L'ho provato e ho confermato che qualsiasi altra pagina dopo la pagina dopo <!--nextpage-->restituisce un 404 e quindi la pagina viene reindirizzata alla prima pagina.

Ciò è dovuto alle seguenti righe di codice nel handle_404()metodo introdotto nella WPclasse in 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 );
}

Ciò che fa questo codice è, ogni volta che il <!--nextpage-->tag è impostato in post_content, restituirà un 404 quando si accede a qualsiasi pagina che viene aggiunta dopo il contenuto tramite il content_paginationfiltro. A causa dell'impostazione di un 404, redirect_canonical()reindirizza qualsiasi pagina aggiunta alla prima pagina

Ho presentato un ticket trac su questo problema che puoi consultare qui

Al momento in cui scrivevo non c'erano ancora feedback, quindi assicurati di controllare regolarmente lo stato del biglietto

SOLUZIONE ATTUALE - RISPOSTE BIGLIETTO A / I TRAC

Per ora, fino a quando non avremo feedback e possibili correzioni nelle versioni future, è sufficiente eliminare quelle righe dalla WPclasse fino a nuovo avviso

CHE TEMPO È ... È IL TEMPO DI DEBUGGING !!!!!

Ho avuto il tempo di testarlo completamente. Ho preso il tuo codice e l'ho testato su:

  • La mia installazione locale v4.3

  • La mia installazione locale v4.4.0

  • La mia installazione locale v4.4.1

  • Completa la nuova installazione locale v4.4.1 con solo il Hello Worldpost e la Sample Pagepagina

con i miei permalink impostati su

  • default e

  • Post Name

Ecco il mio codice di prova per creare 4 pagine all'interno del mio post di prova.

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;
}

Ho anche testato

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;
}

per buona misura

Su ogni singola installazione e struttura del permalink, tutto il codice funziona ( tranne content_paginationsu v4.3 che è previsto ).

Ho anche impostato Sample Pagecome prima pagina statica, ma quello non è riuscito a pagina 2 come conformità al bug come descritto nella mia RISPOSTA ORIGINALE e ** EDIT

Quindi la conclusione è che questo non ha nulla a che fare con il bug nel core o con qualsiasi altro bug nel core. Dai commenti, qualcosa sta sconvolgendo l'oggetto interrogato sulle pagine di post paginati, ed è qualcosa di cui dobbiamo eseguire il debug. Sfortunatamente poiché questo problema è ora localizzato, non posso fornire soluzioni esatte.

AFFIDANDO IL PROBLEMA

È necessario utilizzare il seguente flusso di lavori per eseguire il debug del problema

  • Preparati un'enorme quantità di caffè con caffeina alta con molto zucchero

  • Fai un backup del tuo db

  • Scarica e installa i seguenti plug-in ( non ho alcuna affiliazione a nessun plug-in )

    • Oggetti di debug per il debug normale. Una volta installato e configurato, ripara tutti i bug evidenti che potrebbero essere evidenziati dal plugin. Non continuare con il prossimo punto elenco principale se si hanno evidenti bug. Risolvili prima

    • DB Manager che utilizzerai per riparare e pulire il tuo DB prima di passare al punto successivo

  • Cancella tutte le cache, i browser e i plugin

  • Disattiva tutti i plugin e cancella nuovamente tutte le cache per una buona misura. Poiché questo problema sembra un problema di reindirizzamento, probabilmente disattiverei prima tutti i plug-in che potrebbero avere qualcosa a che fare con il reindirizzamento. È possibile che un plug-in non sia ancora compatibile con v4.4. Controlla se il problema persiste, in caso affermativo, passa al punto successivo, altrimenti vediamo questo in modo più dettagliato

    Inizia disattivando tutti i plugin, puoi anche iniziare semplicemente disattivando i plugin che potrebbero essere ovvi per causare il problema. Testare correttamente l'installazione dopo l'attivazione di ogni singolo plug-in. Il primo plugin attivato che ha causato il problema sarà il colpevole. In tal caso, contattare l'autore del plug-in con i dettagli di debug. Assicurati di svuotare la cache dopo ogni attivazione del plugin solo per buona misura

  • Se hai raggiunto questo punto, il precedente punto elenco non ha risolto il problema. Il prossimo passo dovrebbe essere quello di passare a un tema in bundle per eliminare il tema come problema. Ancora una volta, cancella le cache.

  • Se tutto fallisce, ti rimangono altre due opzioni

    • Elimina .htaccesse lascia che WordPress ne crei uno nuovo

    • Reinstalla WordPress

Questo dovrebbe risolvere il tuo problema. In caso contrario, è necessario considerare un bug nel core di WordPress che potrebbe causare il problema.

Spero che questo aiuti a catturare il bug

AGGIORNARE

Avrei dovuto collegarmi al seguente biglietto trac che sembra spiegare tutto più in dettaglio

Patch interessanti e abbastanza rilevanti dal ticket trac sopra

Non posso concretamente testare nulla come tale in questo momento, ma dovresti esaminare le patch suggerite e provarle. Quello che posso prendere è che lo stesso codice in redirect_canonical()cui è responsabile dell'impaginazione delle prime pagine statiche è anche responsabile dell'impaginazione su singole pagine.

RISPOSTA ORIGINALE

Le pagine singole ( come le prime pagine statiche ) usano get_query_var( 'page' )per impaginare. Con WordPress 4.4 ( e in v4.4.1 ), si è verificato un errore che causa problemi con l'impaginazione quando si utilizza get_query_var( 'page' )per l'impaginazione.

Le attuali segnalazioni di bug, come trac ticket n. 35365 , menzionano solo le prime pagine statiche che hanno problemi con l'impaginazione, ma per quanto riguarda il bug get_query_var( 'page' ), penso che ciò causerebbe anche problemi con l'impaginazione di singoli post che utilizza anche get_query_var( 'page' ).

Dovresti provare le patch come descritto nei ticket trac. Se funziona, puoi applicare la patch e attendere la v4.4.2 che avrà risolto questo errore


1
Spero che questo sia il problema per l'OP, sembra molto probabile (non riesco a scavare in questo oggi ;-).
birgire,

1
Ho provato la correzione, anche i permalink disabilitati; nessun cambiamento.
Milamber,

1
Lo esaminerò non appena avrò tempo. Sento che la risposta sta nel bug, è solo per rintracciarlo. Spero che troverai presto una soluzione
Pieter Goosen,

2
Controlla il mio aggiornamento, ho trovato il bug e ho anche presentato una segnalazione di bug
Pieter Goosen

2
Confermato che tutti e 3 i metodi funzionano dopo che queste righe sono state commentate :) biglietto chiuso 35544 a favore del tuo
Milamber

4

Nota che c'è un errore di sintassi per tutti e tre gli esempi che hai fornito:

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

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

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

dove )viene aggiunto un extra .

Sostituisci queste righe con:

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

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Non consiglierei di scherzare con gli oggetti globali in generale, quindi penso che il tuo ultimo esempio con il content_paginationfiltro sia la strada da percorrere qui.

Potresti anche evitare di aggiungere pagine vuote con:

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

Manca anche )qui:

$content = html_entity_decode(stripslashes(get_option('custom_content'));

1
Il mio errore, l'extra) è stato lasciato dalla copia e incollarli fuori dalla classe in cui si trovano con la mia effettiva implementazione. Li ho rimossi dall'op. Sfortunatamente anche la versione content_pagination non corregge l'errore 404.
Milamber,

1
C'è anche un elemento mancante) nella $ content line - vedi l'aggiornamento. @Milamber
birgire

1
Grazie, risolto. Eventuali errori di sintassi che vedi nel codice operativo derivano dalla semplificazione per il post.
Milamber,

2
ok, l'ho provato su un'installazione vanilla WP 4.4 con il tema Twenty Sixteen e funziona come previsto lì, quindi penso che potrebbe essere qualcos'altro nella tua installazione che ti sta dando il problema. @Milamber
birgire

1
Strano, l'ho provato in 2 diversi ambienti di sviluppo con Twentyfifteen ed entrambi hanno avuto lo stesso risultato. Ci darò un'altra occhiata, grazie @birgire
Milamber,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.