Ajouter du contenu avec <! - page suivante -> rompu en 4.4


14

Mise à jour 2016-01-21

Tous les tests actuels de ma part sont effectués sur de nouvelles installations de 4.4.1 avec les paramètres suivants: Plain permalinks Twentysixteen Theme No plugins activated

Si la publication ne comporte qu'une seule page (c'est-à <!--nextpage-->- dire qu'elle n'apparaît pas dans la publication), les pages supplémentaires sont correctement ajoutées (même si vous ajoutez plusieurs pages supplémentaires¹).

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

Si le message contient plus de 2 pages, les pages supplémentaires 404 et la redirection canonique vers la page 1 du message.

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

<!--nextpage-->

This is page 2

Dans le second cas $wp_query->queried_objectest vide une fois que vous avez atteint les pages supplémentaires. Vous devrez désactiver la redirection canonique pour voir ceciremove_filter('template_redirect', 'redirect_canonical');

Les deux correctifs de base suivants ont été essayés, séparément et ensemble, sans changement de comportement: https://core.trac.wordpress.org/ticket/35344#comment:16

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

Pour plus de facilité d'utilisation, voici le code avec lequel je teste actuellement:

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

¹C'est le code que j'ai utilisé pour tester plusieurs pages supplémentaires sur une seule page

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

Question d'origine

Avant la version 4.4, je pouvais ajouter une page supplémentaire à un message multipage avec ce qui suit:

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

Avec get_option ('custom_content') étant quelque chose comme:

<!--nextpage-->
Hello World

Depuis la mise à niveau vers 4.4, le code n'a pas fonctionné; la navigation vers la page supplémentaire déclenche une erreur 404 et redirect_canonical les renvoie au permalien de la publication. La désactivation de redirect_canonical me permet d'afficher la page supplémentaire et le contenu supplémentaire est là, mais cela déclenche toujours une erreur 404.

J'ai essayé un certain nombre de solutions de contournement, dont aucune ne résout l'erreur 404, notamment:

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

A également essayé de tirer parti du nouveau filtre content_pagination qui a été ajouté dans 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;
}

À ce stade, je n'ai plus d'idées sur la façon de restaurer cette fonctionnalité et toute aide serait appréciée.


D'accord, j'ai donc une mise à jour, malheureusement ce n'est pas positif. Apparemment, cela fonctionne sur la nouvelle installation si l'extrapage est la page 2. Cependant, si la page supplémentaire est la page 3 (ou supérieure, elle se casse). / poignet
Milamber

1
TROUVEZ LE BUG !!!!! OUAIS!!!!. Mettra à jour ma réponse bientôt
Pieter Goosen

Réponses:


8

MISE À JOUR 21-01-2016 19:35 SA TIME - BUG TROUVÉ !!!!! OUAIS!!!!!!

J'ai finalement trouvé le bug. Comme vous l'avez indiqué dans votre dernière mise à jour, l'échec ne se produit que lorsqu'il y $post_contenta une <!--nextpage-->balise dans le contenu. Je l'ai testé et j'ai confirmé que toute autre page après la page après le <!--nextpage-->retourne un 404, puis la page est redirigée vers la première page.

Cela est dû aux lignes de code suivantes dans la handle_404()méthode qui a été introduite dans la WPclasse dans 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 );
}

Ce que fait ce code, c'est que chaque fois que la <!--nextpage-->balise est définie dans le post_content, il retournera un 404 lors de l'accès à n'importe quelle page qui est ajoutée après le contenu via le content_paginationfiltre. En raison de la définition d'un 404, redirect_canonical()redirige toute page ajoutée vers la première page

J'ai déposé un ticket Trac sur ce problème que vous pouvez consulter ici

Au moment de la rédaction, il n'y avait pas encore de commentaires, alors assurez-vous de vérifier régulièrement l'état du billet

SOLUTION ACTUELLE - RÉTROACTION DU BILLET TRAC A / W

Pour l'instant, jusqu'à ce que nous recevions des commentaires et des correctifs possibles dans les versions futures, supprimez simplement ces lignes de la WPclasse jusqu'à nouvel ordre

QUELLE HEURE EST-IL ...... IL EST TEMPS DE DÉBOGAGE !!!!!

J'ai eu le temps de tester pleinement cela. J'ai pris votre code et l'ai testé sur:

  • Mon installation locale v4.3

  • Mon installation locale v4.4.0

  • Mon installation locale v4.4.1

  • Terminer la nouvelle installation locale de v4.4.1 avec uniquement la Hello Worldpublication et la Sample Pagepage

avec mes permaliens définis sur

  • default et

  • Post Name

Voici mon code de test pour créer 4 pages avec l'intérieur de mon message de test.

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

J'ai aussi testé

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

pour faire bonne mesure

Sur chaque structure d'installation et de permalien, tout votre code fonctionne ( à l'exception de la version content_pagination4.3 qui est attendue ).

J'ai également défini Sample Pagecomme une première page statique, mais cela a échoué à la page 2 en tant que conformation au bogue comme décrit dans ma RÉPONSE ORIGINALE et ** ÉDITER

Donc, la conclusion est que cela n'a rien à voir avec le bogue dans le noyau ou tout autre bogue dans le noyau. D'après les commentaires, quelque chose perturbe l'objet interrogé sur les pages de message paginées, et c'est quelque chose que nous devons déboguer. Malheureusement, comme ce problème est maintenant localisé, je ne peux pas donner de solutions exactes.

DÉBOGAGE DU PROBLÈME

