Compter les articles selon leur langue avec WPML sous WordPress
Mis à jour le :
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é :
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().
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 !
Protégez votre site WordPress
Vos données sont précieuses, ne prenez pas le risque de tout perdre. Confiez-moi votre maintenance !
Les taxonomies par défaut de WordPress, à savoir les catégories et les étiquettes (tags), peuvent être associées à n’importe quel type de contenu personnalisé.
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.
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 !
2 réponses
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.
Pour utiliser ce plugin depuis des années et pour avoir suivi son évolution, je dois dire que c’est l’idéal !