[SPIP Zone] Personnaliser les URL

Salut,

je cherche à personnaliser mes url à partir des url propre2 (/titre.html) pour avoir /titre-surtitre.html.

Il me semble avoir vu passer un fil là dessus mais je ne le retrouve pas et je fouille dans le plugin Urls étendues du core (notamment /urls/propres.php) mais je ne vois pas bien par ou prendre le truc...

                 jean marie

Le 01/10/2018 à 13:59, Jean Marie Grall a écrit :

Salut,

je cherche à personnaliser mes url à partir des url propre2 (/titre.html) pour avoir /titre-surtitre.html.

Il me semble avoir vu passer un fil là dessus mais je ne le retrouve pas et je fouille dans le plugin Urls étendues du core (notamment /urls/propres.php) mais je ne vois pas bien par ou prendre le truc...

                 jean marie

----
spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

Salut,

Peut-être regarder du côté de la valeur de titre dans la déclaration de l'objet : API de déclaration d’objets éditoriaux - Programmer avec SPIP 4
Comme c'est un select sql on doit pouvoir déclarer un truc du genre :
'titre' => 'CONCAT(titre,-,surtitre) AS titre, "" AS lang'

Hop,

Le 01/10/2018 à 13:59, Jean Marie Grall a écrit :

Salut,

je cherche à personnaliser mes url à partir des url propre2 (/titre.html) pour avoir /titre-surtitre.html.

Il me semble avoir vu passer un fil là dessus mais je ne le retrouve pas et je fouille dans le plugin Urls étendues du core (notamment /urls/propres.php) mais je ne vois pas bien par ou prendre le truc...

Tu peux passer par le pipeline propres_creer_chaine_url pour faire ça. Exemple tiré d'un site que tu connais bien :wink:

function scop_propres_creer_chaine_url($flux){
  // si c'est un arrticle de la rubrique entrepreneurs
  if ($flux['objet']['type'] == 'article' AND $id_article = $flux['objet']['id_objet']) {
    $article = sql_fetsel("*","spip_articles","id_article = $id_article");
    if ($article['id_secteur'] == lire_config('scop/secteur_entrepreneurs',2)) {
      // le titre de l'article est nom prenom (champ extra entrepreneur)
      include_spip('action/editer_url');
      $url = url_nettoyer($article['entrepreneur'],_URLS_PROPRES_MAX,_URLS_PROPRES_MIN,'-',_url_minuscules?'strtolower':'');
      $flux['data'] = $url;
    }
  }
  return $flux;
}

++
b_b

Salut,

bon, je reviens là dessus après la bataille.

En fait, j’ai un peu précisé le besoin : il faudrait ajouter, pour tous les articles d’un secteur, un mot en début de chaine :

J’imagine bien que ça se joue dans $url = url_nettoyer($article[‹ titre ›],_URLS_PROPRES_MAX,_URLS_PROPRES_MIN,’-’,_url_minuscules?‹ strtolower ›:’’); mais je ne vois pas trop comment.

J’ai aussi ajouté à mon paquet.xml mais ne change rien… il y a autre chose à faire ?

Merci,

jean marie

Ca mériterait une petite doc en effet.

Si ca peut aider voici comment je procède pour faire une chose similaire. Dans mon cas il s’agit d’ajouter « /cartes/ » dans l’url s’il y’a un certain mot clé sur l’article, et d’envoyer « cartes » dans ENV si y’a « cartes » dans l’url :

On ajoute aussi /de/ , /en/ etc au début de l’url si l’article n’est pas en français, ou parfois la date.

En fait il faut surcharger les fonctions urls_generer_url_XXX de ce que j’ai compris, mais j’avais pas mal tâtonné en effet.

Donc, dans mes_options.php :

/* Routeur spécial */

// urls
//$GLOBALS[‹ type_urls ›] = ‹ propres ›;
$type_urls = ‹ libres ›;
define(‹ _SET_HTML_BASE ›, 1);
define(‹ _URLS_PROPRES_MAX ›, 50);
define(‹ _FORCE_URLS_PROPRES ›,true);

// https://code.spip.net/@urls_libres_dist
function urls_libres($i, &$entite, $args = ‹  ›, $ancre = ‹  ›) {

// ajouter des compositions dans ENV selon les urls

// urls_propres_dist
$f = charger_fonction(‹ propres ›, ‹ urls ›);

// composition rapide si url facile a voir
if(preg_match(« ^cartes|maps|karten|mapas/ »,$i)){
$args[‹ composition ›] = ‹ cartes › ;
}

$r = $f($i, $entite, $args, $ancre) ;
return $r ;
}

