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
post.gif

categories

categorie.gif

post2categories

categorie2post.gif

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 blog

Location: 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 ...
url_wordpress.gif
C'est la pagaille!!

url wordpress

grosso modo
un 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.yml

blog_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