Créer un sitemap en php

Nouveau WRInaute
Bonjour,

Je souhaiterai créer un sitemap pour google en php. Seulement, j'ai lu que le sitemap devait être en XML. Hors, si je fais un sitemap.php, ça ne fonctionnera pas ?

Et si je fais un sitemap.xml, je ne pourrais pas faire un fichier dynamique qui se met à jour à chaque interrogation (comme un .php par exemple)

Bref, je ne comprend pas comment faire un fichier xml dynamique en utilsant php ?
 
WRInaute accro
Tu n'y es pas. En fait on utilise les deux.

Un sitemap.xml lisible seulement par des robots comme Google qui propose son ajout dans ses outils webmasters.

Une page normale (exemple monsite.php) reprenant toutes les catégories et liens principaux de ton site. Il permet d'être crawlé par les robots et permet aussi au visiteur de s'y retrouver.

Les deux peuvent être générés en php mais n'ont pas la même utilité ni la même finalité. N'oublie pas qu'il est possible d'appeler une page X.php X.xml grâce aux règles de réécritures ;) Et puis, tu as juste à changer les headers en php pour faire comme si ta page X.php était un fichier xml !
 
Nouveau WRInaute
Merci, la réécriture d'url était la brique qui manquée à mon raisonnement.

Pour les générations futures que Dieu Google enverra sur ce post. Si ça peut les aider un peu :)


Le script php pour générer le sitemap dynamique :
fct_general.php contient la connexion à la base MySQL
Code:
<?php
require_once("fct_general.php");

header("Content-Type: text/xml;charset=utf-8");

echo '<?xml version="1.0" encoding="utf-8"?>';
?>

<urlset xmlns="https://www.google.com/schemas/sitemap/0.84">

<?php
// Charge les actu pour créer le tableau
$vChaineSQL="SELECT actu.id_actu, actu.motsCles FROM actu ORDER BY id_actu DESC";
$vResult=mysql_query($vChaineSQL);
while ($row=mysql_fetch_array($vResult)) {
    $urlActu=$_SERVER["HTTP_HOST"]."/actualite-".$row["id_actu"]."-".str_replace(" ","_",$row["motsCles"]).".html"; 
?>

	<url>
		<loc><?php echo $urlActu; ?></loc>
	</url>  

<?php } ?>

</urlset>

L'extrait du .haccess pour réécrire sitemap.php en sitemap.xml :

Code:
Options +FollowSymlinks
RewriteEngine on

RewriteRule ^sitemap.xml /sitemap.php  [NC,L]
 
WRInaute impliqué
Salut,
pour ma part, comme toutes les pages de mon site passent par index.php, j'ai ajouté un code qui ajoute systématiquement toutes les urls qui ne provoquent pas d'erreur 404 dans la db.

Ca se présente comme ça (à adapter bien entendu) :
Code:
// Gestion du SITEMAP
if( !isset($NOSITEMAP) AND !ereg('\?', $_SERVER['REQUEST_URI']) AND !ereg('#', $_SERVER['REQUEST_URI']) ) {
	$url_ = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	$title_ = str_replace(' - '.$_CONFIG['name'], '', $_HEAD['title']);
	$title_ = mysql_escape_string($title_);;
	$module_ = ucfirst(module_name());
	
	// On vérifie que le domaine est correct
	if(ereg(SITE_URL, $url_)) {
		$url_ = str_replace(SITE_URL, '', $url_);
		
		$sql = "UPDATE sitemap SET title='{$title_}', counter=counter+1 WHERE url='{$url_}'";
		db_query($sql);
		
		if(mysql_affected_rows()==0) {
			$timestamp_ = time();
			
			$sql = "
			INSERT INTO sitemap(url, title, module, counter, timestamp) 
			VALUES('{$url_}', '{$title_}', '{$module_}', '1', '{$timestamp_}')
			";
			db_query($sql);
		}
	}
}


et le fichier sitemap.php
Code:
<?php

# Génère le fichier sitemap.xml

// Includes
include('db.inc.php');
include('functions.inc.php');

// Connexion à la DB
db_connect();

// On récupère SITE_URL
query_config();

// En-tete http
header('Content-Type: text/xml');

// Début du fichier
echo <<< ECHO
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
ECHO;

// Récupération des data
$sql = 'SELECT * FROM sitemap ORDER BY url';
$result = db_query($sql);

while( $element = mysql_fetch_assoc($result) ) {
	if ( !ereg('\./', $element['url']) AND !ereg('index\.php', $element['url']) AND !ereg('#', $element['url']) ) {
		$url = SITE_URL . $element['url'];
		$lastmod = date('Y-m-d', $element['timestamp']);
		echo "
	<url>
		<loc>{$url}</loc>
		<lastmod>{$lastmod}</lastmod>
	</url>
	";
	}
}

// Fermeture de la DB
db_close();

?>
</urlset>

Si ça peut aider ;)
 
WRInaute accro
Ouais, enfin, tout sitemap est spécifique à chaque site. ;-)

un type qui sait faire une requête vers sa bdd et mettre en forme pour le format attendu par GG obtiendra un joli sitemap.

