WordPress как на ладони
wordpress jino

Не учитывать внутренние ссылки при блокировке комментария из-за ссылок

В WordPress есть встроенная функция, которая отправляет на модерацию комментарий, если он содержит ссылок больше указанного количества.

Есть ли какое-то решение для того, чтобы внутренние ссылки при этом не учитывались?

1
Leon10102 10 месяцев назад
  • 0
    Kama4486

    Заглянул я в коды... Можно сделать, но не без костылей. Хук в ВП есть, но он какой-то странный...

    Короче, делается так...

    /**
     * Если включена настройка, блокировать комментарий, когда в нем ссылок больше указанного количества. 
     * То WordPress считает все ссылки, включая внутренние.
     * Этот хак изменяет логику подсчета и не считает внутренние ссылки: когда совпадает домен или когда ссылка начинается с '/'
     */
    add_filter('comment_max_links_url', 'my_comment_links_count');
    function my_comment_links_count( $num ){
    	// поле комментария должно иметь атрибут name=comment иногда всякие спам блокеры его меняют...
    	$comment_content = wp_unslash($_POST['comment']);
    
    	if( ! $comment_content ) return $num; // контента нет или его не удалось получить - ничего не делаем...
    
    	preg_match_all('~<a [^>]*href=([\'"])([^\'"]+)\1~i', $comment_content, $match );
    
    	$num = 0; // обнуляем
    	foreach( $match[2] as $url ){
    		$url = trim($url);
    
    		if( $url{0} === '/' )                     continue; // внутряк
    		if( strpos($url, $_SERVER['HTTP_HOST']) ) continue; // внутряк
    
    		$num++; // +1
    	}
    
    	return $num;
    }

    Код вставляем в файл темы functions.php

    Хук нам контент комментария не передает, поэтому приходится брать его из глобальной переменной $_POST['comment'], а она иногда может называться по-другому...

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.