// Règles pour générer une url pour un article
function urls_generer_url_article($id){

// personnaliser les urls

// deduire l’url des infos en BDD
if ($s = sql_query(
« SELECT titre, date_redac,id_secteur,id_rubrique,url_site, lang
FROM spip_articles WHERE id_article=$id »
) AND $t = sql_fetch($s)) {

$lang = $t[‹ lang ›] ;

if($t[‹ url_site ›]){
$url = preg_replace(‹ ,^/, ›, ‹  ›, $t[‹ url_site ›]);
if($lang != « fr »)
$url = $lang .« / » . $url ;

}
else{
// est-ce une carte ?
if($carte = sql_getfetsel(« id_mot »,« spip_mots_liens »,« objet=‹ article › and id_objet= » . $id . " and id_mot=617")){

$st = texte_url_propre($t[‹ titre ›], ‹ article ›, $id);

if($lang == « de »)
$url = « karten/ » . annee($t[‹ date_redac ›]) . « / » . mois($t[‹ date_redac ›]). « / » . $st ;

if($lang == « en »)
$url = « maps/ » . $st ;

if($lang == « fr »)
$url = « cartes/ » . $st ;

if($lang == « es »)
$url = « mapas/ » . $st ;
}else{
include_spip(« inc/filtres »);
$annee = annee($t[‹ date_redac ›]);
$mois = mois($t[‹ date_redac ›]);
$url = $lang .« / ». $annee .« / » . $mois . « / » . texte_url_propre($t[‹ titre ›], ‹ article ›, $id);
}
}
}

if(!$url)
spip_log(« erreur de creation d’url avec $id_article »,« urls.1 »);

// enregistrer l’url la premiere fois.

$type = « article » ;
$set = array(‹ url › => $url, ‹ type › => $type, ‹ id_objet › => $id, ‹ date › => date(« Y-m-d H:i:s »));
if(!sql_getfetsel(« id_objet »,« spip_urls »,« url= » . sql_quote($url). " and type=‹ $type ›")){
sql_insertq(« spip_urls »,$set);
}

return url_absolue($set[‹ url ›],url_de_base());
}

// transformer un titre en chaine pour url
function texte_url_propre($titre, $type=‹ article ›, $id_objet=0) {
include_spip(« inc/filtres »);
include_spip(« inc/charsets »);
$url = translitteration(corriger_caracteres(
supprimer_tags(supprimer_numero(extraire_multi($titre)))
));
$url = @preg_replace(‹ ,[[:punct:][:space:]]+,u ›, ’ ‹ , $url);
// S’il reste des caracteres non latins, utiliser l’id a la place
if (preg_match(« ,[^a-zA-Z0-9 ], », $url)) {
$url = $type.$id_objet;
}
else {
$mots = explode( › ‹ , $url);
$url = ‹  ›;
foreach ($mots as $mot) {
if (!$mot) continue;
$url2 = $url . ›-'.$mot;
if (strlen($url2) > 35) {
break;
}
$url = $url2;
}
$url = substr($url, 1);
//echo « $url
 »;
if (strlen($url) < 2) $url = $type.$id_objet;
}
return $url;
}

BoOz

Le mer. 28 nov. 2018 à 17:59, Jean Marie Grall <jeanmarie.listes@cousumain.info> a écrit :

Salut,

bon, je reviens là dessus après la bataille.

En fait, j’ai un peu précisé le besoin : il faudrait ajouter, pour tous les articles d’un secteur, un mot en début de chaine : www.domaine.net/MonMot-Titre-de-mon-article.html

J’imagine bien que ça se joue dans $url = url_nettoyer($article[‹ titre ›],_URLS_PROPRES_MAX,_URLS_PROPRES_MIN,‹ - ›,_url_minuscules?‹ strtolower ›:‹  ›); mais je ne vois pas trop comment.

J’ai aussi ajouté à mon paquet.xml mais ne change rien… il y a autre chose à faire ?

Merci,

jean marie

Le 12/10/2018 à 12:51, Bruno Bergot a écrit :

Hop,

Le 01/10/2018 à 13:59, Jean Marie Grall a écrit :

Salut,

