Annonce

  •  » Plugins
  •  » [MOD] Auto-sitemap

#1 2010-06-14 01:42:12

h2o
Membre
2005-01-30
110

[MOD] Auto-sitemap

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

Code:

<?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("&lsquo;", "&rsquo;");
        $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:

Code:

    /**************************************************
    *     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)


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#2 2010-06-14 01:46:19

VDigital
Former Piwigo Team
Montpellier (FR)
2005-05-04
15127

Re: [MOD] Auto-sitemap


Vincent -« Plus vidéaste averti que photographe amateur... »
La galerie - Le blog   

Piwigo est une application libre de gestion de photos en ligne.

Hors ligne

#3 2010-06-14 02:01:15

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

Ce pluggin ne fait pas le sitemap à la volée... et il n'inclue pas les pages photos.


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#4 2010-06-14 11:44:56

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

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)


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#5 2010-06-14 22:53:06

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

Un essais sur ce site qui contient le plugin Additional page:

http://viadene.free.fr/autositemap.php


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#6 2010-06-15 10:34:47

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

Google a l'air d'aimer


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#7 2010-06-16 13:28:31

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

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).


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#8 2010-06-16 13:46:50

SNF69
Membre
Lyon (69)
2009-04-10
1253

Re: [MOD] Auto-sitemap

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


Ma galerie ?? c'est par ici : Galerie de Stephy et Seb

Hors ligne

#9 2010-06-16 14:33:25

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

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.


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#10 2010-06-16 15:12:07

SNF69
Membre
Lyon (69)
2009-04-10
1253

Re: [MOD] Auto-sitemap

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


Ma galerie ?? c'est par ici : Galerie de Stephy et Seb

Hors ligne

#11 2010-06-16 17:05:02

VDigital
Former Piwigo Team
Montpellier (FR)
2005-05-04
15127

Re: [MOD] Auto-sitemap

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é.
;-)


Vincent -« Plus vidéaste averti que photographe amateur... »
La galerie - Le blog   

Piwigo est une application libre de gestion de photos en ligne.

Hors ligne

#12 2010-06-16 17:06:34

SNF69
Membre
Lyon (69)
2009-04-10
1253

Re: [MOD] Auto-sitemap

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


Ma galerie ?? c'est par ici : Galerie de Stephy et Seb

Hors ligne

#13 2010-06-16 17:19:54

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

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 ?


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#14 2010-06-16 17:26:14

tosca
Former Piwigo Team
Cévennes (Gard)
2006-09-23
3818

Re: [MOD] Auto-sitemap

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

#15 2010-06-16 17:41:06

h2o
Membre
2005-01-30
110

Re: [MOD] Auto-sitemap

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.


Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

  •  » Plugins
  •  » [MOD] Auto-sitemap

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact