La première option sur Paramètres - Discussion - Modération des commentaires est la suivante:
Maintient un commentaire dans la file d'attente s'il contient "1" ou plusieurs liens. (Une caractéristique commune du spam de commentaires est un grand nombre de liens hypertextes.)
C'est utile, mais ce serait beaucoup mieux pour moi et mes visiteurs s'il ignorait les liens internes. Souvent, les utilisateurs font référence à d'autres articles du site et c'est une bonne chose. Mais ils sont pris dans la file d'attente de modération, ce qui est gênant pour les utilisateurs et pour l'administrateur.
Alors, y a-t-il un moyen de filtrer ces paramètres pour les mettre en liste blanche? Comme le domaine où Wordpress est hébergé.
comment_max_links_url
Nous pouvons compter le nombre de liens internes dans le contenu du commentaire et soustraire celui-ci du nombre total de liens qui y sont trouvés ($num_links
), à l'aide du filtre suivant dans la fonction principale check_comment()
:
/**
* Filters the number of links found in a comment
*
* @since 3.0.0
* @since 4.7.0 Added the `$comment` parameter.
*
* @param int $num_links The number of links found.
* @param string $url Comment author's URL. Included in allowed links total.
* @param string $comment Content of the comment.
*/
$num_links = apply_filters( 'comment_max_links_url', $num_links, $url, $comment );
Le noyau compte uniquement le nombre de balises <a>
, contenant l'attribut href
, avec:
$num_links = preg_match_all( '/<a [^>]*href/i', $comment, $out );
Voici un exemple pour autoriser les liens internes dans le contenu du commentaire:
/**
* Allow any internal links from the home url Host, in the comment's content
*
* @see http://wordpress.stackexchange.com/a/257917/26350
*/
add_filter( 'comment_max_links_url', function( $num_links, $url, $comment )
{
// Allowed hosts
$allowed_Host = wp_parse_url( home_url(), PHP_URL_Host );
// Get all links
$all_links = preg_match_all(
'/<a [^>]*href=["\']([^"\']+)/i',
$comment,
$links
);
// No links
if( empty( $links[1] ) || ! is_array( $links[1] ) )
return $num_links;
// Count links that are from our home url domain
$internal_links = array_reduce(
$links[1],
function( $internal, $link ) use ( $allowed_Host )
{
if( $allowed_Host === wp_parse_url( $link, PHP_URL_Host ) )
$internal += 1;
return $internal;
},
0
);
return ( $num_links - $internal_links );
}, 10, 3 );
Voici un exemple avec plusieurs hôtes autorisés:
/**
* Allow any internal links, from multiple allowed hosts, in the comment's content
*
* @see http://wordpress.stackexchange.com/a/257917/26350
*/
add_filter( 'comment_max_links_url', function( $num_links, $url, $comment )
{
// Allowed hosts
$allowed_hosts = [ 'foo.tld', 'bar.tld' ]; // <-- Adjust to your needs!
// Get all links
$all_links = preg_match_all(
'/<a [^>]*href=["\']([^"\']+)/i',
$comment,
$links
);
// No links
if( empty( $links[1] ) || ! is_array( $links[1] ) )
return $num_links;
// Count links that are from our allowed hosts
$internal_links = array_reduce(
$links[1],
function( $internal, $link ) use ( $allowed_hosts )
{
if( in_array( wp_parse_url( $link, PHP_URL_Host ), $allowed_hosts, true ) )
$internal += 1;
return $internal;
},
0
);
return ( $num_links - $internal_links );
}, 10, 3 );
Nous avons utilisé array_reduce()
et wp_parse_url()
pour faciliter le comptage des liens internes ou des liens à partir d'hôtes autorisés, dans les plugins ci-dessus.
S'il vous plaît, testez-le plus avant et ajustez-le à vos besoins!