sept 11
3
Projet WordPress vers un site statique
Avertissement:
Comme le problèmes était critique Ce script à été créer vite fait à fin de pouvoir corriger le problème sans perdre de temps ni d’indexation je met tous de même la méthodologie a votre disposition tout en sachant que ce script est loin d’être parfait donc veuillez utiliser cette information à vos propre risque et périles.
Important:
J’ai mis tous les fichiers discuté dans cette page dans un fichier zip je vous recommande de le télécharger et de suivre à partir de ces fichiers:
Télécharger tous les fichiers PHP
Préambule:
Ya environ un an nous avons monter script auto générais des article à partir d’une liste à fin de populer un plus gros index count le script fonctionne bien mais l’erreur que j’ai faitr c’est qu’il créer trop de categories du au modèle de données mysql des categories nous avons maintenant un problème les query sql sont si longue à rouler qu’elles ralentissent notre serveur au complet.
Nos Problèmes:
- Le script à généré plus de 239 000 posts
- La base de données fait plus de 1.6 Gig
- Les requêtes sql sont tellement longue à exécuter (surtout ceux qui implique un count) qu’elle rend le serveur mysql inutilisable aux autres utilisateurs du serveurs …
La solution Facile:
Fermer le site et ainsi perdre tous le traffic et la moneitisation lier au traffic durement gagné.
La solution Utilisé:
Créer un script qui générera des pages semi statique (elles utiliseront le php include mais pas le serveur sql).
Pourquoi ne pas utilisé une solution déja fait tel que « Really Static » plutot qu’une solution maison?
Really static et la plupart des plugin que j’ai vu utilise le moteur de WP pour générer les page statique comme chacune des opération sur le word press compromet les autres sites du serveur nous ne pouvon pas nous permettre de compromettre le serveur durant plusieurs jours durant la génération des pages statiques.
Vous pouvez voir la page original qui ma inspiré à créer ce script:
Un autre technique de transfert qui utilise WP
Donc voici le plan:
- Copier la base de données WP sur un autre compte d’hébergement.
- Créer des fichiers include pour le header, footer, maincontent et sidebar
- Créer un script qui va looper dans la database et générer et sauvegarder des pages statiques du rendu de notre blog
- Recopier les pages généré sur notre compte original
- Créer un htacess qui redirigera les canonical url vers les pages statiques
- Créer un fichier 404 custom pour les pages qui seront perdu (juste en cas de …)
1. Copier la base de données WP sur un autre compte d’hébergement.
Donc a partir d’une console je crée un full backup de la db:
$ mysqldump -h localhost -u username -p database_name > backup_db.sql
et le restore sur le compte temporaire qui me servira de générateur a partir de de la console:
$ mysqldump -h localhost -u username -p database_name < backup_db.sql
*Veuillez noter que j’utilise un 2ieme compte car j’ai suspendu le compte originale durant l’opération du au fait que la db WP du Blog fesait planter nos autre site noter que vous pouvez utiliser la db original si votre blog wp n’a pas encore atteint un seuil critique.
2. Créer des fichiers include pour le header, footer, maincontent et sidebar
L’avantages des fichiers include c’est qu’il permettent de modifier des élément du layout ou du site en updatant qu’a une seul endroit avoir utilisé une génération de site completement statique les page aurait été un peu plus vite à ouvrir mais dans le cas d’un update sur le layout j’aurais du regenérer tous les pages … Veuillez noter que j’ai separer chacune des pages à inclure par une boite de commentaires
<?
//---------------------------------------------------------------------------
// header.php file to include for static site generation
//---------------------------------------------------------------------------
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><?=$title; ?></title>
<link rel="stylesheet" href="<?=HTTP_ROOT;?>style.css" type="text/css" media="screen" />
<style type="text/css" media="screen">
#page { /*background: url("<?=HTTP_ROOT;?>images/kubrickbg-ltr.jpg") repeat-y top; border: none;*/ }
</style>
<link rel='stylesheet' id='contact-form-7-css' href='<?=HTTP_ROOT;?>styles.css?ver=2.3' type='text/css' media='all' />
<script type='text/javascript' src='<?=HTTP_ROOT;?>js/comment-reply.js?ver=20090102'></script>
<script type='text/javascript' src='<?=HTTP_ROOT;?>js/jquery/jquery.js?ver=1.3.2'></script>
<link rel='index' title='<?=$site_title;?>' href='<?=HTTP_ROOT;?>' />
<meta name="generator" content="WordPress 2.9.2" />
<meta name="description" content="<?=$seo_desc;?>" />
<meta name="keywords" content="<?=$seo_kw;?>" />
<link rel="canonical" href="<?=$canonical_url;?>" />
</head>
<body class="home page page-id-8 page-template page-template-default">
<div id="page">
<div id="header" role="banner">
<div id="headerimg">
<h1><a href="<?=HTTP_ROOT;?>"><?=$site_title;?></a></h1>
<div class="description"><?=$blog_desc;?></div>
</div>
</div>
<?
//---------------------------------------------------------------------------
// maincontent.php file to include for static site generation
//---------------------------------------------------------------------------
?>
<div id="page_wrapper">
<div id="content" class="narrowcolumn" role="main">
<div class="post" id="post-8">
<h2><?=$title;?></h2>
<div class="entry">
<?=$post_content;?>
</div>
</div>
<p class="nocomments">Comments are closed.</p>
</div>
<?
//---------------------------------------------------------------------------
// sidebar.php file to include for static site generation
//---------------------------------------------------------------------------
?>
<div id="sidebar" role="complementary">
<ul>
<li>
<form role="search" method="get" id="searchform" action="<?=HTTP_ROOT;?>" >
<div><label class="screen-reader-text" for="s">Search for:</label>
<input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</li>
</ul>
<ul role="navigation">
<li class="pagenav"><h2>Pages</h2><ul><li class="page_item page-item-2"><a href="<?=HTTP_ROOT;?>about/" title="About">About</a></li>
</ul>
</div>
<?
//---------------------------------------------------------------------------
// footer.php file to include for static site generation
//---------------------------------------------------------------------------
?>
<hr />
<div id="footer" role="contentinfo">
<p>
<?
foreach($footer_links as $key=>$value){
echo '<a href="'. $value[0] .'">'. $value[1] .'</a> ';
}
?>
</p>
</div>
</div><!-- end page_wrapper -->
<div style="width:1000px; margin:8px auto 0 auto;">
<?=$disclaimer;?>
</div>
</div>
<?=$analytics;?>
</body>
</html>
3. Créer un script qui va looper dans la database et générer et sauvegarder des pages statiques du rendu de notre blog
La première chose que j’ai fait est d’ajouter un champs BOOLEAN à la table wp_posts que j’ai appeller done a chaque page completer je vais mettre le champs à 1 ce qui permettera de reprendre le travaille ou j’étais rendu en cas d’arret innatendu du script.
J’ai créer un fichiers « setings.php » qui contiendera tous les variable commune à tous les pages du site
<?
//---------------------------------------------------------------------------
// setings.php file to include for static site generation
//---------------------------------------------------------------------------
define('HTTP_ROOT', 'http://www.Lenomdusite.com/');
$site_title = "Le titre du blog";
$blog_desc = "La description du blog";
$analytics =
"<script type='text/javascript'>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-9999999-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>";
$disclaimer ='<strong class="text02">Disclaimer:</strong> <span class="text03">Disclaimer text</span><br /><br />';
$footer_links = array();
$footer_links[] = array(HTTP_ROOT . "sitemap.php", 'Sitemap');
?>
Pour la page d’accueil j’ai tous simplement créer un fichier manuelement index.php avec la structure des include au quels j’ai seter mes variable en copie-collant d’un view source de la page d’acceil du blog.
<?
//---------------------------------------------------------------------------
// index.php File manually created
//---------------------------------------------------------------------------
include "setings.php";
$title = "Le titre du blog";
$seo_desc = "La description pour le meta";
$seo_kw = "Les Keywords pour le meta";
$canonical_url = "http://www.lesiteweb.com/";
$post_content =
"
<p>Contient le contenue de la page d'accueil</p>
";
include "header.php";
include "maincontent.php";
include "sidebar.php";
include "footer.php";
?>
J’ai aussi créer un fichier à inclure qui s’appelle « sitemapinc.php » qui contiendera un lien vers chacune des page créer de façon a ce qu’elle soit tous accessible par les robots des moteur de recherche évidament j’au peux en créer un en xml mais le temps manquais pour les feature nice to have … pour l’instant elle ne contient que le lien vers la page d’acceuil le script fera un append avec chacun des post.
<?
//---------------------------------------------------------------------------
// sitemapinc.php file to include for easy subpage access to SE
//---------------------------------------------------------------------------
?>
<a href="<?=HTTP_ROOT;?>"><?=$site_title;?></a>
J’ai aussi créer un fichier « sitemap.php » qui inclus « setings.php » et « sitemapinc.php »
<?
//---------------------------------------------------------------------------
// sitemap.php file to include for easy subpage access to SE
//---------------------------------------------------------------------------
include "setings.php";
include "sitemapinc.php";
?>
Pour continuer voici le script qui extrait chacun des post_id à générer loop dedans génère les pages ajoute le lien pour le sitemap pui update le champ done de la table.
<?
//---------------------------------------------------------------------------
// transfert.php generate pages
//---------------------------------------------------------------------------
//Avoid Timeout ...
set_time_limit(100000);
//Database connection setting
include "dbconnect.php";
$dir = "statiquesite/";
//Retrieve all post id
$pages = array();
$query= "SELECT ID FROM wp_posts WHERE post_status='publish' AND done=0;";
$result= mysql_query($query) or die('Query Failed: '. mysql_error());
$num=mysql_numrows($result);
if($num > 0){
for($i=0;$i<$num;$i++){
$pages = mysql_result($result,$i,"ID");
}
}
//Loop trough post id and create pages
foreach($pages as $key=>$value){
$post_id = $value;
$query= "SELECT * FROM wp_posts WHERE ID='$post_id';";
$result= mysql_query($query) or die('Query Failed: '. mysql_error());
$num=mysql_numrows($result);
if($num == 1){
$post_content = mysql_result($result,0,"post_content");
$post_title = mysql_result($result,0,"post_title");
$post_name = mysql_result($result,0,"post_name");
$aio_title = "";
$aio_desc = "";
$aio_kw = "";
//Get Seo Title
$query2 = "SELECT meta_value FROM wp_postmeta WHERE post_id='$post_id' AND meta_key='_aioseop_title';";
$result2 = mysql_query($query2) or die('Query Failed: '. mysql_error());
$num2=mysql_numrows($result2);
if($num2 > 0){
$aio_title = mysql_result($result2,0,"meta_value");
}
//Get Seo Desc
$query2 = "SELECT meta_value FROM wp_postmeta WHERE post_id='$post_id' AND meta_key='_aioseop_description';";
$result2 = mysql_query($query2) or die('Query Failed: '. mysql_error());
$num2=mysql_numrows($result2);
if($num2 > 0){
$aio_desc = mysql_result($result2,0,"meta_value");
}
//Get Seo KW
$query2 = "SELECT meta_value FROM wp_postmeta WHERE post_id='$post_id' AND meta_key='_aioseop_keywords';";
$result2 = mysql_query($query2) or die('Query Failed: '. mysql_error());
$num2=mysql_numrows($result2);
if($num2 > 0){
$aio_kw = mysql_result($result2,0,"meta_value");
}
//Lets create the file
$txtFile = '<?'. "n";
$txtFile .= ' include "setings.php";' . "nn";
$txtFile .= ' $title = "'. str_replace('"', '"', $post_title) .'";'. "n";
$txtFile .= ' $seo_desc = "'. str_replace('"', '"', $aio_desc) .'";'. "n";
$txtFile .= ' $seo_kw = "'. str_replace('"', '"', $aio_kw) .'";'. "n";
$txtFile .= ' $canonical_url = HTTP_ROOT . "'. str_replace('"', '"', $post_name) .'/";'. "n";
$txtFile .= ' $post_content = "'. str_replace('"', '"', $post_content) .'";'. "nn";
$txtFile .= ' include "header.php";' . "n";
$txtFile .= ' include "maincontent.php";' . "n";
$txtFile .= ' include "sidebar.php";' . "n";
$txtFile .= ' include "footer.php";' . "n";
$txtFile .= '?>'; //<?
$filename = $dir . $post_name . ".php";
$fp = fopen( $filename , 'w');
fwrite ( $fp, $txtFile );
fclose($fp);
chmod($filename, 0777);
//Add the entry in the sitemap include
$myFile = $dir . "sitemapinc.php";
$sitemap_append = '<a href="<?=HTTP_ROOT;?>'. $post_name .'/">'. $post_title .'</a>' ."n";//<? separer pour afficher correctement dans mon blog...
$fh = fopen($myFile, 'a') or die("can't open file");
fwrite($fh, $sitemap_append);
fclose($fh);
//Set this page has done
$query= "UPDATE wp_posts SET done=1 WHERE ID='$post_id';";
$result= mysql_query($query) or die('Query Failed: '. mysql_error());
print("<br>file[$filename] is Complet");
//Avoid loading Mysql Server
sleep(1);
}//end if num==1
}//end foreach
//Close db connection
include "dbclose.php";
?>
4. Recopier les pages généré sur notre compte original
Cette étape n’est quand fait un simple manipulation de copier-coller, move ou de transfert ftp.
5. le fichiers htaccess
Le but de ce fichier est de rediriger les permalinks existants vers nos nouvelle pages php
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^nomdusiteweb.com/$ index.php [nc]
RewriteRule ^nomdusiteweb.com$ index.php [nc]
RewriteRule ^(.*)/$ $1.php [nc]
RewriteCond %{HTTP_HOST} ^nomdusiteweb.com [NC]
RewriteRule (.*) http://www.nomdusiteweb.com/$1 [L,R=301]
6. Créer un fichier 404 custom pour les pages qui seront perdu (juste en cas de …)
En cas ou certaine page ne serait pas transferer et que des liens sont conserver quelquepart (favoris blog etc…) je veux que la personne tombe sur une page 404 au layout du blog et qui insitera le visiteur à visiter notre page d’index.
[codebox 10]
Cette méthodologie est simple à pris environ 5 heures pour coder et transférer le nouveau site si vous avez des questions ou commentaire n’hésiter pas a le faire par la boite de commentaire si dessous. En espérant que ce post en aide quelque un
Bonjour à tous! 

