web-dev-qa-db-fra.com

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

Mise à jour 2016-01-21

Tous les tests en cours chez moi sont effectués sur de nouvelles installations de 4.4.1 avec les paramètres suivants: Plain permalinksTwentysixteen ThemeNo plugins activated

Si le message n'a qu'une page (c.-à-d. Que <!--nextpage--> n'apparaît pas dans le message), les pages supplémentaires sont ajoutées avec succès (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 a plus de 2 pages alors 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_object est vide une fois que vous avez accédé aux pages supplémentaires. Vous devez désactiver la redirection canonique pour voir cette remove_filter('template_redirect', 'redirect_canonical');

Les deux correctifs principaux 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 faciliter son utilisation, voici le code que 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 originale

Avant la version 4.4, j’étais en mesure d’ajouter une page supplémentaire à un message multipage avec les éléments suivants:

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

Get_option ('custom_content') ressemble à quelque chose comme:

<!--nextpage-->
Hello World

Depuis la mise à niveau à 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 du message. La désactivation de redirect_canonical me permet de voir la page supplémentaire et le contenu supplémentaire qui s'y trouve, mais cela déclenche toujours une erreur 404.

J'ai essayé plusieurs 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;
}

Nous avons également essayé de tirer parti du nouveau filtre content_pagination ajouté dans la version 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 suis à court d'idées sur la façon de restaurer cette fonctionnalité et toute aide serait la bienvenue.

14
Milamber

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 survient que lorsque $post_content a une balise <!--nextpage--> dans le contenu. Je l'ai testé et j'ai confirmé que toute autre page après la page après le <!--nextpage--> renvoie 404, puis la page est redirigée vers la première page.

Cela est dû à les lignes de code suivantes dans la méthode handle_404() qui a été introduite dans la classe WP 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 code ne fait que, chaque fois que la balise <!--nextpage--> est définie dans le post_content, elle retournera un 404 lors de l’accès à une page ajoutée après le contenu via le filtre content_pagination. En raison de la définition d'un 404, redirect_canonical() redirige n'importe quelle page ajoutée à la première page

J'ai déposé un ticket de transport à ce sujet que vous pouvez consulter ici

Au moment de la rédaction de cet article, il n'y avait pas encore de retour. Assurez-vous donc de vérifier régulièrement l'état du ticket.

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

Pour l'instant, jusqu'à ce que nous obtenions des commentaires et des solutions possibles dans les versions futures, supprimez simplement ces lignes de la classe WP jusqu'à nouvel ordre.

QUEL TEMPS IS IT ...... C'EST UN TEMPS DE DEBOGAGE !!!!!

J'ai eu le temps de tester complètement 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

  • Terminez la nouvelle installation locale v4.4.1 avec uniquement la publication Hello World et la page Sample Page

avec mes permaliens mis à

  • default et

  • Post Name

Voici mon code de test pour créer 4 pages avec à l'intérieur de mon post 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

Tout votre code fonctionne sur chaque structure d'installation et de lien permanent (sauf le content_pagination sur v4.3 qui est attendu} _).

J'ai également défini Sample Page comme page de couverture statique, mais cela a échoué à la page 2 comme une conformation au bogue décrite dans mon RÉPONSE ORIGINALE et ** EDIT

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 désactive l'objet demandé sur les pages de publication paginées et nous devons le déboguer. Malheureusement, ce problème étant maintenant localisé, je ne peux pas vous donner de solution exacte.

DÉBOGAGE DU NUMÉRO

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

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

  • Faire une sauvegarde de toi db

  • Téléchargez et installez les plugins suivants (je ne suis affilié à aucun plugin)

    • Objets de débogage pour le débogage normal. Une fois installé et installé, réparez tous les bugs évidents qui pourraient être mis en évidence par le plugin. Ne continuez pas au prochain point de puce principal si vous avez des bogues évidents. Fixez-les d'abord

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

  • Effacer tous les caches, navigateurs et plugins

  • Désactivez tous les plugins et effacez à nouveau toutes les caches pour une bonne mesure. Étant donné que ce problème ressemble à un problème de redirection, je commencerais probablement par désactiver tous les plug-ins pouvant avoir un rapport 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 tel est le cas, continuez avec la puce suivante, sinon, regardons cela plus en détail

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

  • Si vous avez atteint ce point, la puce précédente ne résolvait pas votre problème. La prochaine étape devrait consister à passer à un thème groupé pour éliminer votre thème en tant que problème. Encore une fois, vider les caches.

  • Si tout a échoué, il ne vous reste plus que deux options

    • Supprimez .htaccess et laissez WordPress en créer un nouveau.

    • Réinstaller WordPress

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

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

METTRE À JOUR

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

Correctifs intéressants et assez pertinents du billet trac ci-dessus

Je ne peux pas tester concrètement quoi que ce soit en tant que tel pour le moment, mais vous devriez travailler avec les correctifs suggérés et les tester. Ce que je peux comprendre, c'est que le même code dans redirect_canonical() , qui est responsable de la pagination des pages de garde statiques, est également responsable de la pagination sur des pages simples.

RÉPONSE ORIGINALE

Les pages simples (comme les pages de couverture statiques) utilisent get_query_var( 'page' ) pour paginer. Avec WordPress 4.4 (et dans v4.4.1), un bogue entraînant des problèmes de pagination lors de l'utilisation de get_query_var( 'page' ) pour la pagination.

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

Vous devriez essayer les correctifs décrits dans les tickets de trac. Si cela fonctionne, vous pouvez appliquer le correctif et attendre la v4.4.2 qui corrigera ce bogue

8
Pieter Goosen

Notez qu'il existe 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émentaire est ajouté.

Remplacez ces lignes pour:

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 filtre content_pagination est la voie à suivre ici.

Vous voudrez peut-être aussi éviter d'ajouter des pages vides avec:

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

Il y a aussi un ) manquant ici:

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