Anhängen von Inhalten mit <! - nextpage -> in 4.4

14

Update 21.01.2016

Alle aktuellen Tests auf meiner Seite werden bei Neuinstallationen von 4.4.1 mit den folgenden Einstellungen durchgeführt: Plain permalinks Twentysixteen Theme No plugins activated

Wenn der Beitrag nur 1 Seite hat (dh <!--nextpage-->nicht im Beitrag erscheint), werden die zusätzlichen Seiten erfolgreich angehängt (auch wenn Sie mehrere zusätzliche Seiten anhängen¹).

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

Wenn der Beitrag mehr als 2 Seiten umfasst, werden die zusätzlichen Seiten 404 und die kanonische Weiterleitung auf Seite 1 des Beitrags weitergeleitet.

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

<!--nextpage-->

This is page 2

Im zweiten Fall $wp_query->queried_objectist leer, sobald Sie die zusätzlichen Seiten getroffen haben. Sie müssen die kanonische Umleitung deaktivieren, um dies zu sehenremove_filter('template_redirect', 'redirect_canonical');

Die beiden folgenden Hauptkorrekturen wurden separat und zusammen ohne Änderung des Verhaltens ausprobiert: https://core.trac.wordpress.org/ticket/35344#comment:16

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

Der Einfachheit halber ist dies der Code, mit dem ich gerade teste:

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

¹Dies ist der Code, mit dem ich mehrere zusätzliche Seiten auf einem einzelnen Seitenbeitrag getestet habe

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

Ursprüngliche Frage

Vor 4.4 konnte ich eine zusätzliche Seite mit folgendem Inhalt an einen Mehrseiten-Post anhängen:

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

Mit get_option ('custom_content') ist so etwas wie:

<!--nextpage-->
Hello World

Seit dem Upgrade auf 4.4 hat der Code nicht funktioniert. Das Navigieren zu der zusätzlichen Seite löst einen 404-Fehler aus und redirect_canonical sendet sie zurück an den Permalink des Posts. Durch Deaktivieren von redirect_canonical kann ich die zusätzliche Seite anzeigen und der zusätzliche Inhalt ist vorhanden, es wird jedoch weiterhin ein 404-Fehler ausgelöst.

Ich habe eine Reihe von Problemumgehungen versucht, von denen keine den 404-Fehler behebt, einschließlich:

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

Es wurde auch versucht, den neuen content_pagination- Filter zu nutzen, der in 4.4 hinzugefügt wurde:

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

An diesem Punkt habe ich keine Ideen, wie diese Funktionalität wiederhergestellt werden kann, und ich würde mich über jede Unterstützung freuen.

Milamber
quelle
Okay, ich habe ein Update dazu, leider ist es kein positives. Anscheinend funktioniert es bei der Neuinstallation, wenn die Extrapage Seite 2 ist. Wenn jedoch die Extraseite Seite 3 ist (oder höher, dann bricht es). / Handgelenk
Milamber
1
Habe den Bug gefunden !!!!! JA!!!!. Ich werde meine Antwort bald aktualisieren
Pieter Goosen

Antworten:

8

UPDATE 21-01-2016 19:35 SA TIME - BUG FOUND !!!!! JA!!!!!!

Endlich habe ich den Fehler gefunden. Wie Sie in Ihrem letzten Update angegeben haben, tritt der Fehler nur auf, wenn der Inhalt $post_contentein <!--nextpage-->Tag enthält. Ich habe es getestet und bestätigt, dass jede andere Seite nach der Seite nach dem <!--nextpage-->einen 404 zurückgibt und die Seite dann zur ersten Seite zurückgeleitet wird.

Dies liegt an den folgenden Codezeilen in der handle_404()Methode, die in der WPKlasse in WordPress 4.4 eingeführt wurde

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

Dieser Code gibt beim <!--nextpage-->Aufrufen post_contenteiner Seite, die nach dem Inhalt über den content_paginationFilter angehängt wird, immer dann eine 404 zurück , wenn das Tag in gesetzt ist . redirect_canonical()Leitet eine angehängte Seite aufgrund eines gesetzten 404 auf die erste Seite zurück

Ich habe ein Trac-Ticket zu diesem Problem eingereicht, das Sie hier einsehen können

Zum Zeitpunkt des Schreibens gab es noch keine Rückmeldungen. Überprüfen Sie daher regelmäßig den Status des Tickets

AKTUELLE LÖSUNG - A / W-TRAC-TICKET-FEEDBACK

Löschen Sie vorerst einfach diese Zeilen aus der, bis wir Feedback und mögliche Korrekturen in zukünftigen Versionen erhalten WP vorerst bis auf weiteres Klasse

WAS IST ES ...... ES IST DEBUGGING-ZEIT !!!!!

Ich hatte Zeit, dies vollständig zu testen. Ich habe Ihren Code genommen und getestet:

  • Meine v4.3 lokale Installation

  • Meine v4.4.0 lokale Installation

  • Meine v4.4.1 lokale Installation

  • Schließen Sie die lokale Installation von Version 4.4.1 nur mit dem Hello WorldBeitrag und der Sample PageSeite ab

mit meinen permalinks auf

  • default und

  • Post Name

Hier ist mein Testcode, um 4 Seiten mit meinem Testbeitrag zu erstellen.

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

Habe ich auch getestet

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

für ein gutes Maß

Bei jeder Installation und bei jeder Permalink-Struktur funktioniert der content_paginationgesamte Code (mit Ausnahme der erwarteten Version 4.3 ).

Ich habe es auch Sample Pageals statische Startseite festgelegt, aber dies ist auf Seite 2 als Bestätigung für den in my beschriebenen Fehler fehlgeschlagen ORIGINALANTWORT und in ** EDIT beschrieben

Die Schlussfolgerung lautet also, dass dies nichts mit dem Fehler im Kern oder einem anderen Fehler im Kern zu tun hat. Aus Kommentaren geht hervor, dass das abgefragte Objekt auf Seiten mit Seitenposts nicht mehr gesetzt ist, und das müssen wir debuggen. Da dieses Problem jetzt lokalisiert ist, kann ich leider keine genauen Lösungen geben.

DEBUGGING THE ISSUE

Sie müssen den folgenden Arbeitsablauf verwenden, um das Problem zu debuggen

  • Holen Sie sich eine große Menge Kaffee mit hohem Koffeingehalt und viel Zucker

  • Erstellen Sie eine Sicherungskopie Ihrer Datenbank

  • Laden Sie die folgenden Plugins herunter und installieren Sie sie ( ich bin keinem Plugin zugeordnet )

    • Debug-Objekte für das normale Debuggen. Reparieren Sie nach der Installation und Einrichtung alle offensichtlichen Fehler, die vom Plugin hervorgehoben werden könnten. Fahren Sie nicht mit dem nächsten Aufzählungspunkt fort, wenn Sie offensichtliche Fehler haben. Repariere sie zuerst

    • DB Manager, mit dem Sie Ihre Datenbank reparieren und bereinigen, bevor Sie mit dem nächsten Aufzählungspunkt fortfahren

  • Löschen Sie alle Caches, Browser und Plugins

  • Deaktivieren Sie alle Plugins und löschen Sie alle Caches für eine gute Maßnahme erneut. Da dieses Problem wie ein Umleitungsproblem aussieht, würde ich wahrscheinlich zuerst alle Plugins deaktivieren, die möglicherweise etwas mit Umleitung zu tun haben. Es kann sein, dass ein Plugin noch nicht mit v4.4 kompatibel ist. Überprüfen Sie, ob das Problem weiterhin besteht. Wenn dies der Fall ist, fahren Sie mit dem nächsten Aufzählungspunkt fort. Andernfalls können Sie dies genauer untersuchen

    Deaktivieren Sie zunächst alle Plugins. Sie können auch zunächst nur die Plugins deaktivieren, die für die Ursache des Problems offensichtlich sind. Testen Sie Ihre Installation nach der Aktivierung jedes einzelnen Plugins ordnungsgemäß. Das erste aktivierte Plugin, das das Problem verursacht hat, ist der Schuldige. Wenden Sie sich in diesem Fall an den Autor des Plugins, um Einzelheiten zum Debuggen zu erfahren. Stellen Sie einfach sicher, dass Sie Ihre Caches nach jeder Aktivierung des Plugins löschen, nur für eine gute Maßnahme

  • Wenn Sie diesen Punkt erreicht haben, hat der vorherige Aufzählungspunkt Ihr Problem nicht gelöst. Der nächste Schritt sollte darin bestehen, zu einem gebündelten Thema zu wechseln, um Ihr Thema als Problem zu beseitigen. Nur nochmal, Caches löschen.

  • Wenn alles fehlgeschlagen ist, stehen Ihnen zwei weitere Optionen zur Verfügung

    • Löschen Sie .htaccessund lassen Sie WordPress ein neues erstellen

    • Installieren Sie WordPress neu

