Voici une extension de boutons de partage avec compteurs très simple : zéro option, quelques filtres.
Si vous cherchez une extension avec des réglages et beaucoup de réseaux sociaux alors celle-ci ne vous satisfera pas. Dans ce cas je vous conseille plutôt Juiz Social Post Sharer qui est très bien.
Pour ma part, mon extension conviendra mieux à quelqu’un qui saura toucher du code. D’ailleurs ces boutons ne sont pas ajoutés dans le thème ou le contenu automatiquement, il faut le faire soi-même.
Réseaux sociaux
Commençons par les réseaux disponibles, il y en a 5 : Twitter, Facebook, Google+, Pinterest et LinkedIn. Les boutons permettent de partager un post via une popup et chacun est pourvu d’un compteur de partages. Il y a également un bouton de partage par e-mail.
Aperçu
L’extension est actuellement utilisée sur le site de WP Toulouse. Le style est simple et sans fioriture.
Pourquoi cette extension ?
Pour les performances :
– 5,3ko de CSS minifié (il y a une fonte de 6 icônes) et 1,3ko de JS (nécessite jQuery).
– Pas de CSS ou de JavaScript venant d’ailleurs : pas de ralentissements (ni de cookies, jdçjdr).
– Et surtout, la mise à jour des compteurs est faite via ajax, on ne bloque donc pas le chargement de la page. De plus, cela rend l’extension compatible avec les extensions de cache.
– Le partage vers Twitter tient compte de la limite de 140 caractères.
Hooks
– La liste des réseaux sociaux est filtrable.
– Le CSS et le JS sont facilement supprimables avec deux filtres, afin de les modifier et/ou les inclure dans les fichiers du thème.
– Le template des boutons est filtrable.
– L’ensemble des boutons (et du conteneur) est filtrable.
– D’autres filtres sont disponibles, il faudra fouiller pour les découvrir (l’extension n’est pas grosse ;) ).
Exemple de filtres :
01020304050607080910111213
if ( function_exists( 'sfss_get_share_buttons' ) ) :
add_filter( 'sfss_networks', 'wpt_share_networks' );
function wpt_share_networks( $networks ) {
unset( $networks['pinterest'] );
return $networks;
}
remove_action( 'wp_enqueue_scripts', 'sfss_styles', 20 );
remove_filter( 'sfss_buttons', 'sfss_scripts' );
endif;
Exemple pour afficher les boutons :
123456
// Récupérez $post comme vous voulez.
if ( function_exists( 'sfss_share_buttons' ) && is_single( $post->ID ) ) :
sfss_share_buttons( $post->ID );
endif;
On peut ponctuellement passer quelques paramètres (filtrables) en second argument.
Avec une extension de cache
Afin de s’économiser des requêtes ajax inutiles, l’extension n’est pas « cache-plugin-ready » d’entrée de jeu, il faut le préciser. Par exemple :
12345
if ( function_exists( 'une_fonction_du_plugin_de_cache' ) ) :
add_filter( 'sfss_use_html_cache', '__return_true' );
endif;
Explication :
Lorsque les boutons de partage sont imprimés, un calcul est fait pour savoir si l’on a besoin de mettre à jour les compteurs. Si c’est le cas, la classe HTML sfss-needs-update
est ajouté au conteneur. De là, le JavaScript va voir cette classe et faire son appel ajax. Cela veut dire que la majeure partie du temps, aucun appel ajax n’est fait.
C’est donc cette classe qui pose problème si on utilise une extension de cache, car le HTML ne doit pas changer avec le temps.
En utilisant le filtre ci-dessus on indique à l’extension que l’on utilise une extension de cache. Le résultat sera que la classe sfss-needs-update
sera toujours présente, même si l’on n’a pas besoin de mettre à jour les compteurs. Un appel ajax sera donc fait à chaque fois, mais le HTML ne bougera plus. Cependant, un appel ajax ne veut pas forcément dire appels vers les APIs des réseaux sociaux puis mise à jour des compteurs. En effet, la fonction qui retourne le résultat de l’appel ajax va d’elle-même calculer s’il y a besoin de mise à jour. Ainsi on retrouve l’ancien comportement : appel vers les APIs seulement si besoin, il y a juste un appel ajax supplémentaire entre-temps.
Besoin de mise à jour des compteurs ?
Voici comment la décision est faite :
– Si parmi les réseaux activés un compteur est absent (ajout d’un réseau précédemment désactivé, la post meta n’existe pas encore) : on met à jour.
– Le calcul se fait ensuite selon l’âge du post : moins de 15 jours => toutes les heures, moins de 2 mois => toutes les 4 heures, le reste du temps => toutes les 12 heures.
– Pour forcer une mise à jour des compteurs, il suffit de mettre à jour le post.
Commentaires
Commentaire de TweetPress de France @ TweetPress.fr.
Là où certains pourraient voir une énième version du share dans WP, je trouve qu’il y a la place pour un plugin simple pour les dévs par exemple, à adapter. Merci :)
En revanche je sais que la retrieve_body te claque le teste sur is_wp_error() d’ailleurs tu retourne 0 avant de faire un json_decode() s’il y a erreur.
Je préfère m’assurer d’un 200 pour eut égard aux nombreux downs de l’API Twitter par exemple ET surtout informer l’admin de ce qu’il se passe s’il y a erreur en faisant un switch à la main sur les codes HTTP genre 400, 500 etc. La fonction de WP est
wp_remote_retrieve_response_code( $remote_get )
.Car ici tu retournes 0 si ça va mal ce qui est pratique mais pas totalement abouti je trouve car au final on ne sait pas de quelle erreur il s’agit ou s’il n’y a tout simplement pas de partage. Je pensais peut-être à une notice en front mais que pour les admin ou la capability nécessaire, qu’en penses-tu ?
Commentaire de Grégory Viguier.
Merci à toi :)
En effet je n’ai pas poussée la gestion d’erreur à fond, ça ne m’est pas venu à l’esprit que ça pouvait être fréquent. Le mieux c’est qu’en cas d’erreur on ne retourne pas 0 mais la valeur précédente.
Pour avertir l’admin ça me parait difficile sans créer une usine à gaz (là je parle de notification).
Plus facile ne revanche, c’est d’avoir un affichage spécial du bouton en cas d’erreur : dans ce cas on ajoute un attribut
data-error="403"
sur le bouton en question + une classe du genre « can-see-errors » sur le body si la personne est un administrateur, on pourra ensuite cibler en CSS.can-see-errors .sfss-share-button[data-error] { ... }
.Bon, d’un autre côté, je ne suis pas sûr que l’admin ait besoin de savoir de quelle erreur il s’agit, car de toute façon il ne peut rien y faire, mais puisqu’on peut l’avoir facilement…
Tu en dis quoi ?
Commentaire de TweetPress de France @ TweetPress.fr.
Je pense qu’en effet l’usine à gaz c’est l’écueil, pourquoi pas un mail pendant qu’on y est :) tu as raison.
Mais quand même je pars du principe que celui qui gère le site doit savoir pourquoi ça marche pas, sinon en terme d’Ux ou ressenti peu importe comme on l’appelle c’est pas top. Il peut aussi bien se dire « ce plugin c’est de la merde », « personne n’aime mes posts », les deux mais c’est la faut du plugin malgré tout… etc
Peut-être pas couvrir l’ensemble des cas mais savoir si c’est une 400, une 500 ça change la donne. Tu peux même le résumer à du binaire, « vrai, faux », « vrai, y a pas de partage ou le nombre exact », « faux, y a un problème avec l’API » mais au moins la personne est au courant.
Commentaire de Grégory Viguier.
Julien, j’ai un truc étrange avec Twitter,
wp_remote_get()
me retourne une erreur si j’appelle https://urls.api.twitter.com/1/urls/count.json?url=XXX :Il me semblait pourtant que ça marchait jusque là. En revanche c’est bon si je le tente sans SSL.
T’as déjà rencontré ça ?
Commentaire de Grégory Viguier.
OK, vu pour la streaming API. Et comme tous les autres je vais continuer tel quel et j’aviserais au moment où l’API ne sera plus disponible.
Commentaire de TweetPress de France @ TweetPress.fr.
Oui ça paraît complexe pour ce que c’est finalement mais Twitter indique que c’est comme ça qu’il faut faire ! Bref ! Si un jour tu en as l’utilité le framework utilisé par @140dev est une bonne base.
Commentaire de Darknote.
Bonjour,
Pourquoi ne pas avoir mis le réseau social Tumblr ? Je vois de plus en plus de maisons de productions de films avoir une page pour leurs films sur Tumblr, par exemple
http://starwars.tumblr.com/
Le plugin est maintenu à jour ? Plus de mise à jour depuis 1 an. Merci