[設定] - [ディスカッション] - [コメント管理]の最初のオプションは次のとおりです。
"1"以上のリンクがある場合、コメントをキューに入れます。 (コメントスパムの一般的な特徴は、多数のハイパーリンクです。)
それは便利ですが、内部リンクを無視すれば私と私の訪問者にとってはずっと良いでしょう。ユーザーはサイトの他の記事を参照することが多く、それは良いことです。しかし、彼らはユーザーと管理者の両方にとって迷惑なモデレーションキューに巻き込まれます。
それで、この設定をホワイトリストドメインにフィルタリングする方法はありますか?ワードプレスがホストされているドメインのように。
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 );
これは、コメントの内容に内部リンクを許可するための例です。
/**
* 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()
を使用しました。または上記のプラグインで許可されたホストからのリンク。
さらにテストして、ニーズに合わせて調整してください。