Несколько дней назад я работал над сообщением в своем личном блоге о некоторых недавних историях. Я хотел приписать эти истории подходящему источнику / автору, который в некоторых случаях был из Твиттера. Я начал вручную связывать маркеры 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, и все будет хорошо! И как забавный факт, вы можете использовать тот же шаблон для обнаружения и связывания хэштегов. Просто замените символ ‘@’ на знак числа (#).