Статьи

Совет: Автоматически связывайте маркеры Twitter с фильтром содержимого

Несколько дней назад я работал над сообщением в своем личном блоге о некоторых недавних историях. Я хотел приписать эти истории подходящему источнику / автору, который в некоторых случаях был из Твиттера. Я начал вручную связывать маркеры Twitter в редакторе WordPress, когда понял, что есть более простой способ сделать это, а затем вернуться и связать любые несвязанные маркеры Twitter в моем блоге. И ответом был простой контент-фильтр.

Примечание: это не интегрируется с API Twitter / включая твиты. Если вы хотите узнать, как это сделать, перейдите к великолепному учебнику Стивена по созданию виджета недавних твитов .


Таким образом, чтобы выполнить эту задачу, нам нужно использовать две вещи: фильтры содержимого WordPress и регулярные выражения (или Regex для краткости). Сначала я покажу вам код, а затем мы сможем пройти через него:

1
2
3
4
5
6
7
8
function wptuts_twitter_handles($content) {
    $pattern= ‘|@([a-zA-Z0-9_]*)|’;
    $replace= @<a href=»http://www.twitter.com/$1″>$1</a>’;
    $content= preg_replace($pattern, $replace, $content);
    return $content;
}
 
add_filter( «the_content», «wptuts_twitter_handles» );

Хорошо — первое, что мы делаем, это определяем нашу функцию, wptuts_twitter_handles() (обратите внимание, я добавил префикс для предотвращения переопределений / ошибок). Эта функция будет вызываться в нашей функции add_filter() , где мы указываем, что мы хотим фильтровать (или изменять), и функцию обратного вызова. По этой причине наша функция принимает один аргумент, $content , который является содержанием текущего сообщения.

Примечание 2: я не эксперт по Regex, и Google мне очень помог. Я буду ссылаться на сообщения, которые я использовал, и объясню выражения так, как смогу.

Для достижения этой цели мы собираемся использовать функцию PHP для обработки регулярных выражений с именем preg_replace() , которая принимает preg_replace() , которым мы хотим заменить этот шаблон, и строку, которую мы хотим найти. Возвращает измененную строку. Здесь мы собираемся сделать предположение: любая буквенно-цифровая строка с включением подчеркивания (_), которому предшествует символ at (@), является дескриптором Twitter. Что мы хотим сделать, так это просмотреть наш контент на наличие любой из этих строк и сделать их гиперссылками на профили Twitter. Шаблон (как определено в нашей переменной $pattern ), который мы используем: |@([a-zA-Z0-9_]*)| , Каналы на обоих концах просто начинаются и заканчиваются разделителями, сообщая нашей программе, что нужно искать между ними. Символ «@» будет взят буквально, так как он находится за скобками. Внутри скобок находится магия. Раздел ‘ [a-zA-Z0-9_] ‘ говорит нашей программе искать любую строку с строчными и прописными буквами, цифрами и подчеркиванием в любом порядке. Звездочка (*) говорит, что это может произойти 0 или более раз (это жадный метод; его можно заменить на «+», что равно 1 или более). Мы хотим заменить шаблон ссылкой Twitter на шаблон, как определено в нашей переменной $replace . preg_replace() будет хранить каждое совпадение в числовой переменной, на которую мы можем затем ссылаться в строке замены. Поскольку мы ищем только один шаблон, мы будем ссылаться $1 .

Теперь мы сделаем фактическую замену, которую мы делаем в этой строке: $content= preg_replace($pattern, $replace, $content); , Это заменит наш текущий контент ссылочным контентом. Мы возвращаем $content и бум! Наши ручки в Твиттере теперь связаны без необходимости делать это вручную.


Как классно сказал Коломбо (а позже и Стив Джобс), когда он был готов закончить, у меня есть еще одна вещь, чтобы сказать вам. Хотя наш текущий шаблон фактически обнаруживает маркеры Twitter, он также обнаруживает адреса электронной почты, как здесь, в моем блоге:


Он заменяет не только адрес электронной почты, но и адрес электронной почты в гиперссылке, ломая все!

По этой причине нам понадобится более сложное регулярное выражение, которое ищет определенный текст перед символом «@», чтобы убедиться, что мы не связываем адрес электронной почты. Пользователь Twitter @shasmirj дает нам действительно хорошее выражение для этого в своем блоге . Давайте заменим $pattern в нашей функции следующим образом:

1
$pattern= ‘/(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i’;

Как видите, это немного сложнее. Суть того, что здесь происходит, заключается в том, что мы хотим убедиться, что несколько символов перед символом ‘@’ (а именно буквенно-цифровые строки) исключены. В Regex символ исключения (^) используется для исключения. По сути, этот шаблон говорит об исключении любой строки, которая имеет цифры или буквы перед «@», и в то же время правильно проверяет имена пользователей в Twitter. Буквенно-цифровая проверка важна; мы все еще хотим, чтобы дескриптор Twitter был связан, если, например, мы поместили его в скобки. Этот на самом деле немного лучше, чем приведенный выше, поскольку он проверяет, является ли первый символ строго буквой, что является обязательным требованием для ручек Twitter. Самое приятное в этой реализации — то, что она исключит связанный текст, поэтому если у вас есть старые посты в блоге, где вы вручную связываете хэндл Twitter, они не сломаются!

Это означает, что наша новая функция выглядит так:

1
2
3
4
5
6
7
8
function wptuts_twitter_handles($content) {
    $pattern= ‘/(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i’;
    $replace= @<a href=»http://www.twitter.com/$1″>$1</a>’;
    $content= preg_replace($pattern, $replace, $content);
    return $content;
}
 
add_filter( «the_content», «wptuts_twitter_handles» );

Просто скопируйте этого плохого парня и вставьте его в файл functions.php, и все будет хорошо! И как забавный факт, вы можете использовать тот же шаблон для обнаружения и связывания хэштегов. Просто замените символ ‘@’ на знак числа (#).