Exclure catégories / articles de sitemap.php

flipflipflipflip Member
avril 2021 modifié dans Discussions générales

Bonjour à tous,

Google et autres utilisent le système de sitemap (entre autre) pour indexer nos sites. Pour rappel le sitemap est "l'annuaire" de nos sites regroupant les catégories, articles, pages statiques actives.

Parfois certains de ces éléments n'ont pas vocation a être référencé en tant que page, par exemple ce que j'appelle une catégorie technique qui me sert à rassembler des articles pour les afficher à un endroit précis de mon site et uniquement dans le contexte de cette page. Si je visite un de ces articles le template n'est pas prévu pour et l'affichage est bordélique.

Est-ce qu'il est prévu une évolution pour définir des exclusion à ne pas faire apparaître dans le sitemap.php ?

J'ai tenté de le faire via un plugin mais pas moyen de redéfinir $plxMotor->activeCats dans sitemap.php.

J'ai un string de l'array

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,

    Cela devrait être possible avec un plugin et en utilisant le hook SitemapBegin pour filtrer le tableau $plxMotor->aCats en éliminant tes catégories "techniques".
    Il faudra prévoir une méthode pour taguer ces catégories ( config.php du plugin ou rajouter une colonne dans le tableau des catégories avec les hooks AdminCategoriesTop__et __AdminCategoriesFoot ).

    Une autre solution est de ne pas afficher ces catégories dans le menu. Mais ce n'est peut être pas faisable dans ton cas.

  • Bonjour,

    J'ai essayé de faire un petit plugin

    <?php
    
    class excludeSitemap extends plxPlugin {
    
      public function __construct($default_lang) {
    
            # Appel du constructeur de la classe plxPlugin (obligatoire)
            parent::__construct($default_lang);
    
            # Autorisation d'acces à la configuration du plugins
            $this-> setConfigProfil(PROFIL_ADMIN);
    
        $this->addHook('SitemapBegin', 'SitemapBegin');
      }
    
      public function SitemapBegin() {
        global $plxMotor;
    
        echo '<?php
          $cats = explode("|", $plxMotor->activeCats);
          foreach ($cats as $key => $value) {
            if($value != "009") {
              $cat = $value."|".$cat;
            }
          }
          $plxMotor->activeCats = $cat;
        ?>';
      }
    }
    ?>
    

    Pour le moment je test avec la catégorie en dur dans le code. Je cherche à exclure la catégorie et tout les articles de la catégorie 009. La var $cat ne contient plus 009 mais $plxMotor->activeCats contient toujours 009 donc les articles présent dans cette catégorie sont toujours listés. Je dois m'y prendre mal pour redéfinir activeCats.

    Je souhaite vraiment un paramètre spécifique dans l'admin de la catégorie car je ne suis pas à l’abri qu'un jour une catégorie doit apparaître sur le site mais pas dans le site. Par exemple une section vérouillée par mot de passe qui n'a pas besoin d'être référencée.

    J'ai un string de l'array

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    kzExcludeSitemap.php :

    <?php
    
    /*
     * Exclue certaines catégories de sitemap
     * */
    
    class kzExcludeSitemap extends plxPlugin {
    
        const BEGIN_CODE = '<?php /* ' . __CLASS__ . 'plugin */' . PHP_EOL;
        const END_CODE = PHP_EOL . '?>';
    
        public function __construct($default_lang) {
    
            # Appel du constructeur de la classe plxPlugin (obligatoire)
            parent::__construct($default_lang);
    
            # Autorisation d'acces à la configuration du plugins
            $this-> setConfigProfil(PROFIL_ADMIN);
    
            $this->addHook('SitemapBegin', 'SitemapBegin');
        }
    
        public function SitemapBegin() {
            $param = trim($this->getParam('banned'));
            echo self::BEGIN_CODE;
    ?>
    if(empty('<?= $param ?>') or preg_match_all('#\b(\d{1,3})\b#', '<?= $param ?>', $matches) == 0) {
        # nothing to do
        return false;
    }
    
    $bannedCats = array_map(
        function($item) {
            return str_pad($item, 3, '0', STR_PAD_LEFT);
        },
        $matches[1]
    );
    
    # on désactive les catégories bannies
    foreach(array_keys($plxMotor->aCats) as $k) {
        $plxMotor->aCats[$k]['active'] = in_array($k, $bannedCats) ? 0 : 1;
    }
    
    # On actualise $plxMotor::activeCats
    $plxMotor->activeCats = implode('|', array_merge(
        array_keys(
            array_filter(
                $plxMotor->aCats,
                function($value) {
                    return ($value['active'] == 1);
                }
            )),
        array('000')
    ));
    
    # the show must go on
    return false;
    <?php
            echo self::END_CODE;
        }
    }
    

    config.php :

    <?php
    if(!defined('PLX_ROOT')) { exit; }
    
    if(filter_has_var(INPUT_POST, 'banned')) {
        plxToken::validateFormToken();
        $banned = filter_input(INPUT_POST, 'banned', FILTER_SANITIZE_STRING);
        $plxPlugin->setParam('banned', $banned, 'string');
        $plxPlugin->saveParams();
        header('Location: parametres_plugin.php?p=' . $plugin);
        exit;
    }
    ?>
    <form method="post">
        <?= plxToken::getTokenPostMethod() ?>
        <label>
            <span><?php $plxPlugin->lang('BANNED_CATEGORIES'); ?></span>
            <input name="banned" value="<?= $plxPlugin->getParam('banned') ?>" />
        </label>
        <input type="submit" />
    </form>
    
    

    infos.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <document>
        <title>kzExcludeSitemap</title>
        <author>Bazooka07</author>
        <version>0.9.0</version>
        <date>12/04/2021</date>
        <site>https://kazimentou.fr/repo</site>
        <description><![CDATA[Exclue certaines catégories du sitemap.]]></description>
        <scope>site</scope>
    </document>
    

    Il y a une limitation : les articles non référencés doivent appartenir exclusivement à une catégorie interdite.
    Si un article appartient aussi à une autre catégorie, il sera référencé.

    Pour la config liste des categories à bannir groupes de 1 à 3 chiffres dans une chaine de caractères avec séparateur au choix :

    0 02,003;4| 45
    

    Pour être plus restrictif sur le filtrage des articles, je pense qu'il faut ré-écrire sitemap.php, c'est faisable. A moins de trouver une option dans les regex qui va bien ( ne pas appartenir à un groupe ).

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Pour exclure tous les articles qui ont au moins une catégorie interdite, il faut filtrer $plxMotor->plxGlob_arts->aFiles.
    Actualiser $plxMotor->activeCats devient alors inutile.

        public function SitemapBegin() {
            $param = trim($this->getParam('banned'));
            echo self::BEGIN_CODE;
    ?>
    if(empty('<?= $param ?>') or preg_match_all('#\b(\d{1,3})\b#', '<?= $param ?>', $matches) == 0) {
        # nothing to do
        return false;
    }
    
    $bannedCats = array_map(
        function($item) {
            return str_pad($item, 3, '0', STR_PAD_LEFT);
        },
        $matches[1]
    );
    
    # on désactive les catégories bannies
    foreach(array_keys($plxMotor->aCats) as $k) {
        $plxMotor->aCats[$k]['active'] = in_array($k, $bannedCats) ? 0 : 1;
    }
    
    # On actualise $plxMotor->plxGlob_arts->aFiles
    $aNewFiles = array_filter(
        $plxMotor->plxGlob_arts->aFiles,
        function($filename) use($plxMotor, $bannedCats) {
            $temp = $plxMotor->artInfoFromFilename($filename);
            $common = array_intersect($bannedCats, explode(',', $temp['catId']));
            return empty($common);
        }
    );
    $plxMotor->plxGlob_arts->aFiles = $aNewFiles;
    
    # the show must go on
    return false;
    <?php
            echo self::END_CODE;
        }
    }
    

    Il reste juste à peaufiner le fichier de config et le dossier "lang".

  • Salut,

    J'ai enfin été jusqu'au bout. Je me suis inspiré de ton code en le simplifiant et j'en ai fait un plugin.

    https://forum.pluxml.org/discussion/7004/plugins-excludesitemap/

    Merci de ton aide.

    J'ai un string de l'array

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