Pourquoi les avis en ligne sont désormais votre atout SEO le plus précieux

Pourquoi les avis en ligne sont désormais votre atout SEO le plus précieux

Voir tout
${répondre?.comment_author}${répondre?.eln_tier_label ? " : "}
•
${réponse?.comment_temps_relatif}
${répondre?.comment_content?.trimer()}

`;
}

function createComment(comment, replies, isLastComment) {
const commentListDiv = document.getElementById(PublicCommentSelectors.LIST);

si (!commentListDiv) {
retour;
}

const borderClasses = isLastComment ? ” : ‘tw:border-b tw:border-slate-200’;

const currentUser = window?.tp?.pianoId?.getUser() ?? null;
const currentUserInitials = currentUser
? getInitials(`${currentUser?.firstName ?? ”} ${currentUser?.lastName ?? ”}`)
: ”;

const repliesHTML = replies.length ? `
${replies.map(buildReplyHTML).join(”)}

` : ”;

const replyButtonHTML = allowsComments ? `

` : ”;

const replyFormHTML = allowsComments ? `

` : ”;

const commentDiv = `
${comment?.comment_author}${comment?.eln_tier_label ? " : "}
•
${commentaire?.commentaire_temps_relatif}
${comment?.comment_content?.trim()}

${replyButtonHTML}

${réponsesHTML}
${replyFormHTML}

`;

commentListDiv.innerHTML += commentDiv;
}

function displayComments() {
// Vider le conteneur de la liste des commentaires avant d'actualiser les commentaires.
const commentListDiv = document.getElementById(PublicCommentSelectors.LIST);
commentListDiv.innerHTML = ”;

const comments = state?.comments ?? [];

if (!comments.length) {
retour;
}

// Créer une structure hiérarchisée : séparer le niveau supérieur des réponses.
const repliesByParent = {};
const topLevelComments = [];

comments.forEach(comment => {
si (commentaire.commentaire_parent === 0) {
topLevelComments.push(comment);
} autre {
const parentId = comment.comment_parent;
si (!réponsesByParent[parentId]) {
réponsesParParent[parentId] = [];
}
repliesByParent[parentId].push(comment);
}
});

// Appliquer l'ordre de tri principal. Le serveur renvoie DESC ; inverser pour le tri du plus ancien au plus récent.
si (state.sortOrder === 'oldest') {
commentaires de niveau supérieur.inverser();
}

// Réponses àfaçons Afficher les plus anciens en premier au sein d'un même fil de discussion (le serveur renvoie DESC, donc inverser).
Object.keys(repliesByParent).forEach(parentId => {
répondParParent[parentId].inverse();
});

topLevelComments.forEach((comment, index) => {
const isLastComment = index === topLevelComments.length – 1;
const replies = repliesByParent[comment.comment_ID] ?? [];
créerCommentaire(commentaire, réponses, estDernierCommentaire);
});

créer des avatars de commentaires();
}

function updateCommentCount() {
const countDiv = document.getElementById(PublicCommentSelectors.COMMENT_COUNT);
const sortControls = document.getElementById(PublicCommentSelectors.SORT_CONTROLS);

si (!countDiv) {
retour;
}

const count = state?.comments?.length ?? 0;

// Ne pas afficher s'il n'y a pas de commentaires.
si (compteur === 0) {
retour;
}

countDiv.innerHTML = `${count} Comment${count > 1 ? 's' : ‘}`;

si (triContrôles) {
sortControls.classList.remove('tw:hidden');
sortControls.classList.add('tw:flex');
}
}

function displayLoader(show) {
const loader = document.getElementById(PublicCommentSelectors.BUTTON_LOADER);
const text = document.getElementById(PublicCommentSelectors.BUTTON_TEXT);

if (!loader || !text) {
retour;
}

// Afficher ou masquer le chargeur.
si (afficher) {
loader.classList.remove('tw:hidden');
texte.classList.add('tw:hidden');
} autre {
loader.classList.add('tw:hidden');
text.classList.remove('tw:hidden');
}
}

function displayError(error) {
const errorDiv = document.getElementById(PublicCommentSelectors.ERROR);

si (!errorDiv) {
retour;
}

si (erreur) {
errorDiv.classList.add('tw:block');
errorDiv.classList.remove('tw:hidden');
errorDiv.textContent = `Erreur de soumission de commentaire : ${error}` ;
} autre {
errorDiv.classList.remove('tw:block');
errorDiv.classList.add('tw:hidden');
errorDiv.textContent = ”;
}
}

function clearCommentInput() {
const commentField = document.getElementById(PublicCommentSelectors.INPUT);

si (!commentField) {
retour;
}

commentField.value = ”;
}

function updateComments(comments = []) {
état.commentaires = commentaires;
afficherCommentaires();
mettre à jour le nombre de commentaires();
}

function runCommentProcess(type) {
si (type === 'postComment') {
const comment = document.getElementById(PublicCommentSelectors.INPUT);

if (!comment || !comment?.value) {
retour;
}

// Masquer les erreurs, afficher le chargeur.
afficherErreur();
afficherChargeur(true);
}

const data = {
taper,
ID du message : 444865,
};

// Obtenez un nouveau nonce et récupérez les commentaires ou publiez un commentaire.
fetch(`${adminAjaxUrl}?action=ep_get_public_comment_nonce`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
// Gérer les erreurs.
si (!response.success) {
afficherChargeur(false);
console.error('Erreur lors de la récupération du nonce : ', response?.data?.message);
retour;
}

const nonce = response?.data?.nonce;

// Obtenir des commentaires.
si (type === 'getComments') {
obtenirCommentaires(nonce);
retour;
}

// Publier un commentaire.
si (type === 'postComment') {
posterComment(nonce);
}
})
.catch((e) => {
afficherChargeur(false);
console.error(`Erreur lors de l'exécution du processus de commentaire ${type} : `, e);
});
}