Pas compliqué en somme.
Le truc important, comme pour tout flux ou page, c'est de ne pas se planter dans l'encodage.
 
WRInaute discret
Bonjour à tous,

Je suis d'accord que tout site doit posséder son propre sitemap.
L'idéal est de le créer en fichier compressé, Google aime le Gz



:idea:
 
WRInaute discret
Un fichier XML est automatiquement indexé par Google à moins de l'interdire,
donc le contenu est visible ensuite depuis la toile.

Un fichier compressé restera invisible.

Ce n'est qu'une idée parmi tant d'autre :idea:
 
WRInaute discret
WebzineMusik a dit:
Euh... ne doit-on pas ajouter quelques balises optionnelles ?

- <url>
<loc>http://www.mon-site-a-moi.fr/agenda.html</loc>
<lastmod>2008-12-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>

tu l'as dit, c'est optionnel :)

pour ce qui est du xml vs php, j'envoie tout à google dans un sitemap.php, et il aime très bien :)

rien n'interdit un fichier.php à renvoyer du xml, tant que le header est bien positionné :
Code:
header("Content-Type: text/xml;charset=utf-8");
echo '<?xml version="1.0" encoding="utf-8"?>';

donc, la regle de réécriture sitemap.php => sitemap.xml n'apporte rien
 
WRInaute impliqué
ayor a dit:
donc, la regle de réécriture sitemap.php => sitemap.xml n'apporte rien

Elle apporte au moins à yahoo, msn ... et autres moteurs de recherche !

Sinon on peut mettre ça dans le robots.txt
Code:
Sitemap: http://www.example.com/sitemap.xml
Mais je sais pas si un php sera apprécié par les autres
 
WRInaute impliqué
Je veux dire que c'est bien beau de mettre un .php en sitemap mais il faut aussi le soumettre à yahoo et msn et tous les autres.

Je disais juste que je sais pas si les autres vont apprécier le PHP dans l'extension, c'est tout !
 
Nouveau WRInaute
Bonjour à tous !

Désolé de réouvrir un post fermer depuis un mois, mais j'essaye désespérément de faire un sitemap en php, en vain.

En faite, j'ai réutilisé les bouts de code présenté plus haut dans le post mais il y a toujours une erreur :

j'ai creer ma page sitemap.php
voici ce qu'il y a dedans :

Code:
<?php
header("Content-Type: text/xml;charset=utf-8");
echo '<?xml version="1.0" encoding="utf-8"?>'; 
?>

<urlset xmlns="https://www.google.com/schemas/sitemap/0.84"> 

<?php 

... 

?>
</urlset>

Voilà, l'erreur qu'il me retourne quand j'essaye d'accèder à la page :


Warning: Cannot modify header information - headers already sent by (output started at /backup/www/monsite.com/sitemap.php:3) in /backup/www/monsite.com/sitemap.php on line 4

les lignes 3 et 4 correspondants respectivement à "<?php " et "header("Content-Type: text/xml;charset=utf-8");"

Il y a donc quelque chose que je fait mal, mais quoi ?
J'ai beau chercher sur internet, peu de site parle de cela !
Quelqu'un pourrait m'aider ?

Merci beaucoup et bonne soirée !
ThT12
 
WRInaute discret
ThT12 a dit:
Bonjour à tous !

Désolé de réouvrir un post fermer depuis un mois, mais j'essaye désespérément de faire un sitemap en php, en vain.

En faite, j'ai réutilisé les bouts de code présenté plus haut dans le post mais il y a toujours une erreur :

j'ai creer ma page sitemap.php
voici ce qu'il y a dedans :

Code:
<?php
header("Content-Type: text/xml;charset=utf-8");
echo '<?xml version="1.0" encoding="utf-8"?>'; 
?>

<urlset xmlns="https://www.google.com/schemas/sitemap/0.84"> 

<?php 

... 

?>
</urlset>

Voilà, l'erreur qu'il me retourne quand j'essaye d'accèder à la page :


Warning: Cannot modify header information - headers already sent by (output started at /backup/www/monsite.com/sitemap.php:3) in /backup/www/monsite.com/sitemap.php on line 4

les lignes 3 et 4 correspondants respectivement à "<?php " et "header("Content-Type: text/xml;charset=utf-8");"

Il y a donc quelque chose que je fait mal, mais quoi ?
J'ai beau chercher sur internet, peu de site parle de cela !
Quelqu'un pourrait m'aider ?

Merci beaucoup et bonne soirée !
ThT12

ton éditeur n'aurait pas rajouter un caractères utf8 invisible avant le '< ?' ?

utilise un éditeur hexa pour le savoir et le supprimer ;)
 
Nouveau WRInaute
Bonjour ayor,

Merci pour ta réponse, il semblerais que ça soit effectivement ça! Enfin plus précisément ce n'était pas l'éditeur, mais moi qui avait fait un saut à la ligne au début de la page... Ce qu'il n'apprécie gère à priori (ce que je ne savais pas) !

Cela marche niquel maintenant !

Merci encore et désolé pour ce petit problème qui n'en était pas vraiment un!

:? Boulet inside ! :?

Bonne après midi!
:D

ThT12
 
Discussions similaires
Haut