Vous devez utiliser le flux de travaux suivant pour déboguer le problème

  • Obtenez-vous une énorme quantité de café riche en caféine avec beaucoup de sucre

  • Faites une sauvegarde de vous db

  • Téléchargez et installez les plugins suivants ( je n'ai aucune affiliation à aucun plugin )

    • Déboguer des objets pour un débogage normal. Une fois installé et configuré, réparez tous les bugs évidents qui pourraient être mis en évidence par le plugin. Ne passez pas au prochain point principal si vous avez des bogues évidents. Réparez-les d'abord

    • DB Manager que vous utiliserez pour réparer et nettoyer votre base de données avant de passer au point suivant

  • Effacez tous les caches, navigateurs et plugins

  • Désactivez tous les plugins et effacez à nouveau tous les caches pour faire bonne mesure. Parce que ce problème ressemble à un problème de redirection, je désactiverais probablement d'abord tous les plugins qui pourraient avoir quelque chose à voir avec la redirection. Il se peut qu'un plugin ne soit pas encore compatible avec la v4.4. Vérifiez si le problème persiste, si c'est le cas, passez au point suivant, sinon, examinons cela plus en détail

    Commencez par désactiver tous les plugins, vous pouvez également commencer par désactiver simplement les plugins qui pourraient être évidents pour causer le problème. Testez correctement votre installation après l'activation de chaque plug-in. Le premier plugin activé à l'origine du problème sera le coupable. Dans ce cas, contactez l'auteur du plugin avec les détails de débogage. Assurez-vous de vider vos caches après chaque activation de plugin juste pour faire bonne mesure

  • Si vous avez atteint ce point, le point précédent n'a pas résolu votre problème. La prochaine étape devrait être de passer à un thème groupé pour éliminer votre thème comme problème. Encore une fois, effacez les caches.

  • Si tout a échoué, vous avez encore deux options

    • Supprimer .htaccesset laisser WordPress en créer un nouveau

    • Réinstallez WordPress

Cela devrait résoudre votre problème. Si ce n'est pas le cas, vous devez considérer un bogue dans le noyau WordPress qui pourrait être à l'origine du problème.

J'espère que cela aide à attraper le bug

MISE À JOUR

J'aurais dû me lier au ticket trac suivant qui semble tout expliquer plus en détail

Correctifs intéressants et tout à fait pertinents du ticket Trac ci-dessus

Je ne peux pas tester concrètement quoi que ce soit en ce moment, mais vous devez parcourir les correctifs suggérés et les tester. Ce que je peux comprendre, c'est que le même code dans redirect_canonical()lequel est responsable de la pagination des premières pages statiques est également responsable de la pagination sur les pages simples.

RÉPONSE ORIGINALE

Les pages uniques ( comme les premières pages statiques ) sont get_query_var( 'page' )utilisées pour paginer. Avec WordPress 4.4 ( et dans la v4.4.1 ), un bug est survenu qui provoque des problèmes de pagination lors de l'utilisation get_query_var( 'page' )de la pagination.

Les rapports de bogues actuels, comme le ticket trac # 35365 , ne mentionnent que les premières pages statiques qui ont des problèmes de pagination, mais comme le bug se rapporte à get_query_var( 'page' ), je pense que cela entraînerait également des problèmes avec la pagination à une seule publication qui utilise également get_query_var( 'page' ).

Vous devriez essayer les correctifs comme décrit dans les tickets trac. Si cela fonctionne, vous pouvez appliquer le patch et attendre la v4.4.2 qui corrigera ce bug


1
J'espère que c'est le problème pour l'OP, cela semble très probable (pas en mesure de creuser cela aujourd'hui ;-).
birgire

1
J'ai essayé le correctif, également désactivé les permaliens; pas de changement.
Milamber

1
J'examinerai cela dès que j'aurai le temps. Je pense que la réponse réside dans le bug, c'est juste pour le retrouver. J'espère que vous trouverez bientôt une solution
Pieter Goosen

2
Vérifiez ma mise à jour, j'ai trouvé le bogue et j'ai également déposé un rapport de bogue
Pieter Goosen

2
Confirmé que les 3 méthodes fonctionnent une fois ces lignes commentées :) ticket fermé 35544 en faveur de la vôtre
Milamber

4

Notez qu'il y a une erreur de syntaxe pour ces trois exemples que vous avez fournis:

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

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

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

où un supplément )est ajouté.

Remplacez ces lignes par:

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

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Je ne recommanderais pas de jouer avec les objets globaux en général, donc je pense que votre dernier exemple avec le content_paginationfiltre est la voie à suivre ici.

Vous pouvez également éviter d'ajouter des pages vides avec:

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

Il manque aussi )ici:

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

1
Mon erreur, le supplément) a été laissée par la copie et le collage de la classe dans laquelle ils sont avec mon implémentation réelle. Je les ai retirés de l'op. Malheureusement, la version content_pagination ne corrige pas non plus l'erreur 404.
Milamber

1
Il y a aussi un manquant) dans la ligne $ content - voir la mise à jour. @Milamber
birgire

1
Merci, réparé. Toutes les erreurs de syntaxe que vous voyez dans le code op proviennent de sa simplification pour la publication.
Milamber

2
ok, j'ai testé cela sur une installation vanilla WP 4.4 avec le thème Twenty Sixteen et cela fonctionne comme prévu, donc je pense que c'est peut-être autre chose dans votre configuration qui vous pose le problème. @Milamber
birgire

1
Étrange, je l'ai essayé dans 2 environnements de développement différents avec Twentyfifteen et ils ont tous deux eu le même résultat. Je vais y jeter un autre coup d'oeil, merci @birgire
Milamber
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.