je cherche à personnaliser mes url à partir des url propre2 (/titre.html) pour avoir /titre-surtitre.html.

Il me semble avoir vu passer un fil là dessus mais je ne le retrouve pas et je fouille dans le plugin Urls étendues du core (notamment /urls/propres.php) mais je ne vois pas bien par ou prendre le truc…

Tu peux passer par le pipeline propres_creer_chaine_url pour faire ça. Exemple tiré d’un site que tu connais bien :wink:

function scop_propres_creer_chaine_url($flux){
// si c’est un arrticle de la rubrique entrepreneurs
if ($flux[‹ objet ›][‹ type ›] == ‹ article › AND $id_article = $flux[‹ objet ›][‹ id_objet ›]) {
$article = sql_fetsel(« * »,« spip_articles »,« id_article = $id_article »);
if ($article[‹ id_secteur ›] == lire_config(‹ scop/secteur_entrepreneurs ›,2)) {
// le titre de l’article est nom prenom (champ extra entrepreneur)
include_spip(‹ action/editer_url ›);
$url = url_nettoyer($article[‹ entrepreneur ›],_URLS_PROPRES_MAX,_URLS_PROPRES_MIN,‹ - ›,_url_minuscules?‹ strtolower ›:‹  ›);
$flux[‹ data ›] = $url;
}
}
return $flux;
}

++
b_b


spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

Oh j'ai l'impression que tu te sers parfois du champ #URL_SITE des articles
pour y mettre une url dérogatoire, au lieu de te servir de la table d'urls gérées par SPIP.

J'imagine que tu n'avais pas besoin de ce champ de la table ARTICLES,
et que tu as préféré l'utiliser car ça évite une liaison avec la table des urls SPIP.
Mais du coup dans ce cas tu perd la gestion de l'historique des changements
ou bien c'est "en double" ?

Et il faut qqchose de spécial dans le htaccess aussi ?

JL

Le 29/11/2018 à 12:30, BoOz a écrit :

Si ca peut aider voici comment je procède pour faire une chose similaire. Dans mon cas il s'agit d'ajouter "/cartes/" dans l'url s'il y'a un certain mot clé sur l'article, et d'envoyer "cartes" dans ENV si y'a "cartes" dans l'url :

On ajoute aussi /de/ , /en/ etc au début de l'url si l'article n'est pas en français, ou parfois la date.

En fait il faut surcharger les fonctions urls_generer_url_XXX de ce que j'ai compris, mais j'avais pas mal tâtonné en effet.

Donc, dans mes_options.php :

/* Routeur spécial */

// urls
//$GLOBALS['type_urls'] = 'propres';
$type_urls = 'libres';
define('_SET_HTML_BASE', 1);
define('_URLS_PROPRES_MAX', 50);
define('_FORCE_URLS_PROPRES',true);

