L'idée
j'ai un blog wordpress, avec des articles tagués, du contenu image à l'occasion.J'ai rapatrié tous mes posts avec leur contenu sur un nouveau système de blog (celui de mazenod.fr accordéon CMS)
structure de word Press
posts

categories
post2categories

strucutre de l'objet blog d'accordéon CMS
état du référencement
Au départ j'étais parti sur .htaccess simple qui redirigeait systématiquement vers la nouvelle page d'index du nouveau blogLocation: http://mazenod.fr/blog/
Ce n'est pas une bonne démarche, car je perds tous le bénéfice de mes anciens posts il faut donc les rediriger un par un.Pour ça je jette un oeil aux url de mon blog word press connues de google ...

C'est la pagaille!!
url wordpress
grosso modoun post à pour url premiere_categorie/post_name
les pages de résultats par date de la forme annee/mois avec le numero de pager derrière
les pages de catégorie de la forme category/nom_categorie avec le numéro de pager derrière
Ces url représentent 90% des urls que google connait de mon ancien blog, les 10% restants sont des urls de recherche full text
url accordéon CMS
Voyons voir le mapping de ces url avec celui de l'accordéon, extrait de routing.ymlblog_index:
url: /blog/
param: { module: sfCmsBlog, action: list }
blog_index_pager:
url: /blog/p/:page
param: { module: sfCmsBlog, action: list }
blog_tag_pager:
url: /blog/tag/:tag
param: { module: sfCmsBlog, action: list }
blog_archives_year:
url: /blog/archives/:year
param: { module: sfCmsBlog, action: list }
blog_archives_year_pager:
url: /blog/archives/:year/p/:page
param: { module: sfCmsBlog, action: list }
blog_archives_month:
url: /blog/archives/:year/:month
param: { module: sfCmsBlog, action: list }
blog_archives_month_pager:
url: /blog/archives/:year/:month/p/:page
param: { module: sfCmsBlog, action: list }
blog_show:
url: /blog/:stripped_title.html
param: { module: sfCmsBlog, action: show }
donc un post génère deux redirections url, une categorie génère une redirection, une combinaison annee / mois genere une redirection url.
le .htaccess
voici le script php qui va me générer toutes les redirections voulues... il a l'allure d'un batch symfony mais c'est presque juste pour la forme. Il est verbeux et crade mais surtout là pour donner une idée et être adapté<?php
define('SF_ROOT_DIR', realpath(dirname(__FILE__).'/..'));
define('SF_APP', 'back');
define('SF_ENVIRONMENT', 'cli');
define('SF_DEBUG', true);
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
//desactiver ecoding: utf8 dans config/databases.yml pour les problèmes de charset
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'blog_onfamp_net';
$url_source='/';
$host_local = 'localhost';
$user_local = 'root';
$pass_local = '';
$db_local = 'mazenod_fr';
$url_target='http://mazenod.fr/';
function sansAccent($chaine){
return strtr($chaine, array(utf8_decode("è"),utf8_decode("é"),utf8_decode("à")), array("e","e","a"));
}
function stripText($text)
{
$text = myTools::sansAccent(strtolower(utf8_decode($text)));
$text = preg_replace('/\W/', ' ', $text);
$text = preg_replace('/\ +/', '-', $text);
$text = preg_replace('/\-$/', '', $text);
$text = preg_replace('/^\-/', '', $text);
return $text;
}
$handle = fopen(".htaccess", 'w');
mysql_connect($host, $user, $pass) or die("connexion impossible");
mysql_select_db($db) or die("selection BDD impossible");
for($i=2007;$i<=2008;$i++)
{
for($j=1;$j<=12;$j++)
{
if($j<10)
{
$n="0".$j;
}
else
{
$n=$j;
}
fwrite($handle, "redirect 301 ".$url_source.$i."/".$n."/ ".$url_target."blog/archives/".$i."/".$n."\n");
fwrite($handle, "RewriteRule ^".$i."/".$n."/page/(.*)/\$ ".$url_target."blog/archives/".$i."/".$n."/p/\$1 [R=301,L]\n");
//fwrite($handle, "redirect 301 ".$url_source.$i."/".$n."/* ".$url_target."blog/archives/".$i."/".$n."\n");
}
}
$category = array();
$res = @mysql_query("SELECT * FROM wp_categories") or die("selection impossible");
while($cat = mysql_fetch_object($res))
{
$category[$cat->cat_ID] = $cat->category_nicename;
fwrite($handle, "redirect 301 ".$url_source."category/".$cat->category_nicename."/ ".$url_target."blog/tag/".$cat->category_nicename."\n");
fwrite($handle, "RewriteRule ^category/".$cat->category_nicename."/page/(.*)/\$ ".$url_target."blog/tag/".$cat->category_nicename."/p/\$1 [R=301,L]\n");
//fwrite($handle, "redirect 301 ".$url_source."category/".$cat->category_nicename."/* ".$url_target."blog/tag/".$cat->category_nicename."\n");
}
$blog = array();
$res = mysql_query("SELECT * FROM wp_posts");
while($post = mysql_fetch_object($res))
{
$post->tags = array();
$resCat = mysql_query("SELECT * FROM wp_post2cat WHERE post_id=".$post->ID);
while($cat = mysql_fetch_object($resCat))
{
array_push($post->tags, $category[$cat->category_id]);
}
array_push($blog, $post);
}
mysql_close();
$databaseManager = new sfDatabaseManager();
$databaseManager->initialize();
foreach($blog AS $post)
{
$sfPost = SfCmsBlogPeer::retrieveByStrippedTitle(stripText($post->post_title));
if($sfPost->getId())
{
fwrite($handle, "redirect 301 ".$url_source.array_shift($post->tags)."/".$post->post_name."/ ".$url_target."blog/".$sfPost->getStrippedTitle().".html\n");
}
else
{
echo $post->post_title." ---- ".myTools::stripText($post->post_title)."\n";
}
}
fwrite($handle, "RewriteRule ^page/(.*)/\$ ".$url_target."blog/p/\$1 [R=301,L]\n");
fwrite($handle, "redirect 301 ".$url_source." ".$url_target."blog/\n");
mon .htaccess récupère maintenant un maximum des url précedemment indexées sur mon blog. je dervais normalement avoir un transfert de PR sur chacun de mes nouveayu post