function getComments(nonce) {
const data = {
nonce,
ID du message : 444865,
};

// Récupérer les commentaires.
fetch(`${adminAjaxUrl}?action=ep_get_public_comments`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
// Gérer les erreurs.
si (!response.success) {
afficherChargeur(false);
console.error('Erreur lors de la récupération des commentaires : ', response?.data?.message);
retour;
}

mettre à jour les commentaires(réponse?.données?.comments);
afficherChargeur(false);
})
.catch((e) => {
afficherChargeur(false);
console.error('Erreur lors de la récupération des commentaires : ', e);
});
}

function postComment(nonce) {
const user = window?.tp?.pianoId?.getUser() ?? null;

if (!user || !user?.uid) {
console.error('Erreur lors de la publication du commentaire : Non autorisé. Envoi annulé.');
retour;
}

const comment = document.getElementById(PublicCommentSelectors.INPUT);

if (!comment || !comment?.value) {
retour;
}

const data = {
nonce,
commentaire : comment.valeur,
Commentaire parent : 0,
ID du message : 444865,
uid : utilisateur?.uid,
};

// Publier le commentaire.
fetch(`${adminAjaxUrl}?action=ep_create_public_comment`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
identifiants : ‘ inclure ’,
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
// Gérer les erreurs.
si (!response.success) {
afficherChargeur(false);
afficherErreur(réponse?.données?.message, vrai);
console.error('Erreur lors de la publication du commentaire : ', response?.data?.message);
retour;
}

// Gérer le succès.
effacerCommentaire();
exécuterCommentProcessus('getComments');
})
.catch((e) => {
afficherChargeur(false);
afficherErreur(e);
console.error('Erreur lors de la publication du commentaire : ', e);
});
}

function toggleReplyForm(commentId) {
// Fermez tous les autres formulaires de réponse ouverts.
document.querySelectorAll(‘.ep-reply-form’).forEach(function(form) {
si (form.dataset.parentId !== String(commentId)) {
form.classList.add('tw:hidden');
}
});

// Basculer le formulaire de réponse ciblé.
const targetForm = document.querySelector(‘.ep-reply-form[data-parent-id=”‘ + commentId + ‘”]’);

si (targetForm) {
targetForm.classList.toggle('tw:hidden');

si (!targetForm.classList.contains('tw:hidden')) {
targetForm.querySelector('.ep-reply-input')?.focus();
}
}
}

function setReplyLoading(formEl, isLoading) {
const btn = formEl.querySelector(‘.ep-reply-submit’);
const btnText = formEl.querySelector(‘.ep-reply-button-text’);

if (!btn || !btnText) {
retour;
}

si (isLoading) {
btnText.textContent = 'Publication…';
bouton.désactivé = vrai ;
} autre {
btnText.textContent = 'Publier la réponse';
bouton.désactivé = faux ;
}
}

function displayReplyError(formEl, error) {
const errorDiv = formEl.querySelector(‘.ep-reply-error’);

if (!errorDiv || !error) {
retour;
}

errorDiv.textContent = 'Erreur de réponse : ' + erreur ;
errorDiv.classList.remove('tw:hidden');
errorDiv.classList.add('tw:block');
}

function clearReplyError(formEl) {
const errorDiv = formEl.querySelector(‘.ep-reply-error’);

si (!errorDiv) {
retour;
}

errorDiv.textContent = ”;
errorDiv.classList.add('tw:hidden');
errorDiv.classList.remove('tw:block');
}

function postReply(nonce, parentId, replyText, formEl) {
const user = window?.tp?.pianoId?.getUser() ?? null;

if (!user || !user?.uid) {
setReplyLoading(formEl, false);
retour;
}

const data = {
nonce,
commentaire : texte de réponse,
commentParent : parentId,
ID du message : 444865,
uid : utilisateur?.uid,
};

fetch(`${adminAjaxUrl}?action=ep_create_public_comment`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
identifiants : ‘ inclure ’,
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
setReplyLoading(formEl, false);

si (!response.success) {
afficherErreurRéponse(formEl, réponse?.données?.message);
console.error('Erreur lors de l'envoi de la réponse : ', response?.data?.message);
retour;
}

formEl.querySelector('.ep-reply-input').value = ‘;
formEl.classList.add('tw:hidden');
exécuterCommentProcessus('getComments');
})
.catch((e) => {
setReplyLoading(formEl, false);
displayReplyError(formEl, 'Erreur réseau. Veuillez réessayer.');
console.error('Erreur lors de l\'envoi de la réponse : ', e);
});
}

function submitReply(parentId, formEl) {
const input = formEl.querySelector(‘.ep-reply-input’);

si (!input || !input.value.trim()) {
retour;
}

const user = window?.tp?.pianoId?.getUser() ?? null;

if (!user || !user?.uid) {
ouvrirLoginModal();
retour;
}

définirChargementDeLaRéponse(formEl, vrai);
effacerErreurDeRéponse(formEl);

const data = {
type: 'postComment',
ID du message : 444865,
};

fetch(`${adminAjaxUrl}?action=ep_get_public_comment_nonce`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
si (!response.success) {
setReplyLoading(formEl, false);
afficherErreurRéponse(formEl, réponse?.données?.message);
retour;
}

postReply(response?.data?.nonce, parseInt(parentId, 10), input.value.trim(), formEl);
})
.catch((e) => {
setReplyLoading(formEl, false);
displayReplyError(formEl, 'Erreur réseau. Veuillez réessayer.');
console.error('Erreur lors de la récupération du nonce pour la réponse : ', e);
});
}

function setupCommentListDelegation() {
const commentListDiv = document.getElementById(PublicCommentSelectors.LIST);

si (!commentListDiv) {
retour;
}

commentListDiv.addEventListener(‘click’, function(e) {
// Bouton Répondre : active/désactive le formulaire de réponse intégré.
const replyButton = e.target.closest(‘.’ + PublicCommentSelectors.REPLY_BUTTON);
si (bouton de réponse) {
const commentId = replyButton.dataset.commentId;
const user = window?.tp?.pianoId?.getUser() ?? null;

si (!utilisateur) {
ouvrirLoginModal();
retour;
}

basculerFormulaireDeRéponse(commentId);
retour;
}

// Annuler la réponse : masquer le formulaire de réponse.
const replyCancel = e.target.closest(‘.ep-reply-cancel’);
si (réponseAnnuler) {
const parentId = replyCancel.dataset.parentId;
const form = document.querySelector(‘.ep-reply-form[data-parent-id=”‘ + parentId + ‘”]’);
si (formulaire) {
form.classList.add('tw:hidden');
}
retour;
}

// Soumettre la réponse : publier la réponse.
const replySubmit = e.target.closest(‘.ep-reply-submit’);
si (replySubmit) {
const parentId = replySubmit.dataset.parentId;
const form = document.querySelector(‘.ep-reply-form[data-parent-id=”‘ + parentId + ‘”]’);
si (formulaire) {
soumettreRéponse(parentId, formulaire);
}
}
});
}

