Bonjour à tous,
Ca m'a pris cet apres-midi, je suis en train de développer un petit script pour fabriquer un Sitemap à la volé (je crois pas en avoir vu pour Piwigo).
Quand le moteur de recherche interroge le sitemap, celui-ci est fabriqué directement en fonction des données prisent dans la base de donnée, donc mise à jours automatiquement.
Le rendu est au format XML, et inclue les pages photos.
un exemple de rendu:
http://www.datacombes.com/pwg/autositemap.php
Voila mon premier jet de code, il est bien sur à améliorer et a compléter si ça vous intéresse.
Je dois encore compléter les balises <lastmod>, ajouter la prise en compte de pages supplémentaires créé par des plugins, prendre en compte les variables de config concernant l'url_rewriting, rendre plus simple la configuration etc.... Bref, du boulot encore.
Je suis preneur de tout conseils.
Version du code beta 0.6b (uniquement pour test, a adapter a votre site web)
Si vous voulez TESTER:
Créez et placez à la racine de votre site Piwigo les fichiers autositemap.php, autositemap.css et autositemap.jpg (voir les script ci-dessous).
Attendez peut-être que le script sois bien finalisé et testé avant de la soumettre à google, sinon c'est a vos risque et péril...
Fichier autositemap.php
<?php /******************************************************************* * * Titre: générateur de sitemap pour Piwigo * fichier: sitemap.php * Version: beta 0.6b * * dev: h2o pour Piwigo * * Commentaire: Cette page va generer automatiquement * un sitemap au format xml utilisé par les moteur de * recherche comme Google, Yahou etc.. * * doc: http://www.sitemaps.org/fr * ********************************************************************/ /******************************************************************** * Format XML * * <?xml version="1.0" encoding="UTF-8"?> * <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> * <url> * <loc>http://www.example.com/</loc> * <lastmod>2005-01-01</lastmod> * <changefreq>monthly</changefreq> * <priority>0.8</priority> * * <image:image> * <image:loc>http://ulr-de-l'image</image:loc> * <image:title>Titre-de-l'image</image:title> * <image:caption>legende-de-l'image</image:caption> * <image:licence>http://url-ver-la-licence</image:licence> * </image:image> * * </url> * </urlset> * *********************************************************************/ //--------------------------------------------------------------------- include define('PHPWG_ROOT_PATH','./'); include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); $xml = new googleXml; /* Variables ------------------------------------*/ // adresse du site Piwigo $xml->site_url = "http://" . $_SERVER['HTTP_HOST']; if(dirname($_SERVER['SCRIPT_NAME']) != "/") {$xml->site_url .= dirname($_SERVER['SCRIPT_NAME']); } $xml->licence_url = ""; // url complete vers votre licence photo, laisser vide si vous n'en avez pas /* Format des URLs (a adapater en fonction de votre config) -------------------------------------*/ $xml->str_loc['category'] = '/index/category/%d-%s'; $xml->str_loc['tag'] = '/index/tags/%d-%s'; $xml->str_loc['picture'] = '/picture/%d-%s/category/%d-%s'; $xml->str_loc['add_page'] = '/index.php/additional_page/%d'; $xml->str_loc['image'] = '/upload/%d/%d/%d/%s'; // lien direct vers l'image /* Fréquence des changements always, hourly, daily, weekly, monthly, yearly, never --------------------------------------*/ $xml->changefreq['accueil'] = 'monthly'; // la page d'accueil $xml->changefreq['category'] = 'monthly'; // les pages des catégories $xml->changefreq['tag'] = 'monthly'; // les pages corespondant à chaque tags $xml->changefreq['picture'] = 'monthly'; // les pages corespondant à chaques photo $xml->changefreq['add_page'] = 'monthly'; // les pages additionnels (Si vous utilisez le Plugin Additionnal page) /* Priorité --------------------------------------*/ $xml->priority['accueil'] = '1'; // la page d'accueil $xml->priority['category'] = '0.6'; // les pages des catégories $xml->priority['tag'] = '0.5'; // les pages corespondant à chaque tags $xml->priority['picture'] = '0.5'; // les pages correspondant à une photo $xml->priority['add_page'] = '0.5'; // les pages additionnels (Si vous utilisez le Plugin Additionnal page) /* format des blocs XML --------------------------------------*/ $xml->str_xml['url'] = "<url>\r%s</url>\r"; $xml->str_xml['loc'] = "\t<loc>%s</loc>\r"; $xml->str_xml['lastmod'] = "\t<lastmod>%s</lastmod>\r"; $xml->str_xml['changefreq'] = "\t<changefreq>%s</changefreq>\r"; $xml->str_xml['priority'] = "\t<priority>%s</priority>\r"; $xml->str_xml['image'] = "\t<image:image>\r%s\t</image:image>\r"; $xml->str_xml['image_loc'] = "\t\t<image:loc>%s</image:loc>\r"; $xml->str_xml['image_title'] = "\t\t<image:title>%s</image:title>\r"; $xml->str_xml['image_caption'] = "\t\t<image:caption>%s</image:caption>\r"; $xml->str_xml['image_licence'] = "\t\t<image:licence>%s</image:licence>\r"; /* Ecrit l'Ouverture du fichier XML -------------------------------------*/ header("Content-Type: text/xml; charset=UTF-8"); echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; echo "<?xml-stylesheet href=\"autositemap.css\" type=\"text/css\"?>"; echo "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">\r"; /* Entete --------------------------------------*/ /* Ecrit le lien de la page d'accueil -------------------------------------*/ $xml->make_url('accueil'); $xml->echo_url(); // echo sprintf($xml_url, $site_url, makedate(), $freq['accueil'], '1'); /* Liens vers les pages Catégories -------------------------------------*/ $temp_link = ''; $query = 'SELECT c.id, c.name, max(h.date) AS lastmod FROM '.CATEGORIES_TABLE. ' c LEFT JOIN '.HISTORY_TABLE.' h ON h.category_id = c.id WHERE status = "public" GROUP BY c.id '; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $xml->data = $row; $xml->make_url('category'); $xml->echo_url(); } /* Liens vers les pages Tags ------------------------------------*/ $query = 'SELECT t.id, t.name, max(h.date) AS lastmod FROM '.TAGS_TABLE.' t LEFT JOIN '.HISTORY_TABLE.' h ON h.tag_ids = t.id GROUP BY t.id'; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $xml->data = $row; $xml->make_url('tag'); $xml->echo_url(); } /* Liens vers page Pictures ------------------------------------*/ $query = 'SELECT i.id, i.name, i.path, i.comment, c.name as catname, c.id as catid, c.status, max(h.date) AS maxdate FROM '.IMAGES_TABLE.' i LEFT JOIN '.HISTORY_TABLE.' h ON h.image_id = i.id, '.IMAGE_CATEGORY_TABLE.' ic LEFT JOIN '.CATEGORIES_TABLE.' c ON c.id = ic.category_id WHERE i.id = ic.image_id AND c.status = "public" GROUP BY i.id'; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $xml->data = $row; $xml->make_img('picture'); // fabrique le bloc <image:image> $xml->make_url('picture'); // fabrique le bloc <url> $xml->echo_url(); // affiche les blocs precedement créé. } /* lien vers page du plugin Additional Page ------------------------------------------*/ if(defined('ADD_PAGES_TABLE') ) { $query = 'SELECT id, title AS name FROM '.ADD_PAGES_TABLE ; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $xml->data = $row; $xml->make_loc('add_page'); $xml->make_url('add_page'); $xml->echo_url(); } } /* Fermeture du fichier XML -------------------------------------*/ echo '</urlset>'; /* class -------------------------------------*/ class googleXml { var $str_loc = array(); var $changefreq = array(); var $str_xml = array(); var $priority = array(); var $data = array(); var $image; /* fabrique le bloc <url>...</url> */ function make_url($type) { $this->url = sprintf($this->str_xml['loc'], $this->make_loc($type) ); $this->url .= sprintf($this->str_xml['lastmod'], $this->make_date()); $this->url .= sprintf($this->str_xml['changefreq'], $this->changefreq[$type]); $this->url .= sprintf($this->str_xml['priority'], $this->priority[$type]); if($this->image) { $this->url .= $this->image; } $this->url = sprintf($this->str_xml['url'], $this->url); } // fin make_url /* fabrique le bloc <image:image>...</image:image> */ function make_img($type) { if(!empty($this->data['path'])) { $this->image = sprintf($this->str_xml['image_loc'], $this->make_image_loc() ); $this->image .= sprintf($this->str_xml['image_title'], $this->html_entity2xml($this->data['name']) ); if(!empty($this->data['comment'])) { $this->image .= sprintf($this->str_xml['image_caption'], $this->html_entity2xml($this->data['comment']) ); } if(!empty($this->licence_url)) { $this->image .= sprintf($this->str_xml['image_licence'], $this->licence_url); } $this->image = sprintf($this->str_xml['image'], $this->image); } } // fin make_img /* fabrique une URL formatée pour <loc>...</loc> */ function make_loc($type) { if($type == 'picture') { return $this->site_url . sprintf($this->str_loc[$type], $this->data['id'], str2url($this->data['name']), $this->data['catid'], str2url($this->data['catname']) ); } if($type == 'accueil') { return $this->site_url; } return $this->site_url . sprintf($this->str_loc[$type], $this->data['id'], str2url($this->data['name'])); } /* fabrique (si besoin) une date pour <lastmod>...</lastmod> */ function make_date () { if(empty($this->data['lastmod'])){ return date('Y-m-d'); } return $this->data['lastmod']; } /* fabrique une URL formatée pour <image:loc>...</image:loc> */ function make_image_loc() { return $this->site_url . substr($this->data['path'], 1); } /* nettoie et met en forme les phrases pour injection dans le XML */ function html_entity2xml($string) { $string = utf8_decode($string); $string = strip_tags($string); $string = html_entity_decode($string, ENT_QUOTES); $trouve = array("‘", "’"); $replace = array("'", "'"); $string = str_replace($trouve, $replace, $string); $string = utf8_encode($string); return $string; } /* envois le bloc <url>...</url> à l'affichage */ function echo_url() { echo $this->url; $this->data = array(); // on vide la variable } } // fin de la class ?>
Fichier autositemap.css:
/************************************************** * CSS pour autositemap * Version 0.3 * * <urlset> * <url> * <loc>http://www.example.com/</loc> * <lastmod>2005-01-01</lastmod> * <changefreq>monthly</changefreq> * <priority>0.8</priority> * <image:image> * <image:loc>http://ulr-de-l'image</image:loc> * <image:title>Titre-de-l'image</image:title> * <image:caption>legende-de-l'image</image:caption> * <image:licence>http://url-ver-la-licence</image:licence> * </image:image> * </url> * </urlset> **************************************************/ urlset { background: transparent url(autositemap.jpg) no-repeat center fixed; } url { margin: 1em; display: block; border-bottom: 1px solid lightgrey; } loc { display: block; margin-left: .5em; font-weight: bold; } lastmod, changefreq, priority { margin-left: 1em; } changefreq { font-style: italic; } priority { border: 1px solid lightgrey; padding: .1px; } image>loc { padding-left: 2em; color: green; } image>title { padding-left: 2em; } image>caption { padding-left: 2em; font-style: italic; }
Dernière modification par h2o (2010-06-18 13:40:57)
Hors ligne
Hors ligne
Ce pluggin ne fait pas le sitemap à la volée... et il n'inclue pas les pages photos.
Hors ligne
Modif du script, ajout de la dernière date de création, suppression des doublons.
Les requêtes SQL semblent un peux lourde au traitement, je vais regarder comment les alléger.
Dernière modification par h2o (2010-06-15 09:34:54)
Hors ligne
Un essais sur ce site qui contient le plugin Additional page:
http://viadene.free.fr/autositemap.php
Hors ligne
Google a l'air d'aimer
Hors ligne
Pour ceux que ça intéresse, version beta 0.5
J'ai ajouté les balises <image:image> dans le sitemap pour indiquer l'emplacement des images.
je vais ajouter les balises pour la géo-localisation (pour ceux qui utilise le plugin qui va avec).
Hors ligne
Salut,
Pour bien comprendre il faut faire une page php avec le code qui est dans le premier post c'est bien ça ??
Merci pour ta réponse.
Seb
Hors ligne
oui effectivement je suis pas très clair, j'ai modifié mon premier post.
Attention c'est une "béta"... je n'ai pas encore bien analysé toutes les facettes de piwigo, je suis sûr qu'il y a des trucs qui ne vont pas.
Il y a trois fichiers à placer à la racine du site Piwigo, autositemap.php, autositemap.css et autositema.jpg.
autositemap.php est le script qui va afficher une page au format xml adapté au moteur de recherche google. Il faut (en attendant mieux) l'éditer et modifier les première lignes pour l'adapter à sa config. Je souhaites pouvoir le rendre totalement 'auto-paramétrable' en fonction des variables de config de piwigo.
autositemap.css est optionnel (google s'en fiche complètement), mais permet d'afficher le XML dans un format lisible. (a améliorer)
autositemap.jpg est une petite cerise sur le gâteaux du superflu pour décorer le fond de la page xml...
Pour ceux qui ont des sites particulièrement important (plus de 50000 photos) il y a possibilité de développer un système à base d'un XLS (fichier contenant des adresses de sitemap) et creer un sitemap.xml par catégorie virtuelle.
Mettre tout ça en cache serait bien aussi, mais je ne maitrise pas (encore) la technique.
Hors ligne
Merci pour cette réponse beaucoup plus précise en effet ;o)
Je ne suis pas sur de l'utiliser mais il est fort probable que ça intéressera du monde et si un jour ça peut être un vrai plugin là ce serait le top.
Bonne continuation.
Seb
Hors ligne
SNF69 a écrit:
Merci pour cette réponse beaucoup plus précise en effet ;o)
Je ne suis pas sur de l'utiliser mais il est fort probable que ça intéressera du monde et si un jour ça peut être un vrai plugin là ce serait le top.
Bonne continuation.
Seb
+1
C'est certain que le succès d'une solution comme celle de h2o passe par la mise en place d'un plugin.
D'autant plus que les modules dans le répertoire de base de Piwigo, on ne peut pas dire que c'est recommandé.
C'est en théorie le core de piwigo et une procédure de migration pourrait entrainer une suppression sans avertissement de ces modules...
Alors que si h2o en fait un plugin, la procédure de migration l'indiquera dans la liste des plugins désactivés.
Donc, autant faire un plugin, ce n'est pas très compliqué.
;-)
Hors ligne
VDigital a écrit:
SNF69 a écrit:
Merci pour cette réponse beaucoup plus précise en effet ;o)
Je ne suis pas sur de l'utiliser mais il est fort probable que ça intéressera du monde et si un jour ça peut être un vrai plugin là ce serait le top.
Bonne continuation.
Seb+1
C'est certain que le succès d'une solution comme celle de h2o passe par la mise en place d'un plugin.
D'autant plus que les modules dans le répertoire de base de Piwigo, on ne peut pas dire que c'est recommandé.
C'est en théorie le core de piwigo et une procédure de migration pourrait entrainer une suppression sans avertissement de ces modules...
Alors que si h2o en fait un plugin, la procédure de migration l'indiquera dans la liste des plugins désactivés.
Donc, autant faire un plugin, ce n'est pas très compliqué.
;-)
Je suis sur qu'il va être motivé pour nous faire un plugin et avoir son nom au panthéon des fonctions additionnelles de notre super outil :o))
Seb
Hors ligne
Faire un plugin je peux y réflechir, mais disons que je ne souhaites pas faire de l'ombre à un plugin déjà existant. J'ai encore pas mal de boulot de toute façon avant de proposer quelques choses d' exploitable en toute sécurité.
Il faut de toute façon que mon executable (autositemap.php) soit à la racine du site sinon ça ne marche pas, je ne sais pas si un plugin peux forcer le déplacement d'un bout de script à la racine de Piwigo ?
Hors ligne
h2o a écrit:
Faire un plugin je peux y réflechir, mais disons que je ne souhaites pas faire de l'ombre à un plugin déjà existant.
Il n'est pas question de "faire de l'ombre", mais plutôt de susciter une "saine émulation" ;-)
C'est de toute manière l'intérêt de l'utilisateur final que d'avoir une bonne solution, ou éventuellement le choix entre plusieurs qui traiteront le problème un peu différemment.
h2o a écrit:
Il faut de toute façon que mon executable (autositemap.php) soit à la racine du site sinon ça ne marche pas ...
Il n'y a pas moyen de lui indiquer un "path" pour qu'il travaille à partir de la racine, sans pourtant y être lui-même physiquement installé ?
Hors ligne
tosca a écrit:
Il n'y a pas moyen de lui indiquer un "path" pour qu'il travaille à partir de la racine, sans pourtant y être lui-même physiquement installé ?
oui bien sur.
Disont que le probleme est le suivant: il faut indiquer à google OU se trouve le fichier de sitemap (peux importe sont nom). Et il faut que ce sitemap sois de niveau égale ou inférieur aux liens qu'il référence. Le contraire ne marche pas si je me réfère à la doc:
http://www.google.com/support/webmaster … swer=35738
URL non autorisée: Google a constaté que certaines URL correspondent à un niveau supérieur ou à un domaine différent de l'emplacement du sitemap. Si cette erreur se produit, essayez de placer votre sitemap à un niveau supérieur de votre site et de le renvoyer.
Par exemple, si votre sitemap figure sous http://www.example.com/monsite/sitemap.xml, les URL ci-après seront considérées comme incorrectes :
http://www.example.com/ : pointe vers un niveau supérieur à celui du sitemap.
http://www.example.com/votresite/ : il s'agit d'un répertoire parallèle à celui dans lequel se trouve le sitemap.
Hors ligne