web-dev-qa-db-fra.com

Exclure les liens internes de la modération des commentaires?

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é.

3
Michael Rogers

Le filtre 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 );

Plugin de démonstration - Autoriser les liens de l'URL d'accueil

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 );

Plugin de démonstration - Autoriser les liens de plusieurs hôtes

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!

2
birgire