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 :

[pastacode lang=”php” manual=”function%20baw_count_posts(%24args)%20%7B%0A%09%2F%2F%20Si%20on%20passe%20juste%20un%20type%20de%20post%20en%20chaine%2C%20on%20force%20la%20construction%20du%20tableau%0A%09%24args%20%3D%20is_string(%24args)%20%3F%20array(‘post_type’%3D%3E%24args)%20%3A%20%24args%3B%0A%09%2F%2F%20valeurs%20par%20d%C3%A9faut%0A%09%24default%20%3D%20array(‘post_type’%3D%3E’post’%2C%20’perm’%3D%3E”%2C%20’lang’%3D%3E”%2C%20’post_status’%3D%3E’publish’)%3B%0A%09%2F%2F%20croisement%20des%20valeurs%20par%20d%C3%A9faut%20avec%20celles%20pass%C3%A9es%20en%20param%C3%A8tre%0A%09%24args%20%3D%20wp_parse_args(%24args%2C%20%24default)%3B%0A%09%2F%2F%20extraction%20des%20variables%0A%09extract(%24args%2C%20EXTR_SKIP)%3B%0A%09%2F%2F%20on%20v%C3%A9rifie%20que%20WPML%20est%20activ%C3%A9%20avec%20leur%20globale%2C%20si%20%22non%22%2C%20on%20fait%20appel%20%C3%A0%20la%20fonction%20WordPress%20%C3%A0%20la%20place%0A%09global%20%24sitepress%3B%0A%09if(!%24sitepress)%0A%09return%20wp_count_posts(%24post_type%2C%20%24perm)%3B%0A%09%2F%2F%20Si%20on%20a%20d%C3%A9j%C3%A0%20en%20cache%20notre%20valeur%20on%20la%20renvoie%0A%09%24count%20%3D%20wp_cache_get(%24post_type%2C%20’counts’)%3B%0A%09if%20(false%20!%3D%3D%20%24count)%0A%09return%20(object)array(%24post_status%3D%3E%24count)%3B%0A%09%2F%2F%20On%20r%C3%A9cup%C3%A8re%20la%20classe%20globale%20WPDB%20(WordPress%20DataBase)%0A%09global%20%24wpdb%3B%0A%09%2F%2F%20Si%20on%20a%20pas%20fourni%20de%20langue%20dans%20les%20param%C3%A8tres%20on%20prends%20la%20valeur%20de%20WPML%20sinon%20%22fr%22%0A%09if(empty(%24lang))%0A%09%24lang%20%3D%20defined(‘ICL_LANGUAGE_CODE’)%3FICL_LANGUAGE_CODE%3A’fr’%3B%0A%09%2F%2F%20simple%20raccourci%20pour%20gagner%20de%20la%20place%20en%20nombre%20de%20caract%C3%A8res%20(place%20que%20je%20perds%20avec%20ce%20commentaire%20%3Bp)%0A%09%24p%20%3D%20%24wpdb-%3Eprefix%3B%0A%09%2F%2F%20La%20requ%C3%AAte%20magique%0A%09%24query%20%3D%20%22SELECT%20COUNT(%7B%24p%7Dposts.ID)%0A%09FROM%20%7B%24p%7Dposts%0A%09LEFT%20JOIN%20%7B%24p%7Dicl_translations%20ON%0A%09%7B%24p%7Dposts.ID%20%3D%20%7B%24p%7Dicl_translations.element_id%0A%09WHERE%20%7B%24p%7Dposts.post_status%3D’%7B%24post_status%7D’%0A%09AND%20%7B%24p%7Dposts.post_type%3D’%7B%24post_type%7D’%0A%09AND%20%7B%24p%7Dicl_translations.language_code%20%3D%20’%7B%24lang%7D’%0A%09AND%20%7B%24p%7Dicl_translations.element_type%20%3D%20’post_%7B%24post_type%7D’%22%3B%0A%09%2F%2F%20on%20lance%20la%20requ%C3%AAte%0A%09%24count%20%3D%20%24wpdb-%3Eget_var(%24query)%3B%0A%09%2F%2F%20Mise%20en%20cache%0A%09wp_cache_set(%24post_type%2C%20%24count%2C%20’counts’)%3B%0A%09%2F%2F%20Construction%20de%20l’object%20de%20retour%0A%09%24count%20%3D%20(object)array(%24post_status%3D%3E%24count)%3B%0A%09%2F%2F%20Envoie%20de%20la%20valeur%0A%09return%20%24count%3B%0A%7D” message=”” highlight=”” provider=”manual”/]

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

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

[pastacode lang=”php” manual=”%24posts_publies%20%3D%20wp_count_posts(%20’post’%20)%3B%0A%24posts_publies%20%3D%20%24post_publies-%3Epublish%3B” message=”” highlight=”” provider=”manual”/]

Après :

[pastacode lang=”php” manual=”%24posts_publies%20%3D%20baw_count_posts(%20’post’%20)%3B%0A%24posts_publies%20%3D%20%24post_publies-%3Epublish%3B” message=”” highlight=”” provider=”manual”/]

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 :

[pastacode lang=”php” manual=”%24posts_attentes%20%3D%20wp_count_posts(%20’post’%20)%3B%0A%24posts_attentes%20%3D%20%24posts_attentes-%3Epending%3B” message=”” highlight=”” provider=”manual”/]

Après :

[pastacode lang=”php” manual=”%24posts_attentes%20%3D%20baw_count_posts(%20array(%20’post_status’%3D%3E’pending’%20)%20)%3B%0A%24posts_attentes%20%3D%20%24posts_attentes-%3Epending%3B” message=”” highlight=”” provider=”manual”/]

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 :

[pastacode lang=”php” manual=”%24posts_anglais_publies%20%3D%20baw_count_posts(%20array(%20’lang’%3D%3E’en’%20)%20)%3B%0A%24posts_anglais_publies%20%3D%20%24posts_anglais_publies-%3Epublish%3B” message=”” highlight=”” provider=”manual”/]

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().

Julio Potier
Publié le Mis à jour il y a 3 ans 2 commentaires
Par Julio Potier

Consultant en Sécurité & Expert WordPress, je développe et sécurise du contenu Web tous les jours. La création de plugins WordPress fait partie de mon quotidien. Mon livre de chevet ? Le codex WordPress bien sûr !

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.

    1. Aurélien Denis

      Pour utiliser ce plugin depuis des années et pour avoir suivi son évolution, je dois dire que c’est l’idéal !