Сегодня хотел поделиться коротким сниппетом для WordPress. Идею я подсмотрел на сайте «Тостер». Кто не знает, это сервис вопросов и ответов для IT-шников. Суть идеи — преобразование url в человекопонятный заголовок. Другими словами, когда пользователь в комментарии отправит ссылку вида http://site.ru/some-page/, WordPress автоматически получит заголовок статьи, на которую ссылаются. Ссылка будет выглядеть простым текстом: Title of post.

Давайте попробуем это реализовать. Сделаю небольшую оговорку. Наш код будет преобразовывать ссылки ведущие только на внутренние страницы текущего сайта. Если в комментарии есть ссылка на сторонний ресурс, он будет выводиться обычным способом.

Кроме того, сделаем еще одну штуку. Если пользователь ввел длинную ссылку на сторонний ресурс, например вида http://site.ru/some-page-with-long-url/, он будет занимать слишком много места. Давайте все такие длинные ссылки укоротим, они будут выглядеть примерно так: http://site.ru/some-...-url/. И еще. Всем внешним ссылкам добавим атрибут nofollow.

Итак, обозначив задачу, приступим к её выполнению. Необходимые комментарии, я разместил прямо в коде. Разместите следующий сниппет в файл function.php:

function url_to_title($matches) {
	$site_url = 'site.ru'; // замените на адрес вашего сайта
	$result = strpos ( $matches[1], $site_url );
	// проверим, принадлежит ли url в тексте комментария текущему сайту или нет
	if ( $result !== false ) {
		// получаем id по url
		$postid = url_to_postid( $matches[1] );
		// получаем заголовок по id
		$title = get_the_title( $postid );
		return '<a href="' . $matches[1] . '" target="_blank">' . $title . '</a>';
	} else {
		$short_url = preg_replace('~^([^/]*)/(.{5})(.{3,})(.{10})$~', '$1/$2...$4', $matches[2]);
		return '<a href="' . $matches[1] . '" target="_blank" rel="nofollow noindex">' . $short_url . '</a>';
	}
}
function detect_comment_url($content) {
    $pattern= '/<a.*href=\"(https?:\/\/.*)\".*>https?:\/\/(.*)<\/a>/iU';
    $content= preg_replace_callback($pattern, 'url_to_title', $content);
    return $content;
}
add_filter( 'comment_text', 'detect_comment_url' , 9);

Если у вас будут идеи доработки, пожалуйста, пишите в комментариях.

1 комментарий к записи

Добавить комментарий