[Résolu] Erreur à l'exécution de sitemap.php (5.7)

FrémoFrémo Member
juin 2019 modifié dans Bogues

Bonjour à tous,

je suis nouveau sur ce forum après quelques jours de tests et d'utilisation de ce super petit CMS qu'est PluXml 5.7. 😊

J'ai dû rater quelque chose car personne ne parle d'une erreur sur le fichier sitemap.php

Lorsque j'essaie d'accéder à /monsite/sitemap.php j'obtiens l'erreur suivante (j'ai une 404 lorsque j'essaie d'accéder directement à sitemap.xml mais je résoudrai cela plus tard) :

This page contains the following errors:

error on line 3 at column 6: XML declaration allowed only at the start of the document

Below is a rendering of the page up to the first error.


Je n'ai pas de lien à vous fournir car je suis sur un site de test sans nom de domaine attribué mais je pense que vous pourrez aisément reproduire cela (j'ai testé l'erreur aussi bien en local que sur o2switch, avec Chrome ou Firefox).

Après quelques recherches, cette erreur viendrait d'une mauvaise génération du fichier sitemap.xml qui contient deux lignes vides avant l'instruction de traitement XML <?xml version="1.0" encoding="utf-8" ?>, expression qui devrait se trouver en première ligne sans aucun espace avant.

Je n'ai pas réussi à détecter dans le code de sitemap.php ce qui pouvait générer ces 2 sauts de lignes en début du fichier .xml mais peut-être que quelques-uns parmi vous pourront lever le lièvre…

Merci par avance de m'avoir lu jusqu'ici et surtout de bien vouloir jeter un œil car c'est un réel problème de référencement lorsqu'un site ne dispose pas de sitemap lisible sans erreur par Google et consorts. 😅

Frédéric

Mots clés:

Réponses

  • De mémoire il me semble que sitemap.xml corresponde en fait à sitemap.php pour PluXml, normal que tu aies un 404.

    Ligne 3 col 6 correspond à :

    define('PLX_CORE', PLX_ROOT.'core/');
    

    Une piste à explorer : ton site est il installé à la racine de ton serveur ? http://monsite.fr/ ou dans un sous répertoire http://monsite.fr/monsite/ ?

    Sinon faudra attendre que nos codeurs passent dans le coin. :)

  • FrémoFrémo Member
    juin 2019 modifié

    Bonsoir @kowalsky, merci pour ta réponse. :)

    Oui, mon site est bien à la racine du serveur.

    Plusieurs réponses concordent pour expliquer que l'erreur vient chaque fois de l'insertion d'un ou plusieurs espaces au début du fichier sitemap.xml généré, comme par exemple ici :

    ou là :


    Je pense qu'il va falloir attendre les codeurs. :)

  • FrémoFrémo Member

    Alors, à défaut d'en connaître la cause, j'ai trouvé un pis-aller permettant de supprimer l'erreur.

    J'ai utilisé le code d'une solution donnée ici pour un problème similaire sur WordPress :

    En rajoutant tout simplement le code se trouvant dans le fichier fourni sur cette page (spacefix.php) en début du fichier sitemap.php fourni avec PluXml, l'erreur disparaît.

    Le code de sitemap.php devient donc :

    <?php
    # 13-06-2019
    # Ajout du code de https://presswork.me/error-on-line-3-at-column-6 pour "nettoyer" le sitemap.xml
    function ___wejns_wp_whitespace_fix($input) {
        $allowed = false;
    
    
        $found = false;
    
    
        foreach (headers_list() as $header) {
            if (preg_match("/^content-type:\\s+(text\\/|application\\/((xhtml|atom|rss)\\+xml|xml))/i", $header)) {
                $allowed = true;
            }
    
    
            if (preg_match("/^content-type:\\s+/i", $header)) {
                $found = true;
            }
        }
    
    
        
        if ($allowed || !$found) {
            return preg_replace("/\\A\\s*/m", "", $input);
        } else {
            return $input;
        }
    }
    
    
    ob_start("___wejns_wp_whitespace_fix");
    # Fin du code ajouté le 13-06-2019
    
    
    define('PLX_ROOT', './');
    define('PLX_CORE', PLX_ROOT.'core/');
    include(PLX_ROOT.'config.php');
    include(PLX_CORE.'lib/config.php');
    
    
    # On verifie que PluXml est installé
    if(!file_exists(path('XMLFILE_PARAMETERS'))) {
        header('Location: '.PLX_ROOT.'install.php');
        exit;
    }
    
    
    # On inclut les librairies nécessaires
    include(PLX_CORE.'lib/class.plx.date.php');
    include(PLX_CORE.'lib/class.plx.glob.php');
    include(PLX_CORE.'lib/class.plx.utils.php');
    include(PLX_CORE.'lib/class.plx.capcha.php');
    include(PLX_CORE.'lib/class.plx.erreur.php');
    include(PLX_CORE.'lib/class.plx.record.php');
    include(PLX_CORE.'lib/class.plx.motor.php');
    include(PLX_CORE.'lib/class.plx.plugins.php');
    
    
    # On impose le charset
    header('Content-Type: text/xml; charset='.PLX_CHARSET);
    
    
    # Creation de l'objet principal et lancement du traitement
    $plxMotor = plxMotor::getInstance();
    
    
    # Détermination de la langue à utiliser (modifiable par le hook : Index)
    $lang = $plxMotor->aConf['default_lang'];
    
    
    # Hook Plugins
    if(eval($plxMotor->plxPlugins->callHook('SitemapBegin'))) return;
    
    
    # chargement du fichier de langue
    loadLang(PLX_CORE.'lang/'.$lang.'/core.php');
    
    
    # On démarre la bufferisation
    ob_start();
    ob_implicit_flush(0);
    
    
    $plxMotor->prechauffage();
    $plxMotor->demarrage();
    
    
    # Entête XML
    echo '<?xml version="1.0" encoding="'.strtolower(PLX_CHARSET).'" ?>'."\n";
    ?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        <url>
            <loc><?php echo $plxMotor->urlRewrite() ?></loc>
            <changefreq>weekly</changefreq>
            <priority>1.0</priority>
        </url>
    <?php
    # Les pages statiques
    foreach($plxMotor->aStats as $stat_num => $stat_info) {
        if($stat_info['active']==1 AND $stat_num!=$plxMotor->aConf['homestatic']) {
            echo "\n";
            echo "\t<url>\n";
            echo "\t\t<loc>".$plxMotor->urlRewrite("?static".intval($stat_num)."/".$stat_info['url'])."</loc>\n";
            echo "\t\t<lastmod>".plxDate::formatDate($plxMotor->aStats[$stat_num]['date_update'],'#num_year(4)-#num_month-#num_day')."</lastmod>\n";
            echo "\t\t<changefreq>monthly</changefreq>\n";
            echo "\t\t<priority>0.8</priority>\n";
            echo "\t</url>\n";
        }
    }
    eval($plxMotor->plxPlugins->callHook('SitemapStatics'));
    # Les catégories
    foreach($plxMotor->aCats as $cat_num => $cat_info) {
        if($cat_info['active']==1 AND $cat_info['menu']=='oui' AND ($cat_info['articles']!=0 OR $plxMotor->aConf['display_empty_cat'])) {
            echo "\n";
            echo "\t<url>\n";
            echo "\t\t<loc>".$plxMotor->urlRewrite("?categorie".intval($cat_num)."/".$cat_info['url'])."</loc>\n";
            echo "\t\t<changefreq>weekly</changefreq>\n";
            echo "\t\t<priority>0.8</priority>\n";
            echo "\t</url>\n";
        }
    }
    eval($plxMotor->plxPlugins->callHook('SitemapCategories'));
    # Les articles
    if($aFiles = $plxMotor->plxGlob_arts->query('/^[0-9]{4}.(?:[0-9]|home|,)*(?:'.$plxMotor->activeCats.'|home)(?:[0-9]|home|,)*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort', 0, false, 'before')) {
        $plxRecord_arts = false;
        $array=array();
        foreach($aFiles as $k=>$v) { # On parcourt tous les fichiers
            $array[ $k ] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
        }
        # On stocke les enregistrements dans un objet plxRecord
        $plxRecord_arts = new plxRecord($array);
        if($plxRecord_arts) {
            # On boucle sur nos articles
            while($plxRecord_arts->loop()) {
                $num = intval($plxRecord_arts->f('numero'));
                echo "\n";
                echo "\t<url>\n";
                echo "\t\t<loc>".$plxMotor->urlRewrite("?article".$num."/".plxUtils::strCheck($plxRecord_arts->f('url')))."</loc>\n";
                echo "\t\t<lastmod>".plxDate::formatDate($plxRecord_arts->f('date'),'#num_year(4)-#num_month-#num_day')."</lastmod>\n";
                echo "\t\t<changefreq>monthly</changefreq>\n";
                echo "\t\t<priority>0.5</priority>\n";
                echo "\t</url>\n";
            }
        }
    }
    eval($plxMotor->plxPlugins->callHook('SitemapArticles'));
    ?>
    </urlset>
    <?php
    
    
    # Récuperation de la bufférisation
    $output = ob_get_clean();
    
    
    # Hook Plugins
    eval($plxMotor->plxPlugins->callHook('SitemapEnd'));
    
    
    # Restitution écran
    echo $output;
    exit;
    ?>
    


    Mais ce serait quand même bien de trouver la vraie source du problème plutôt que de lui appliquer un pansement. 😅

  • @Frémo Yep,

    Le sitemap de mon site free qui roule avec PluXml 5.7 officiel est 100% valide chez yandex et autres


    AMHA il est possible qu'il y est un (ou plusieurs) plugins qui inscrive ses fameuses lignes/espaces vides...

    Il y a combien de plugins activés et Ds quel ordre?


    Pour trouver d’où cela peut venir :

    • Capture l'écran de la page "plugins" (pour mémo*)
    • Clique sur la 1e case pour sélectionner tous les plugins
    • Puis "pour la sélection" >>> Désactiver >>> Ok
    • Regarde le sitemap.php, si aucune erreur Bingo, c'est bien les plugins qui sont en cause, il reste a le(s) trouver ;)

    Ensuite, réactive les plugins 1 à 1 (ds l'ordre du mémo, si besoin) et regarde la source du sitemap.php à chaque fois que tu en a réactivé un :)

    Lorsque l'erreur réapparaît, note le plugin et continue** jusqu’à ce que tous les plugins soit réactivés (*même liste que le mémo et même erreur(s) ds le sitemap)

    ** Il se peut que plusieurs plugins soient en cause si l'erreur est différente (1plug == 1 espace, 1 autre == 2 lignes) Qui sait. (si même erreur, ce plugin a besoin d'une MAJ ou d'une retouche)

    En espérant qu'il y ai que quelques greffons actifs ;)


    Mais si l'erreur est tjrs là lorsque aucun plug est actif, c'est autre chose qui génère cela , config du serveur, modif de pluxml perso (oubliée), ...


    Et penser a enlever le pansement de sitemap.php avant des essais ;)

    Tiens nous au jus

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • Kube17Kube17 Member

    De même, pas de soucis de mon côté pour les sitemap. Hébergé en mutu.

    FR/EN MP - Mail - unkorneglosk.fr - Twitter - Je suis modérateur, je dois donc modérater. Ou modérationner. Ou je sais plus. Mais je le fais. En ce moment j'ai des problèmes d'accès à internet je peux mettre du temps à répondre.

  • FrémoFrémo Member

    Hello @Sudwebdesign & @Kube17,

    le fautif est jpbInstalleurPlugins - Version 1.4 (28/12/2018)… à noter dans les tablettes.

    Une fois désactivé, l'erreur disparaît.

    Désolé pour le dérangement, j'aurais dû commencer par cela comme je le fais pourtant systématiquement sur WordPress en cas d'erreur…

    Comme quoi le changement d'environnement peut être bien plus perturbant qu'on peut le croire ! ;)

  • Il n'y a pas de dérangement :)

    Tu fais juste remonter un bug, qui sera à corriger au niveau du plugin ;)

  • SudwebdesignSudwebdesign Member
    juin 2019 modifié

    @jack31 (enfin il me semble)

    J'ai vu où sont les erreurs du plugin jpbInstalleurPlugins ;)

    Il y a au début du fichier de classe deux lignes vide avant la 1ere balise <?php

    Et Il y a aussi des lignes vide après la dernière balise de fermeture de php ?>

    C'est elles qui ajoutes les espaces et lignes non voulues (comme dirait Stéphane : un effet de bord)


    Pour y remédié, il suffit de supprimer les lignes vide avant la 1ere balise <?php afin que "<?php" soient les premiers caractères du fichier

    Et il est préconisé d'enlever la dernière balise d'un fichier php (le dernier ?> du fichier) pour d'éviter ce genre de cas ;)



    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • FrémoFrémo Member

    Super, testé et adopté ! :)

    Merci @Sudwebdesign d'avoir pris le temps de regarder et de corriger !

  • @Frémo

    Génial, ajoute donc un [résolu] au titre du premier message 😉

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

Connectez-vous ou Inscrivez-vous pour répondre.