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

Tags :

Classés dans :