web-dev-qa-db-ja.com

コメントの管理から内部リンクを除外しますか?

[設定] - [ディスカッション] - [コメント管理]の最初のオプションは次のとおりです。

"1"以上のリンクがある場合、コメントをキューに入れます。 (コメントスパムの一般的な特徴は、多数のハイパーリンクです。)

それは便利ですが、内部リンクを無視すれば私と私の訪問者にとってはずっと良いでしょう。ユーザーはサイトの他の記事を参照することが多く、それは良いことです。しかし、彼らはユーザーと管理者の両方にとって迷惑なモデレーションキューに巻き込まれます。

それで、この設定をホワイトリストドメインにフィルタリングする方法はありますか?ワードプレスがホストされているドメインのように。

3
Michael Rogers

comment_max_links_urlフィルタ

check_comment()コア関数内の次のフィルタを使用して、コメントのコンテンツ内の内部リンクの数を数え、そこにあるリンクの総数($num_links)から差し引くことができます。

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

コアは、href属性を含む<a>タグの数のみを数えます。

$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
birgire