// https://code.spip.net/@urls_libres_dist
function urls_libres($i, &$entite, $args = '', $ancre = '') {

 // ajouter des compositions dans ENV selon les urls

 // urls\_propres\_dist
 $f = charger\_fonction\(&#39;propres&#39;, &#39;urls&#39;\);

 // composition rapide si url facile a voir
 if\(preg\_match\(&quot;\`^cartes|maps|karten|mapas/\`&quot;,$i\)\)\{
     $args\[&#39;composition&#39;\] = &#39;cartes&#39; ;
 \}

 $r = $f\($i, $entite, $args, $ancre\) ;
 return $r ;

}

// Règles pour générer une url pour un article
function urls_generer_url_article($id){

  // personnaliser les urls

 // deduire l&#39;url des infos en BDD
 if \($s = sql\_query\(
         &quot;SELECT titre, date\_redac,id\_secteur,id\_rubrique,url\_site, lang
         FROM spip\_articles WHERE id\_article=$id&quot;
     \) AND $t = sql\_fetch\($s\)\) \{

     $lang  = $t\[&#39;lang&#39;\] ;

     if\($t\[&#39;url\_site&#39;\]\)\{
         $url = preg\_replace\(&#39;,^/,&#39;, &#39;&#39;, $t\[&#39;url\_site&#39;\]\);
         if\($lang \!= &quot;fr&quot;\)
             $url = $lang \.&quot;/&quot; \. $url ;

     \}
     else\{
         // est\-ce une carte ?
         if\($carte = sql\_getfetsel\(&quot;id\_mot&quot;,&quot;spip\_mots\_liens&quot;,&quot;objet=&#39;article&#39; and id\_objet=&quot; \. $id \. &quot; and id\_mot=617&quot;\)\)\{

             $st = texte\_url\_propre\($t\[&#39;titre&#39;\], &#39;article&#39;, $id\);

             if\($lang == &quot;de&quot;\)
                 $url = &quot;karten/&quot; \. annee\($t\[&#39;date\_redac&#39;\]\) \. &quot;/&quot; \. mois\($t\[&#39;date\_redac&#39;\]\)\. &quot;/&quot; \. $st ;

             if\($lang == &quot;en&quot;\)
                 $url = &quot;maps/&quot; \. $st ;

             if\($lang == &quot;fr&quot;\)
                 $url = &quot;cartes/&quot; \. $st ;

             if\($lang == &quot;es&quot;\)
                 $url = &quot;mapas/&quot; \. $st ;
         \}else\{
             include\_spip\(&quot;inc/filtres&quot;\);
             $annee = annee\($t\[&#39;date\_redac&#39;\]\);
             $mois = mois\($t\[&#39;date\_redac&#39;\]\);
             $url = $lang \.&quot;/&quot;\. $annee \.&quot;/&quot; \. $mois \. &quot;/&quot; \. texte\_url\_propre\($t\[&#39;titre&#39;\], &#39;article&#39;, $id\);
         \}
     \}
 \}

 if\(\!$url\)
     spip\_log\(&quot;erreur de creation d&#39;url avec $id\_article&quot;,&quot;urls\.1&quot;\);

 // enregistrer l&#39;url la premiere fois\.

 $type = &quot;article&quot; ;
 $set = array\(&#39;url&#39; =&gt; $url, &#39;type&#39; =&gt; $type, &#39;id\_objet&#39; =&gt; $id, &#39;date&#39; =&gt; date\(&quot;Y\-m\-d H:i:s&quot;\)\);
 if\(\!sql\_getfetsel\(&quot;id\_objet&quot;,&quot;spip\_urls&quot;,&quot;url=&quot; \. sql\_quote\($url\)\. &quot; and type=&#39;$type&#39;&quot;\)\)\{
     sql\_insertq\(&quot;spip\_urls&quot;,$set\);
 \}

 return url\_absolue\($set\[&#39;url&#39;\],url\_de\_base\(\)\);

}

// transformer un titre en chaine pour url
function texte_url_propre($titre, $type='article', $id_objet=0) {
include_spip("inc/filtres");
include_spip("inc/charsets");
$url = translitteration(corriger_caracteres(
supprimer_tags(supprimer_numero(extraire_multi($titre)))
));
$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
// S'il reste des caracteres non latins, utiliser l'id a la place
if (preg_match(",[^a-zA-Z0-9 ],", $url)) {
$url = $type.$id_objet;
}
else {
$mots = explode(' ', $url);
$url = '';
foreach ($mots as $mot) {
if (!$mot) continue;
$url2 = $url .'-'.$mot;
if (strlen($url2) > 35) {
break;
}
$url = $url2;
}
$url = substr($url, 1);
//echo "$url<br>";
if (strlen($url) < 2) $url = $type.$id_objet;
}
return $url;
}

BoOz

Oui c’est bien ca l’utilisation du champ #URL_SITE est détournée dans cet exemple pour y mettre parfois une url perso, en effet captée par htaccess dans ce cas. C’est un vestige du passé.

Le jeu. 29 nov. 2018 à 13:06, JLuc <jluc@no-log.org> a écrit :

Oh j’ai l’impression que tu te sers parfois du champ #URL_SITE des articles
pour y mettre une url dérogatoire, au lieu de te servir de la table d’urls gérées par SPIP.

J’imagine que tu n’avais pas besoin de ce champ de la table ARTICLES,
et que tu as préféré l’utiliser car ça évite une liaison avec la table des urls SPIP.
Mais du coup dans ce cas tu perd la gestion de l’historique des changements
ou bien c’est « en double » ?

Et il faut qqchose de spécial dans le htaccess aussi ?

JL

Le 29/11/2018 à 12:30, BoOz a écrit :

Si ca peut aider voici comment je procède pour faire une chose similaire. Dans mon cas il s’agit d’ajouter « /cartes/ »
dans l’url s’il y’a un certain mot clé sur l’article, et d’envoyer « cartes » dans ENV si y’a « cartes » dans l’url :

On ajoute aussi /de/ , /en/ etc au début de l’url si l’article n’est pas en français, ou parfois la date.

En fait il faut surcharger les fonctions urls_generer_url_XXX de ce que j’ai compris, mais j’avais pas mal tâtonné en effet.

Donc, dans mes_options.php :

/* Routeur spécial */

// urls
//$GLOBALS[‹ type_urls ›] = ‹ propres ›;
$type_urls = ‹ libres ›;
define(‹ _SET_HTML_BASE ›, 1);
define(‹ _URLS_PROPRES_MAX ›, 50);
define(‹ _FORCE_URLS_PROPRES ›,true);

// https://code.spip.net/@urls_libres_dist
function urls_libres($i, &$entite, $args = ‹  ›, $ancre = ‹  ›) {

// ajouter des compositions dans ENV selon les urls

// urls_propres_dist
$f = charger_fonction(‹ propres ›, ‹ urls ›);

// composition rapide si url facile a voir
if(preg_match(« ^cartes|maps|karten|mapas/ »,$i)){
$args[‹ composition ›] = ‹ cartes › ;
}

$r = $f($i, $entite, $args, $ancre) ;
return $r ;
}

// Règles pour générer une url pour un article
function urls_generer_url_article($id){

// personnaliser les urls

// deduire l’url des infos en BDD
if ($s = sql_query(
« SELECT titre, date_redac,id_secteur,id_rubrique,url_site, lang
FROM spip_articles WHERE id_article=$id »
) AND $t = sql_fetch($s)) {

$lang = $t[‹ lang ›] ;

if($t[‹ url_site ›]){
$url = preg_replace(‹ ,^/, ›, ‹  ›, $t[‹ url_site ›]);
if($lang != « fr »)
$url = $lang .« / » . $url ;

}
else{
// est-ce une carte ?
if($carte = sql_getfetsel(« id_mot »,« spip_mots_liens »,« objet=‹ article › and id_objet= » . $id . " and
id_mot=617")){

$st = texte_url_propre($t[‹ titre ›], ‹ article ›, $id);

if($lang == « de »)
$url = « karten/ » . annee($t[‹ date_redac ›]) . « / » . mois($t[‹ date_redac ›]). « / » . $st ;

if($lang == « en »)
$url = « maps/ » . $st ;

if($lang == « fr »)
$url = « cartes/ » . $st ;

if($lang == « es »)
$url = « mapas/ » . $st ;
}else{
include_spip(« inc/filtres »);
$annee = annee($t[‹ date_redac ›]);
$mois = mois($t[‹ date_redac ›]);
$url = $lang .« / ». $annee .« / » . $mois . « / » . texte_url_propre($t[‹ titre ›], ‹ article ›, $id);
}
}
}

if(!$url)
spip_log(« erreur de creation d’url avec $id_article »,« urls.1 »);

// enregistrer l’url la premiere fois.

$type = « article » ;
$set = array(‹ url › => $url, ‹ type › => $type, ‹ id_objet › => $id, ‹ date › => date(« Y-m-d H:i:s »));
if(!sql_getfetsel(« id_objet »,« spip_urls »,« url= » . sql_quote($url). " and type=‹ $type ›")){
sql_insertq(« spip_urls »,$set);
}

return url_absolue($set[‹ url ›],url_de_base());
}

// transformer un titre en chaine pour url
function texte_url_propre($titre, $type=‹ article ›, $id_objet=0) {
include_spip(« inc/filtres »);
include_spip(« inc/charsets »);
$url = translitteration(corriger_caracteres(
supprimer_tags(supprimer_numero(extraire_multi($titre)))
));
$url = @preg_replace(‹ ,[[:punct:][:space:]]+,u ›, ’ ‹ , $url);
// S’il reste des caracteres non latins, utiliser l’id a la place
if (preg_match(« ,[^a-zA-Z0-9 ], », $url)) {
$url = $type.$id_objet;
}
else {
$mots = explode( › ‹ , $url);
$url = ‹  ›;
foreach ($mots as $mot) {
if (!$mot) continue;
$url2 = $url . ›-'.$mot;
if (strlen($url2) > 35) {
break;
}
$url = $url2;
}
$url = substr($url, 1);
//echo « $url
 »;
if (strlen($url) < 2) $url = $type.$id_objet;
}
return $url;
}

BoOz


spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone