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 
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