Dies sollte Ihr Problem lösen. Wenn dies nicht der Fall ist, müssen Sie einen Fehler im WordPress-Kern berücksichtigen, der das Problem verursachen könnte.

Ich hoffe, das hilft, den Fehler zu beheben

AKTUALISIEREN

Ich hätte eigentlich auf das folgende Trac-Ticket verweisen sollen, das alles genauer zu erklären scheint

Interessante und durchaus relevante Patches aus dem obigen Trac-Ticket

Ich kann im Moment noch nichts konkret testen, aber Sie sollten die vorgeschlagenen Patches durcharbeiten und testen. Was ich herausfinden kann, ist, dass derselbe Code, redirect_canonical()der für die Paginierung von statischen Titelseiten verantwortlich ist, auch für die Paginierung auf einzelnen Seiten verantwortlich ist.

URSPRÜNGLICHE ANTWORT

Einzelne Seiten ( wie statische Titelseiten ) werden get_query_var( 'page' )zum Paginieren verwendet. Mit WordPress 4.4 ( und in v4.4.1 ) ist ein Fehler aufgetreten , der Probleme mit der Paginierung bei der Verwendung get_query_var( 'page' )für die Paginierung verursacht.

In den aktuellen Fehlerberichten, wie dem Trac-Ticket Nr. 35365 , werden nur statische Titelseiten erwähnt, die Probleme mit der Paginierung haben. In Bezug auf den Fehler get_query_var( 'page' )würde dies jedoch zu Problemen mit der Paginierung einzelner Posts führen, die ebenfalls verwendet wird get_query_var( 'page' ).

Sie sollten die Patches wie in den Trac-Tickets beschrieben ausprobieren. Wenn dies funktioniert, können Sie den Patch anwenden und auf v4.4.2 warten, bei dem dieser Fehler behoben ist

Pieter Goosen
quelle
1
Hoffentlich ist dies das Problem für das OP, das sich sehr wahrscheinlich anhört (heute nicht in der Lage, sich damit auseinanderzusetzen ;-).
Birgire
1
Versuchte das Update, auch deaktivierte Permalinks; Keine Änderung.
Milamber
1
Ich werde mich darum kümmern, sobald ich Zeit habe. Ich habe das Gefühl, dass die Antwort im Fehler liegt, es ist nur, ihn aufzuspüren. Ich hoffe, Sie finden bald eine Lösung
Pieter Goosen
2
Überprüfen Sie mein Update, ich habe den Fehler gefunden und auch einen Fehlerbericht eingereicht
Pieter Goosen
2
Bestätigt, dass alle 3 Methoden funktionieren, sobald diese Zeilen auskommentiert sind :) Ticket 35544 zugunsten Ihrer geschlossen
Milamber
4

Beachten Sie, dass für alle drei von Ihnen angegebenen Beispiele ein Syntaxfehler vorliegt:

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

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

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

wo ein Extra )hinzugefügt wird.

Ersetzen Sie diese Zeilen durch:

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

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Ich würde generell nicht empfehlen, mit globalen Objekten herumzuspielen. Ich denke, Ihr letztes Beispiel mit dem content_paginationFilter ist der richtige Weg, um hier voranzukommen.

Möglicherweise möchten Sie auch vermeiden, leere Seiten anzufügen mit:

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

Es fehlt )hier auch ein :

$content = html_entity_decode(stripslashes(get_option('custom_content'));
birgire
quelle
1
Mein Fehler, das Extra, blieb beim Kopieren und Einfügen aus der Klasse übrig, in der sie sich mit meiner tatsächlichen Implementierung befanden. Ich habe sie aus dem OP entfernt. Leider korrigiert auch die content_pagination-Version den 404-Fehler nicht.
Milamber
1
Es fehlt auch ein) in der $ content-Zeile - siehe Update. @ Milamber
Birgire
1
Danke, behoben. Alle Syntaxfehler, die Sie im Op-Code sehen, sind darauf zurückzuführen, dass sie für den Beitrag vereinfacht wurden.
Milamber
2
ok, ich habe dies auf einer Vanille-WP 4.4-Installation mit dem Twenty Sixteen-Thema getestet und es funktioniert dort wie erwartet, also denke ich, dass es etwas anderes in Ihrem Setup ist, das Ihnen das Problem gibt. @ Milamber
Birgire
1
Seltsamerweise habe ich es mit Twentyfifteen in 2 verschiedenen Entwicklungsumgebungen versucht und beide hatten das gleiche Ergebnis. Ich werde es mir noch einmal ansehen, danke @birgire
Milamber