BetterMyBetterUrls (idée)

YannicYannic Member
juin 2017 modifié dans Modifications
Bonjour.

Désirant avoir des urls avec la catégorie principale devant (idem avec le groupe des pages) je me suis modifié le plugin plxMyBetterUrls comme suit:
dans la fonction RewriteUrls() de plxMyBetterUrls :
public function RewriteUrls() {
		echo '<?php
			if(preg_match_all("/article[0-9]/", $output, $test))
			{
				foreach($test[0] as $k=>$v)
				{
					$v2 = str_replace("article","",$v);
					$v2 = str_pad($v2,4,0,STR_PAD_LEFT);
					$r = $plxMotor->artInfoFromFilename($plxMotor->plxGlob_arts->aFiles[$v2]);
					$r = explode(",",$r["catId"]);
					if(!empty($r))
					{
						$r = $r[0];
						$output = str_replace($v, "'.$this->article.'".$plxMotor->aCats[$r]["url"], $output);
					}
				}
			}
			if(preg_match_all("/static[0-9]/", $output, $test2))
			{
				foreach($test2[0] as $k=>$v)
				{
					$v2 = str_replace("static","",$v);
					$v2 = str_pad($v2,3,0,STR_PAD_LEFT);
					$r = $plxMotor->aStats[$v2]["group"];
					if(!empty($r))
					{
						$r = plxUtils::title2url($r);
						$output = str_replace($v, "'.$this->static.'".$r, $output);
					}
				}
			}
			$output = preg_replace("/categorie[0-9]+\/([a-z0-9-]+)/", "'.$this->category.'$1'.$this->getParam('ext_url').'", $output);
			$output = preg_replace("/static[0-9]+\/([a-z0-9-]+)/", "'.$this->static.'$1'.$this->getParam('ext_url').'", $output);
		 ?>';

	}

dans la fonction plxMotorConstruct() de plxMyBetterUrls :
# pages statiques
		foreach($this->aStats as $numstat => $stat) {
			$link = "'.$this->lang.$this->static.'".$stat["url"]."'.$this->getParam('ext_url').'";
			if($get==$stat["url"]) {
				$get = "'.$this->lang.$this->static.'".$get;
			}
			if(basename($link)==basename($get)) {
				$this->get = "'.$this->lang.'static".intval($numstat)."/".$stat["url"];
				return;
			}
		}
# articles
		global $plxShow;
		foreach($this->plxGlob_arts->aFiles as $numart => $filename) {
			if(preg_match("/^[0-9]{4}.([0-9,|home|draft]*).[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/", $filename,$capture)) {
				$link = $capture[2]."'.$this->getParam('ext_url').'";
				if($link==basename($get)) {
					$this->get = "'.$this->lang.'article".intval($numart)."/".$capture[2];
					return;
				}
			}
		}

Ceci afin de me permettre d'avoir par exemple :
( avec $this->static = "pages" et this->article = "blog" via la configuration du plugin )
https://monsite.com/pages/groupe-de-la-page/ma-page-statique
et
https://monsite.com/blog/categorie-de-larticle/mon-premier-article

ou sinon en laissant vide dans la configuration du plugin :
https://monsite.com/groupe-de-la-page/ma-page-statique
et
https://monsite.com/categorie-de-larticle/mon-premier-article

je n'en ferais pas un plugin alternatif à plxMyBetterUrls pour le moment car je n'en ai pas le temps, mais je poste ici mon début de modifications de plxMyBetterUrls histoire de partager un peu. (on peux aller beaucoup plus loin pour par exemple (<- peut-être ce que je ferais) être dans un format %DATE% au lieu d'un format %CATEGORIE% par exemple pour les articles :
https://monsite.com/20170615/mon-premier-article

Cela peut sembler un peu confus mais cela ne l'est pas (du moins dans ma tête) ;)
Libre à quelqu'un de faire mieux et de le proposer en plugin ou en amélioration du plugin existant, l'idée principale étant d'arriver à pouvoir formater les urls un peu comme il est possible dans wp.
exemple :
http://example.com/yyyy/mm/dd/post-name
http://example.com/yyyy/mm/post-name
http://example.com/yyyy/post-name
http://example.com/%category%/post-name
http://example.com/%author%/post-name

Buster/NGINX/PHP7/PluXml5.8

Réponses

  • PierrePierre Member
    Le problème se pose au moment où un article appartient à plus d'une catégorie, une grande force de PluXml qui le différencie des CMS un peu plus "node-based" qui eux y vont de façon hiérarchique.
  • YannicYannic Member
    Pierre a écrit:
    Le problème se pose au moment où un article appartient à plus d'une catégorie, une grande force de PluXml qui le différencie des CMS un peu plus "node-based" qui eux y vont de façon hiérarchique.
    Salut, oui c'est un comportement plus hierarchique qui est recherché dans ce cas ci mais le fait d'avoir plusieurs categories n'est pas un problème en soit.

    Buster/NGINX/PHP7/PluXml5.8

  • PierrePierre Member
    Alors quand tu pointes directement sur un article (disons sur l'accueil) qui est relié à 3 catégories, laquelle tu vas glisser dans l'URL devant le nom d'article?
  • YannicYannic Member
    juin 2017 modifié
    Pierre a écrit:
    Alors quand tu pointes directement sur un article (disons sur l'accueil) qui est relié à 3 catégories, laquelle tu vas glisser dans l'URL devant le nom d'article?
    Ici c'est la première qui est prise mais les autres urls (categorie2/article et categorie3/article) ou meme (categorie1/categorie2/categorie3/article) fonctionnent aussi, toutefois il serais mieux d'ajouter au plugin une balise pour eviter le duplicate content

    Buster/NGINX/PHP7/PluXml5.8

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Facile :D

    sur la page d'accueil, l'url sera articles/mon-bel-article
    sur la page categorie1, l'url sera categorie1/mon-bel-article
    sur la page categorie2, l'url sera categorie2/mon-bel-article
    sur la page categorie3, l'url sera categorie3/mon-bel-article

    Dans les 4 cas le même contenu est généré.
    Par contre, dans l'entête de la page, pour ne pas être pénalisé pour le référencement, il faut ajouter une URl canonique :
    [== HTML ==]
    <link rel="canonical" href="http://monsite.com/articles/mon-bel-article" />
    

    On utilise la pseudo-categorie articles, pour faire la différence avec les pages statiques, flux RSS, tags, ...
  • YannicYannic Member
    juin 2017 modifié
    Oui c'est tout a fait cela bazooka07 avec la balise canonical si l'on est pas en multilingue :)

    Hormis que sur la page d'acceuil (du moins pour ma part) mes liens serons plutot categorie1/article au lieu articles/article mais sinon voila l'idée que tu resume bien :)

    Buster/NGINX/PHP7/PluXml5.8

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Comment tu choisis categorie1, par ordre alphabétique, selon l'ordre des catégories défini dans PluXml

    une catégorie peut être plus pertinente pour un article et moins pertinente pour un autre article.

    Supposons:
    [list=*]
    [*]3 catégories: cuisine, poissons et pâtisserie[/*]
    [*]2 articles un sur le cabillaud et un autre sur la tarte-aux-pommes[/*]
    [/list]
    En suivant ton raisonnement, sur la page d'accueil on aura:
    [list=*]
    [*]un lien sur cuisine/cabillaud[/*]
    [*]un lien sur cuisine/tarte-aux-pommes[/*]
    [/list]

    Alors que ces liens seraient plus intéressants sur la page d'accueil:
    [list=*]
    [*]un lien sur poissons/cabillaud[/*]
    [*]un lien sur patisserie/tarte-aux-pommes[/*]
    [/list]

    Pour l'instant PluXml ne permet pas de classer les catégories par intérêt pour chaque article
  • YannicYannic Member
    bazooka07 a écrit:
    Comment tu choisis categorie1, par ordre alphabétique, selon l'ordre des catégories défini dans PluXml
    ...
    Pour l'instant PluXml ne permet pas de classer les catégories par intérêt pour chaque article
    Je n'ai pas regardé cela pour le moment, je suis parti du principe de prendre le premier numero de categorie listé dans le fichier de l'article

    Buster/NGINX/PHP7/PluXml5.8

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    P.S. : Expressions régulières

    je te propose 2 noms de fichiers d'articles à tester:
    1111ab123012345678201706182300zarticle-qui-dit-rienqxml
    1112.000,home.001.201706182330.article-qui_cause-bien.xml

    Visiblement le 1er est non conforme.
    pourtant il passe très bien dans ta fonction preg_match(..)

    Voici une expression régulière qui ne matche que le 2ème nom qui est correct:
    /^\d{4}\.(\d{3}(?:,\d{3}|,home)*)\.\d{3}\.\d{12}\.[\w-]+\.xml$/

    Tu peux faire les tests sur regex101.com.

    Copie d'écran sur 1ère expression regex
    Copie d'écran sur 2ème expression regex

    Le caractère "." correspond à n'importe quel caractère
    \d correspond à n'inporte quel chiffre
    \w à a-z0-9_
    un article draft n'est pas publié (brouillon)
  • YannicYannic Member
    Oui oui merci bazooka07, mon premier code etait juste un petit test rapide en moins de 5 minutes de ce qui etait faisable et de ce que cela allais me donner au final dans le menu sans trop tripatouiller :)

    Buster/NGINX/PHP7/PluXml5.8

  • krockroc Member

    Je rebondis sur ce fil pour savoir comment faire pour afficher une URL canonique dans le header ? Comment la récupérer ? Merci.

  • krockroc Member
    juin 2020 modifié

    Merci Bazooka ! Je peux juste remplacer ce php sans prendre tout le reste ?
    edit : ah non, ça m'a cassé mon menu (toutes les categories, même celle masquées s'affichent, et mes liens vers mes statiques ont disparus) :)

    Du coup j'ai juste copié la méthode, et ça fonctionne, merci !
    Par contre, du coup le lien "Canonical" n'est pas une URL réecrite. Ce n'est pas gênant pour le SEO ?

    https://www.krocui.com/article/bonheur
    devient
    link rel="canonical" href="https://www.krocui.com/index.php?article/bonheur"

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