[WordPress] Inclure les Custom Post Types dans les sitemaps XML


Ce qui fait la force de WordPress, c’est sans doute le grand nombre de plugins à disposition.

Parmi les plugins WordPress plus populaires, on trouve sans aucun doute Google XML Sitemaps Generator.

Ce plugin très utile sert à générer les fameux plans de site, si précieux aux moteurs de recherches pour indexer vos blogs.

Sauf que ce plugin n’est pas compatible avec les nouveaux types de billets personnalisés, plus connus sous le terme Custom Post Types, introduit avec WordPress 3.0.

Ce n’est pas très grave car un peu de code est à même de résoudre le problème.

Il suffit d’ouvrir le fichier sitemap-core.php, qui se situe sous le répertoire wp-content/plugins/google-sitemap-generator/

Placez vous à la ligne 1747 (sur la version 3.2.4 du plugin) et trouvez la ligne suivante :

else $where.= "(post_status = 'publish' AND (post_type = 'post' OR post_type = ''))";

Commentez la et ajouter à la suite le code suivant :

else {
   $args=array(
   'public'   => true,
   '_builtin' => false
   );

   $output = 'names'; // names or objects
   $operator = 'and'; // 'and' or 'or'
   $post_types=get_post_types($args,$output,$operator);
   $where.="(post_status = 'publish' AND (post_type = 'post' "; 
   
   foreach ($post_types  as $post_type ) 
      $where.=" OR post_type = '{$post_type}'";
     
   $where.=" OR post_type = '')) ";
}

Enregistrez le fichier et replacez le sur votre serveur.

Dans la console d’administration, ouvrez le menu Réglages -> XML-Sitemap et cliquez sur le lien reconstruire le sitemap.

Normalement votre sitemap contient maintenant tous les liens vers les types personnalisés que vous avez ajouté.

Sachez tout de même que le développeur du plugin est en train de préparer une nouvelle version qui tient compte de cette problématique, comme en atteste le code suivant, trouvé sur la version de développement du plugin :

...
else if ($this->IsCustomPostTypesSupported() count($this->0) {
   $where.=" (post_status = 'publish' AND (post_type in ('','post'";
   foreach ($this->GetOption('in_customtypes') as $customType) {
      $where.=",'$customType'";
   }
   $where .= "))) ";
} else {
   $where.=" (post_status = 'publish' AND (post_type = 'post' OR post_type =''))";
}

Lors de la prochaine mise à jour, le code que vous venez d’insérer sera écrasé par le code officiel. En attendant, cela fonctionne et les moteurs de recherche sont contents.