function setupUserAvatar() {
const usernameDiv = document.getElementById(PublicCommentSelectors.USERNAME);
const userAvatar = document.getElementById(PublicCommentSelectors.USER_AVATAR);

if (!usernameDiv || !userAvatar) {
retour;
}

const user = window?.tp?.pianoId?.getUser() ?? null;

si (!utilisateur) {
retour;
}

const fullName = `${user?.firstName ?? ”} ${user?.lastName ?? ”}`;

nom d'utilisateurDiv.innerHTML = fullName;
userAvatar.innerHTML = getInitials(fullName);
}

function openLoginModal() {
fenêtre?.tp?.pianoId?.afficher({ afficherMode: 'modal', écran : 'connexion' });
}

function setupCommentSubmitButton() {
const submitButton = document.getElementById(PublicCommentSelectors.SUBMIT);

if (!submitButton || state.submitCommentButtonRegistered) {
retour;
}

// Enregistrez un gestionnaire de clic unique qui vérifie l'état d'authentification au moment du clic.
submitButton.addEventListener(‘click’, function() {
const user = window?.tp?.pianoId?.getUser() ?? null;

si (!utilisateur) {
ouvrirLoginModal();
retour;
}

exécuterCommentProcess('postComment');
});

état.boutonSoumettreCommentaireEnregistré = vrai;
}

function setSortOrder(order) {
état.ordre_de_tri = ordre;

const newestBtn = document.getElementById(PublicCommentSelectors.SORT_NEWEST);
const oldestBtn = document.getElementById(PublicCommentSelectors.SORT_OLDEST);

si (newestBtn && oldestBtn) {
const activeClasses = [‘tw:font-bold’, ‘tw:text-blue-800’];
const inactiveClasses = [‘tw:font-normal’, ‘tw:text-slate-500’];

si (ordre === 'plus récent') {
newestBtn.classList.add(…activeClasses);
newestBtn.classList.remove(…inactiveClasses);
oldestBtn.classList.add(…inactiveClasses);
oldestBtn.classList.remove(…activeClasses);
} autre {
oldestBtn.classList.add(…activeClasses);
oldestBtn.classList.remove(…inactiveClasses);
newestBtn.classList.add(…inactiveClasses);
newestBtn.classList.remove(…activeClasses);
}
}

afficherCommentaires();
}

function setupSortControls() {
const newestBtn = document.getElementById(PublicCommentSelectors.SORT_NEWEST);
const oldestBtn = document.getElementById(PublicCommentSelectors.SORT_OLDEST);

si (nouveaubouton) {
newestBtn.addEventListener(‘click’, function() {
définir l'ordre de tri('plus récent');
});
}

si (le plus vieux bouton) {
oldestBtn.addEventListener(‘click’, function() {
définir l'ordre de tri('plus ancien');
});
}
}

exécuterCommentProcessus('getComments');
écouterPourConnexionPiano();
configurerCommentSubmitButton();
configurerLaListeDeCommentairesDélégation();
configurerContrôlesDeTri();
});

Par Ashley Armstrong
Par Brendan Keegan
Par Charisma Glassman
Par Bhaskar Ahuja
Par Shawn P. Walchef
Par Alex Lefkowitz

En rapport:

Formation en automatisation numérique au Bénin : 5 compétences clés recherchées par les employeurs en 2026

<a href="https://yoursite.com/automation-africa/" title="WhatsApp Commercialisation Automation Africa : 6 erreurs dangereuses commises par les marques au Nigéria
Automatisation du marketing WhatsApp en Afrique : 6 erreurs dangereuses commises par les marques au Nigéria

Vous souhaitez apprendre cela de manière pratique ?

Rejoindre Justfine Infotech et développer de véritables compétences numériques en IA, automatisation, développement web, marketing digital, bureautique, e-commerce, travail indépendant et cybersécurité.

Programmes disponibles :
Certificat de 6 semaines • Certificat professionnel de 3 mois • Diplôme de 6 mois • Diplôme professionnel complet

WhatsApp :
+229 01 57 57 99 15
+229 01 66 68 11 60

Inscrivez-vous dès maintenant

Source: www.entrepreneur.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Défiler vers le haut