Tuto système de notation par étoiles PHP - CSS

Publié le 12-09-2019
etoiles_notation etoiles_notation etoiles_notation etoiles_notation etoiles_notation
Votes : 4 - Note : 4.8




Rich Snippets de Google, optimisation SEO, comment construire et intégrer un système de notation par étoiles simple pour se démarquer dans les résultats Google ?



html

css

jquery


Tuto système de notation par étoiles PHP - CSS

Avant toute chose, ce modeste article n'a aucunement vocation à vous convaincre du bien-fondé de son objet (de très bonnes pages s'en chargent avec brio, cf la note en bas de ce tuto par exemple) mais la majorité des études récentes allant dans le sens très clair d'un apport positif chez Google et son référencement SEO, voici en quelques étapes simples, comment coder un système de notation par étoiles.

Loin de l'idée du plugin aux 15 000 options "qui fait tout sauf le café", ou du CSS superbe mais qui vient avec son tube d'aspirine, visons un système simple et qui se tient quand même : c'est le même système qui sert aux pages de ce blog, vous le voyez donc marcher avant même de commencer !



En deux mots : le principe est ultra-simple : on aligne 5 étoiles transparentes comme celle-ci et on les place sur une div dont la particularité va être de s'allonger suivant la note obtenue, le reste c'est du code basique.

Comme prévu : Simplissime.


Commençons de suite par le HTML & CSS



 
/*code CSS */
.tde {height:20px;width:20px;cursor:pointer;}
#value {height:20px; width: <?=$value1;?>px; background:#E0E001;}
#glob {display: flex;}



$value1 ques aco me direz-vous ? En fait c'est tout simplement la transformation de la moyenne des notes entre 0 et 5 en pixels rapportée à la longueur de votre div #glob (en fonction de la taille des étoiles) ; et dans le système de ce blog, la moyenne c'est $value, alors bon... ;-)


<!--div optionnelle pour contenir le tout-->
<div style="float:right;margin-top : 10px;width:20%;min-width:100px;">

<!--div en arrière-plan qui s'allongera en fonction de la valeur de $value1-->
<div id="value">

<!--div qui contient les étoiles-->
<div id="glob" >
<img id="tde_1" src="images/star.png" class="tde"/>
<img id="tde_2" src="images/star.png" class="tde"/>
<img id="tde_3" src="images/star.png" class="tde"/>
<img id="tde_4" src="images/star.png" class="tde"/>
<img id="tde_5" src="images/star.png" class="tde"/>
</div>
</div>
</div>



Quelques explications : Il est capital que la div au 2nd plan ne soit pas plus haute que la div qui contient les étoiles, et attention à la valeur de $value1 : basiquement, il faudra transformer la note obtenue de la base de donnée (entre 0 et 5 donc) en longueur en pixel, où 0 = 0px et où 5 = la longueur de #glob (ici 100px) ; notez au passage le "display: flex", de l'excellent Flexbox

Vous obtenez donc ça : ($value1 = 31)


help “ Les deux divs principales doivent impérativement être exactement superposées”



Au tour du JQuery



A ce stade, vos 5 étoiles sont alignées dans leur div, le tout sur la div de fond (si vous avez mis une valeur valide pour $value1, vous avez déjà obtenu un résultat ;-) mais rien ne bouge, passons donc au JQuery, également tout simple :


//on détecte la présence de la souris sur une étoile
$(".tde").mouseover(function(){

//Grâce à substring(), on récupère le numéro dans l'id de cette étoile et on la stocke dans une variable en ayant supprimé le préfixe "tde_", bonnes pratiques du HTML !
var nbr = $(this).prop('id').substring(4);

//on impose la couleur jaune dans le fond transparent de cette étoile
$(this).css( "backgroundColor", "#E0E001" );

//et en même temps, on met toutes les étoiles en-dessous de nbr en jaune.
$( ".tde").slice(0, nbr).css( "backgroundColor", "#E0E001" );

//et toutes celles au-dessus de nbr en gris
$( ".tde").slice(nbr).css( "backgroundColor", "#A1A1A1" );
})

//et quand la souris s'en va, on annule le fond jaune sous les étoiles pour garder uniquement celui de #value
$("#glob").mouseout(function(){
$(".tde").css('backgroundColor', "" );
})



Mirifique résultat :


Et le tour est joué, au moins pour l'aspect, en quelques lignes simples.

Pour le reste, il suffira de détecter un click() dans une .tde, d'envoyer la variable nbr et un identifiant de la page via un appel ajax() pour updater une base de données qui renverra les infos à insérer dans le Rich Snippet (c'était quand même le but initial) ici sous cette forme par exemple :


"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "vM", //vote moyen
"reviewCount": "tV" //total des votes
},



N'oubliez pas de surcharger la valeur "width" de #value via le retour de l'appel Ajax().css('width', 'length'), ainsi vous aurez l'actualisation en "live". Un point à aborder également : qui vote ? Si c'est réservé aux membres inscrits, pas de souci, il suffit de ne faire l'appel que lorsqu'une session est ouverte, sinon, pour limiter les petits malins, passer par un cookie en même temps que l'inscription dans la base ; ce n'est pas le plus efficace, loin sans faut, mais on dit que c'est l'intention qui compte -)



Note : pour l'intérêt de la notation par étoiles chez Google, on peut consulter cet article complet sur la question et très bien documenté : avis étoiles

Et pour toute question, n'hésitez pas à me contacter



Modifié le 30-09-2019

Commentaires

 bKart  2019-09-20

Super facile merci !!
A voter ;-)

Publier un commentaire :



capcha   






GB-Net.fr 2019