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