Générer un fichier sitemap.xml sans plugin

Image de Vénus par le JPL (c) NASA.
C’est assez simple à faire en ajoutant quelques lignes de code dans le fichier functions.php de votre thème.
Tout d’abord, le fichier sitemap.xml doit être mis à jour à chaque fois qu’un article ou une page est ajouté ou modifié. Pour cela, la fonction qui va créer ce fichier va être attachée à deux hooks :
add_action( 'publish_post', 'djth_create_xml_sitemap' );
add_action( 'publish_page', 'djth_create_xml_sitemap' );
Ensuite le code de la fonction en question (on peut trouver de bons exemple un peu partout en cherchant sur internet par exemple ici) :
- Quelques mise en forme de la timezone pour être compatible avec le standard XML
- Sélection des articles et pages à inclure dans le sitemap
- Génération de l’entête du fichier XML
- Génération d’une entrée pour chaque article et page
- Tag de fermeture du XML
- Ecriture du fichier dans le dossier racine wordpress, en utilisant l’API WP_FileSystem de wordpress.
Voici le code complet :
function djth_create_xml_sitemap()
{
$sitemap = '';
// Adjust timezone to follow XMl standard
if( str_replace( '-', '', get_option( 'gmt_offset' ) ) < 10 )
{
$tempo = '-0' . str_replace( '-', '', get_option( 'gmt_offset' ) );
}
else
{
$tempo = get_option( 'gmt_offset' );
}
if( strlen( $tempo ) == 3 )
{
$tempo = $tempo . ':00';
}
// Select posts and pages
$postsForSitemap = get_posts
(
array
(
'numberposts' => -1,
'orderby' => 'modified',
'post_type' => array( 'post','page' ),
'order' => 'DESC'
)
);
// Sitemap header
$sitemap .= '<?xml version="1.0" encoding="UTF-8"?>' . '<?xml-stylesheet type="text/xsl" href="' . esc_url( home_url( '/' ) ) . 'sitemap.xsl"?>';
$sitemap .= "\n" . '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
$sitemap .= "\t" . '<url>' . "\n" . "\t\t" . '<loc>' . esc_url( home_url( '/' ) ) .'</loc>' . "\n\t\t" . '<lastmod>' . date( "Y-m-d\TH:i:s", current_time( 'timestamp', 0 ) ) . $tempo . '</lastmod>' . "\n\t\t" . '<changefreq>daily</changefreq>' . "\n\t\t" . '<priority>1.0</priority>' . "\n\t" . '</url>' . "\n";
// Generate entry for each post/page
foreach( $postsForSitemap as $post )
{
setup_postdata( $post );
$postdate = explode( ' ', $post->post_modified );
$sitemap .= "\t" . '<url>' . "\n" . "\t\t" . '<loc>' . get_permalink($post->ID) . '</loc>' . "\n\t\t" . '<lastmod>' . $postdate[0] . 'T' . $postdate[1] . $tempo . '</lastmod>' . "\n\t\t" . '<changefreq>Weekly</changefreq>' . "\n\t\t" . '<priority>0.5</priority>' . "\n\t" . '</url>' . "\n";
}
// Sitemap closing tag
$sitemap .= '</urlset>';
// Write sitemap.xml using WordPress file system class
// See https://wordpress.stackexchange.com/questions/120273/converting-fopen-fwrite-operations-to-wp-filesystem
WP_Filesystem();
global $wp_filesystem;
$homedir = $wp_filesystem->abspath();
$file = trailingslashit( $homedir ) . 'sitemap.xml';
$wp_filesystem->put_contents( $file, $sitemap, FS_CHMOD_FILE );
}
Sources :
- https://wordpress.stackexchange.com/questions/15218/how-to-generate-update-a-xml-sitemap-without-plugins