Compter les articles selon leur langue avec WPML sous WordPress

Vous avez peut-être déjà eu besoin d’afficher ou de retourner le nombre d’articles publiés sur votre site, selon un custom post type ou non. La fonction WordPress qui nous aide est la suivante : wp_count_posts(). Malheureusement si vous utilisez le plugin WPML, le nombre d’articles retourné compte en fait toutes les langues sans distinction. Nous ne voulons pas ça !

Comment faire simple ? Voilà la nouvelle fonction à utiliser, vous pouvez la coller dans votre fichier functions.php :

function baw_count_posts( $args )
 {
 // Si on passe juste un type de post en chaine, on force la construction du tableau
 $args = is_string( $args ) ? array( 'post_type'=>$args ) : $args;
 // valeurs par défaut
 $default = array( 'post_type'=>'post', 'perm'=>'', 'lang'=>'', 'post_status'=>'publish' );
 // croisement des valeurs par défaut avec celles passées en paramètre
 $args = wp_parse_args( $args, $default );
 // extraction des variables
 extract( $args, EXTR_SKIP );
 // on vérifie que WPML est activé avec leur globale, si "non", on fait appel à la fonction WordPress à la place
 global $sitepress;
 if( !$sitepress )
 return wp_count_posts( $post_type, $perm );
 // Si on a déjà en cache notre valeur on la renvoie
 $count = wp_cache_get( $post_type, 'counts' );
 if ( false !== $count )
 return (object)array( $post_status=>$count );
 // On récupère la classe globale WPDB (WordPress DataBase)
 global $wpdb;
 // Si on a pas fourni de langue dans les paramètres on prends la valeur de WPML sinon "fr"
 if( empty( $lang ) )
 $lang = defined('ICL_LANGUAGE_CODE')?ICL_LANGUAGE_CODE:'fr';
 // simple raccourci pour gagner de la place en nombre de caractères (place que je perds avec ce commentaire ;p)
 $p = $wpdb->prefix;
 // La requête magique
 $query = "SELECT COUNT( {$p}posts.ID )
 FROM {$p}posts
 LEFT JOIN {$p}icl_translations ON
 {$p}posts.ID = {$p}icl_translations.element_id
 WHERE {$p}posts.post_status='{$post_status}'
 AND {$p}posts.post_type='{$post_type}'
 AND {$p}icl_translations.language_code = '{$lang}'
 AND {$p}icl_translations.element_type = 'post_{$post_type}'";
 // on lance la requête
 $count = $wpdb->get_var( $query );
 // Mise en cache
 wp_cache_set( $post_type, $count, 'counts' );
 // Construction de l'object de retour
 $count = (object)array( $post_status=>$count );
 // Envoie de la valeur
 return $count;
 }

Voici comment l’utiliser en comparaison de la véritable fonction WordPress :

Avant pour récupérer le nombre d’articles publié :

$posts_publies = wp_count_posts( 'post' );
$posts_publies = $post_publies->publish;

Après :

$posts_publies = baw_count_posts( 'post' );
$posts_publies = $post_publies->publish;

Oui, seul le nom de la fonction change pour ce cas simple. C’est après que ça change un peu.

Avant pour récupérer le nombre d’articles en attente :

$posts_attentes = wp_count_posts( 'post' );
$posts_attentes = $posts_attentes->pending;

Après :

$posts_attentes = baw_count_posts( array( 'post_status'=>'pending' ) );
$posts_attentes = $posts_attentes->pending;

Maintenant, l’avantage avec la nouvelle c’est que vous pouvez aussi demander d’autres langues :
Récupérer le nombre d’articles publiés en anglais :

$posts_anglais_publies = baw_count_posts( array( 'lang'=>'en' ) );
$posts_anglais_publies = $posts_anglais_publies->publish;

Néanmoins, il n’est pas possible d’utiliser la fonction via un hook car il n’en existe pas qui permette de modifier le comportement de la fonction WordPress. S’il s’agit d’un plugin ou d’un thème qui vous sort le mauvais résultat, alors il va falloir le modifier pour remplacer les appels de wp_count_posts() en baw_count_posts().

2 commentaires

  1. Loïc Tortelier

    Hmm, c’est un article très spécifique au plugin WPML, donc aux personnes qui l’utilisent. J’ai utiliser ce plugin de multi-langues récemment pour créer le site d’une entreprise et il est super ! voici l’article au sujet du site en question :
    http://www.f4-design.fr/categorie/creation_de_site_internet/refonte-de-site-internet-pour-lespace-thermal-de-dax/

    J’ai du ajouter quelques réglages pour gérer les widgets en multi-langues aussi. Néanmoins je n’est pas eu le besoin de compter les articles en fonction des langues. Mais qui sais cela servira peut être .

    Merci d’avoir partager ton développement.

Laisser un commentaire