Exclude internal links from comment moderation?

The comment_max_links_url filter

We can count the number of internal links in the comment’s content and subtract that from the total number of links found there ($num_links), with the help of the following filter inside the check_comment() core function:

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

The core only counts the number of <a> tags, containing the href attribute, with:

$num_links = preg_match_all( '/<a [^>]*href/i', $comment, $out );

Demo plugin – Allow links from the home url host

Here’s an example, to allow any internal links in the comment’s content:

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

Demo plugin – Allow links from multiple hosts

Here’s an example with multiple allowed hosts:

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

We used array_reduce() and wp_parse_url() to help with the counting of the internal links or links from allowed hosts, in the above plugins.

Please test it further and adjust to your needs!

Leave a Comment