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

make_clickable() WP 0.71

Конвертирует не кликабельные ссылки в тексте - http://ссылка в кликабельные (в HTML ссылку). Также преобразует в ссылку текст начинающийся с: www, ftp, email.

Конвертирует строки начинающиеся с http://, www, ftp, email в соответствующий HTML код ссылки.

Учитывает варианты, когда URI уже кликабелен в тексте и не заменяет его повторно.

Не обрабатывает текст внутри тегов: <code>, <pre>, <script>, <style>.

Пропускает возвращаемую строку через PHP функцию trim() - удаляет пробелы на концах строки. У меня однажды возникли сложности с этой особенностью. С версии 3.8. пробелы на концах не удаляются.

✈ 1 раз = 0.000455с = быстро | 50000 раз = 6.45с = быстро PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

Строку. Измененный текст с HTML ссылками.

Использование

$text = make_clickable( $ret );
$ret(строка) (обязательный)
Текст, который нужно отфильтровать.
По умолчанию: нет

Примеры

#1. Превратим ссылку в тексте (УРЛ) в кликабельную HTML ссылку:

<?php
$ret = "Какой-то текст http://site.ru/page-108 и еще какой-то текст.";
echo make_clickable( $ret );
 ?>

В результате этого примера мы получим:

Какой-то текст <a href="http://site.ru/page-108" rel="nofollow">http://site.ru/page-108</a> и еще какой-то текст.

Код make clickable: wp-includes/formatting.php VER 4.9.1

<?php
function make_clickable( $text ) {
	$r = '';
	$textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // split out HTML tags
	$nested_code_pre = 0; // Keep track of how many levels link is nested inside <pre> or <code>
	foreach ( $textarr as $piece ) {

		if ( preg_match( '|^<code[\s>]|i', $piece ) || preg_match( '|^<pre[\s>]|i', $piece ) || preg_match( '|^<script[\s>]|i', $piece ) || preg_match( '|^<style[\s>]|i', $piece ) )
			$nested_code_pre++;
		elseif ( $nested_code_pre && ( '</code>' === strtolower( $piece ) || '</pre>' === strtolower( $piece ) || '</script>' === strtolower( $piece ) || '</style>' === strtolower( $piece ) ) )
			$nested_code_pre--;

		if ( $nested_code_pre || empty( $piece ) || ( $piece[0] === '<' && ! preg_match( '|^<\s*[\w]{1,20}+://|', $piece ) ) ) {
			$r .= $piece;
			continue;
		}

		// Long strings might contain expensive edge cases ...
		if ( 10000 < strlen( $piece ) ) {
			// ... break it up
			foreach ( _split_str_by_whitespace( $piece, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses
				if ( 2101 < strlen( $chunk ) ) {
					$r .= $chunk; // Too big, no whitespace: bail.
				} else {
					$r .= make_clickable( $chunk );
				}
			}
		} else {
			$ret = " $piece "; // Pad with whitespace to simplify the regexes

			$url_clickable = '~
				([\\s(<.,;:!?])                                        # 1: Leading whitespace, or punctuation
				(                                                      # 2: URL
					[\\w]{1,20}+://                                # Scheme and hier-part prefix
					(?=\S{1,2000}\s)                               # Limit to URLs less than about 2000 characters long
					[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+         # Non-punctuation URL character
					(?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character
						[\'.,;:!?)]                            # Punctuation URL character
						[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character
					)*
				)
				(\)?)                                                  # 3: Trailing closing parenthesis (for parethesis balancing post processing)
			~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character.
			      // Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.

			$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );

			$ret = preg_replace_callback( '#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret );
			$ret = preg_replace_callback( '#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret );

			$ret = substr( $ret, 1, -1 ); // Remove our whitespace padding.
			$r .= $ret;
		}
	}

	// Cleanup of accidental links within links
	return preg_replace( '#(<a([ \r\n\t]+[^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $r );
}

Cвязанные функции

Из раздела: Форматирование

make_clickable 4 комментария
  • Дина

    А можно эту функцию как-то отключить? Обнаружила, что любой текст в теле статьи, начинающийся с "http://", "www", или вида "site.ru/page" автоматически превращается в ссылки. Готова даже заплатить, лишь бы убрать эту дрянь

    Ответить3 месяца назад #
    • Kama4696

      НЕ факт что это из-за этой функции. По умолчанию она включена только для текста комментария, вот так:

      add_filter( 'comment_text', 'make_clickable',      9 );

      А отключается так в functions.php темы:

      remove_filter( 'comment_text', 'make_clickable',      9 );

      Попробуй найти подобную строку на хуке the_content и отключить соответственно. Ищи что такую строку в теме или плагине...

      add_filter( 'the_content', 'make_clickable' );

      Если не найдешь, то возможно это тема, или плагин как-то иначе делает ссылки кликабельными. Тут нужно будет путем исключения определить кто это так делает, далее искать как отключить.

      П.С. если совет помог, реквизиты кошельков: WM R169741461448, WM Z886474893658, ЯД 410014568980798

      Ответить3 месяца назад #
  • Дина

    Kama, спасибо за "наводку"! Ты, конечно же, оказался прав - "косячил" Disqus. Подключала не через плагин, а универсальным скриптом с их сайта. Странно, раньше все работало нормально. Снесла нафиг и вернула родные вордпрессовские комменты.
    P.S. Мою скромную признательность за помощь отправила через ЯД.

    Ответить3 месяца назад #
  • Николай

    Спасибо

    1
    Ответитьмесяц назад #

Здравствуйте, !

Ваш комментарий
Предпросмотр