Comment changer tous les liens internes d'un site ?

WRInaute passionné
Bonjour,

J'ai un script à faire qui s'annonce coriace pour mon piètre niveau en PHP.

Voilà, j'ai 800 articles, avec des liens internes entre eux. Je vais changer les URLs de ces articles, donc je dois changer les liens qui s'y trouvent. Ou alors mon référencement va se casser la figure car la redirection 301 fera doublon avec les anciens liens toujours en activité. Et je ne peux pas les changer manuellement (il doit y en avoir plus de 10000)

Donc, pour l'instant, j'ai trois texte comme ça par exemple :
Code:
Premier article très intéressant avec un lien vers le <a href="http://www.monsite.com/deuxieme.htm">deuxième</a> et vers le <a href="http://www.monsite.com/troisieme.htm">troisième</a>.

Code:
Deuxième article très intéressant avec un lien vers le <a href="http://www.monsite.com/premier.htm">premier</a>

Code:
Troisième article super sans lien.

Ensuite, les trois articles devront être comme ça (ça se passe dans l'URL) :

Code:
Premier article très intéressant avec un lien vers le <a href="http://www.monsite.com/article.php?record=2">deuxième</a> et vers le <a href="http://www.monsite.com/article.php?record=3"]troisième</a>.
Code:
Deuxième article très intéressant avec un lien vers le <a href="http://www.monsite.com/article.php?record=1">premier</a>

Code:
Troisième article super sans lien.

Comme vous le voyez, le mot-clef est désormais remplacé par l'ID de l'article (il n'y a plus de réécriture d'URL)

Donc :
1) Trouver chaque lien.
2) Pour chaque lien trouvé, isoler le mot-clef.
3) Allez chercher dans la base de donner l'ID qui correspond au tuple ayant ce mot-clef.
4) Faire le remplacement dans le lien.

Le script me fait peur rien que d'y penser... Si vous avez déjà été confronté au problème, j'espère que vous pourrez m'aider !
 
WRInaute passionné
Tu pourrais le faire avec un coup de replace dans mysql. Je pense que c'est la technique la plus propre.
si ton code est stocké en html dans ta base et que tu as bien
Code:
<a href="http://www.monsite.com/article.php?record=1">
c'est plutôt facile, je vais te chercher la requete
 
WRInaute passionné
si ton champ est "txt" dans la table "content" (fait par contre un backup avant)
tu pourrais tester :
Code:
UPDATE content SET txt = REPLACE ('http://www.monsite.com/deuxieme.htm', 'deuxieme.htm', 'article.php?record=2');

Edit si tu as 1000 liens avec 100 ID à éditer, ça passe, sinon tu va devoir y aller un peu plus à la main, ou créer une boucle (mais je ne vois pas comment "boucler" premier, deuxieme, etc..
 
WRInaute passionné
Salut Julia41,

Oui en fait ça me paraissait compliqué mais en l'écrivant tout à l'heure, la solution m'est apparue assez simple.

Je vais chercher pour chaque tuple l'id qui correspond au mot-clef. Je crée le nouveau masque du lien. Ensuite je fais un search-replace pour tous les tuples sur l'ancien mot-clef. Avec une boucle pour faire les 800 tuples d'un coup.

Ca devrait bien fonctionner comme ça à vue de nez.
 
WRInaute impliqué
sinon dans le fond, la démarche me surprend un peu..

si tu tiens à avoir l'id dans l'url, je trouve plus propre un lien comme

Code:
http://www.monsite.com/deuxieme-2.htm

que un lien comme
Code:
http://www.monsite.com/article.php?record=2
 
WRInaute passionné
Certes, mais je n'ai pas le choix, je change de script et le nouveau n'accepte pas l'URL-rewriting.

Donc là j'ai pondu un code, mais il ne remplace ou n'update rien. J'ai pas de message d'erreur, tout s'affiche quand je teste. Mais ça ne change rien au final. Donc à mon sens, soit le problème vient du str_replace() soit de la requête update.

Si vous voulez bien y jeter un oeil... merci d'avance.

Code:
// On liste tous les articles
$liste=
"SELECT *
FROM 
ccs_custom_database_8
ORDER BY field_28
";
$resultat = mysql_query("$liste");
while($R=mysql_fetch_array($resultat))
{
//on récupère l'id et le mot clef de chaque article
$id=$R['primary_id_field'];
$mot_clef=$R['field_28'];
//la chaîne que l'on va devoir remplacer
$lienAncien="http://www.site.com/$mot_clef.htm";

// Maintenant on va faire le remplacement dans les articles, les uns après les autres
$liste2=
"SELECT 
primary_id_field,
field_29
FROM 
ccs_custom_database_8
WHERE  
field_28='".$mot_clef."'
";
$resultat2 = mysql_query("$liste2");
while($R=mysql_fetch_array($resultat2))
{
$id2=$R['primary_id_field'];//l'id de l'article
$field_29=stripslashes($R['field_29']);//le contenu de l'article
//$lienAncien a été créé lors de la précédente requête
$field_29=str_replace($lienAncien,"http://www.site.com/article.php?record={$id}",$field_29);

//maintenant on update les articles les uns après les autres.
$updater="UPDATE  `ccs_custom_database_8` SET field_29='".$field_29."' WHERE primary_id_field ='".$id2."'"; 
 mysql_query($updater) OR die(mysql_error());

;}
;}

Update pas, ou ne remplace pas la chaîne donc... Je n'exclue pas que la logique du script soit mauvaise, mais je doute que ça viennent de ça.
 
WRInaute accro
Sans l'URL Rewriting, il y a aussi la solution du path_info pour avoir des URL SEO friendly:
Code:
http://www.monsite.com/article.php/2
 
WRInaute passionné
C'est bon à savoir, mais il m'est impossible de toucher quoi que ce soit aux URL en question.

Je veux donc changer tous les liens internes et puis je ferai une redirection 301. Tant pis pour la perte provisoire de référencement, le script en vaut la peine.
 
WRInaute passionné
Meeuuuhhh a dit:
Code:
// On liste tous les articles
$liste=
"SELECT *
FROM 
ccs_custom_database_8
ORDER BY field_28
";
$resultat = mysql_query("$liste");
Ca ça pique un peu par contre.
Code:
$resultat = mysql_query($liste);
 
WRInaute passionné
Merci pour ta réponse Julia41, en fait j'ai résolu le truc, j'ai viré la boucle, je vais cliquer sur les 800 articles les uns après les autres et faire les update au coup par coup. 800 cliques, en 30 minutes c'est fini, ça ira plus vite que de me creuser la cervelle sur le script.
 
WRInaute passionné
.eux :)

Comme dit la légion "la sueur remplace le sang", chez nous la technique remplace la sueur. Quand on l'a pas... Faut suer un peu (800 cliques sur la sourie ce n'est pas trop épuisant quand même, c'était jouable et l'opération est réussie)
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut