Исключить внутренние ссылки из модерации комментариев?


Первый вариант в Настройках - Обсуждение - Модерация комментариев:

Удерживайте комментарий в очереди, если он содержит "1" или более ссылок. (Общей характеристикой спама с комментариями является большое количество гиперссылок.)

Это полезно, но для меня и моих посетителей было бы намного лучше, если бы он игнорировал внутренние ссылки. Много раз пользователи ссылаются на другие статьи сайта, и это хорошо. Но они попадают в очередь на модерацию, которая раздражает как пользователей, так и администратора.

Итак, есть ли способ отфильтровать эти параметры для доменов белого списка? Например, домен, в котором размещается wordpress.

Author: Michael Rogers, 2017-02-25

1 answers

Фильтр comment_max_links_url

Мы можем подсчитать количество внутренних ссылок в содержимом комментария и вычесть их из общего количества найденных там ссылок ($num_links) с помощью следующего фильтра внутри основной функции 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 );

Ядро подсчитывает только количество тегов <a>, содержащих атрибут href, с помощью:

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

Демонстрационный плагин - Разрешает ссылки с хоста домашнего URL

Вот пример, чтобы разрешить любые внутренние ссылки в содержание комментария:

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

Демонстрационный плагин - Разрешает ссылки с нескольких хостов

Вот пример с несколькими разрешенными хостами:

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

Мы использовали array_reduce() и wp_parse_url() чтобы помочь с подсчетом внутренних ссылок или ссылок с разрешенных хостов, в приведенных выше плагинах.

Пожалуйста, протестируйте его дальше и приспособьте к вашим потребностям!

 2
Author: birgire, 2017-02-26 09:27:10