
Добрый день!
В этой статье я хочу зафиксировать очень полезный фрагмент кода, который позволяет вставлять php код в виджет WordPress без использования плагина. Как это сделать и зачем это нужно читайте далее.
Для тех, кто не знает, давайте сначала разберемся с тем, что такое виджет?
Виджет (от англ. widget – штуковина, попсушка =)) – это блок или контейнер, в который можно помещать различный контент: текст, ссылки, html код, изображения.
В админке WordPress (Внешний вид – Виджеты) эти блоки можно перемещать (“таскать мышкой”) и располагать в нужном месте и порядке. В зависимости, от используемого шаблона, виджеты можно размещать в сайдбаре (сайдбарах), хедере, футере. По умолчанию, после установки WordPress, вы можете наблюдать наличие виджетов: Поиск, Свежие комментарии, Рубрики, Архивы, Мета.
Теперь для примера рассмотрим такую ситуацию. Пусть у вас в сайдбаре есть два виджета: “Свежие записи” и “Свежие комментарии”. Вы хотите между ними разместить еще что-то. Если это “что-то” из, выше приведенного списка (текст, ссылка, html код или изображение), то вам достаточно взять виджет “Текст” (Произвольный текст или HTML-код) перетянуть его в сайдбар, разместив между существующими виджетами, и внести необходимый текст. После сохранения получаете нужный результат между виджетами “Свежие записи” и “Свежие комментарии”.
В случае, если для получения и вывода данных используется функция, то произвести вызов функции из виджета вы уже не сможете. Нельзя в текстовый виджет вставить такой код для вызова функции:
1 2 3 |
<?php my_function(); ?> |
Т.е., это нельзя сделать в стандартной настройке WordPress. Существуют какие-то плагины, для включения этой возможности, но я предлагаю вам фрагмент кода, который позволит вставлять php код в виджет без плагина. Нашел я этот код у Сеолётчика.
Вот этот код нужно добавить в файл functions.php, используемой темы:
1 2 3 4 5 6 7 8 9 10 11 12 |
add_filter('widget_text', 'my_widget_execute_php', 100); function my_widget_execute_php($text) { if(strpos($text,'<?') !== false) { ob_start(); eval('?>'.$text); $text = ob_get_contents(); ob_end_clean(); } return $text; } |
Немного разъяснений для тех, кто хочет понять как работает данный код.
Строка 2: add_filter – прикрепляет дополнительный код к функции widget_test. Здесь мы используем систему хуков. Об этом я упоминал при создании плагина. То есть, теперь стандартная функция WordPress widget_text будет “цеплять” код нашей функции my_widget_execute_php.
Строка 3: Объявление функции my_widget_execute_php. Она принимает один параметр $text, который содержит текст из виджета.
Строка 4: Далее в полученной строке $text мы ищем признаки присутствия php-кода (подстрока ‘<?’).
Строка 5: Если php-код обнаружен, то включаем буферизацию вывода с помощью функции ob_start(). Теперь вся информация, предназначенная для вывода, будет временно помещаться в буфер.
Строка 6: Функция eval запускает на выполнение php-код, содержащийся в полученной строке $text.
Единственное, перед строкой $text добавляем ‘?>’, чтобы текст, который может присутствовать до кода php не воспринимался как код.
Ошибка:
1 2 3 |
eval("Популярные статьи: <?php my_popular_posts(); ?>"); |
Строка “Популярные статьи” воспринимается функцией eval как код к выполнению.
Верно:
1 2 3 |
eval("?> Популярные статьи: <?php my_popular_posts(); ?>"); |
Теперь строка расположена между закрывающим ‘?>’ и открывающим ‘<?’ тегами php и функция eval не воспринимает её как код для выполнения.
Строка 7: Получаем содержимое буфера в переменную $text
Строка 8: ob_end_clean() – очищаем буфер и отключаем буферизацию
Строка 10: Возвращаем результат работы функции в виджет.
Вот и всё! Теперь вы можете вставлять любой код в виджет WordPress!
Например, можете написать (или найти готовую) функцию, которая будет возвращать топ самых комментируемых записей. И потом для вывода этого списка в виджет сайдбара просто пропишете вызов вашей функции в текстовый виджет:
1 2 3 |
<?php top_comments_posts(); ?> |
Выполнение кода php в виджете открывает широкие возможности для расширения функционала своего блога без использования плагинов.
Можно сделать ряд виджетов типа: “Популярные записи”, “Комментируемые записи”, “Случайные записи”, “Непопулярные записи” =), “Топ комментаторов”, “Случайные комментаторы”. Что еще? Можно реализовать раскрывающийся список рубрик или написать функцию вывода рубрик с их желаемой сортировкой. Пока на большее фантазии не хватает.
Напишите в комментарии ваши идеи насчет того, что еще можно выводить в виджет? Классно будет, если предложенный вариант не реализован в существующих плагинах и скриптах. По крайней мере, тех, что известны и широко распространены. Если идея мне понравится – я попробую её реализовать. Спасибо за участие!
Всё, пока! До новых встреч!
Оригинальных виджетов!
Чем больше познаю вордпресс, тем больше обхожусь без виджетов. Хотя, жена иногда жалуется, что при моём подходе к программированию тем оформления не всегда интуитивно понятно, в каком именно шаблоне надо внести правку, чтобы, например, изменить id формы комментариев ВКонтакте, чтобы она заработала на новом сайте. Да и вообще последнее время у меня получаются такие темы, где смешиваются люди, кони, хедеры и сайдбары.
Насчёт вопроса “Что еще?”, ещё можно вывести последние посещённые страницы, а также указать, с какой ПС приходили и по какому запросу. Можно указывать популярные поисковые запросы со ссылками на соотвествующие посты. Можно выводить список запросов, по которым приходили на текущую страницу (API Метрики в помощь). Или список запросов (в качестве анкоров), по которым приходили на страницы, с которых переходили на текущую страницу.
PHP в виджете позволит вывести не просто популярные посты, а популярные именно в той рубрике, которая (или пост которой) сейчас просматривается.
Можно сделать ротатор объявлений, выводить информацию о текущих событиях (обратный таймер, новости из RSS стороннего ресурса, инфу о праздниках в этот день и т.п.)
Чем проще тема, тем лучше. Люди не любят сложности. У моего блога есть читатель, которого WordPress покорил именно виджетами =)
Вот эта вставка кода для многих уже может быть проблемой. Такие люди будут устанавливать плагин.
За предложенный функционал для виджетов – спасибо! Беру на заметку.
Я знаком с такими читателями. Таким я вообще боюсь давать сырой код – лучше готовый файл плагина, который можно безбоязненно активировать. А вообще да – виджеты тема. Не такая тема, как произвольные типы записей, но тема.
Возьму на заметку. Сегодня плагин себе поставил для этих целей, а в будущем может буду обходиться без него.
Добрый день, спасибо за код, поставил все отлично работает!
p.s. У вас блок лайков слева залазит на контент при небольшом разрешении экрана. У меня такая же проблема =) Думал прописать исключение, что если разрешение екрана меньше чем 1024 то вобще его не показывать или показывать, но гдето в футере, но пока не знаю как…
Добрый день!
Спасибо за замечание. Что-нибудь придумаю по этому поводу.
Добрый день, Алексей. Столкнулся с проблемой вставки ссылки html в виджет “текст” на сайте, прописываю ссылку на определённую страницу, сохраняю в итоге она всёравно приводит на главную. Подскажите плз, в чём может быть проблема, сломал себе голову уже. Заранее спасибо. Вот код ссылки который прописываю
Добрый день, Виталий!
В ссылке у вас отсутствует атрибут href.
Добрый день. Спасибо за быстрый ответ. Почему отсутствует, вот он в самом начале
Наверное, у меня в комментариях обрезает код ссылок – приходит без href. Если пишите код верно, тогда затрудняюсь “вслепую” сказать что там не так.
а как можно решить проблему, может вы через мой комп зайдёте (можно через удалённый вход в скайп) и посмотрите, я реально сломал голову уже и перерыл кучу форумов…
может этот плагин Broken Link Checker как-то блокирует?
Деактивируйте его и проверьте.
в общем убрал из кода кусок, который за цвет ссылки и подчёркивание отвечает и заработало. очень странно что это было помехой. в любом случае спасибо. буду дальше эксперементировать. если у вас есть хорошие seo специалист по вордпресс сайтам давайте знать – нуждаюсь.
Алексей, ОГРОМНОЕ спасибо за информацию, а также за статью “Исполняемый php код в записях WordPress”.
Здравствуйте, Алексей! Если я правильно понял, виджет “текст” может принимать любой вид, главное вставить в него правильный html код. Идея такая – меня не устраивает внешний вид виджета “поиск по сайту” и я хочу вставить в него иконку, которая будет хорошо вписываться в общий внешний вид сайта. Вставлять картинку (иконку) я научился, а вот где взять код того же виджета “поиск по сайту” не пойму. Помогите пожалуйста.
Здравствуйте, Сергей!
Смотрите в админке: Внешний вид – Виджеты – Доступные виджеты. Там есть и виджет “Текст” и “Поиск” и другие. Обращаю внимание, что не все шаблоны поддерживают виджеты.
Алексей, возможно я не совсем точно описал проблему. Я пытаюсь превратить виджет “текст” в виджет “поиск по сайту” путем вставки html кода. А перед кодом вставить подготовленную иконку. Таким образом получить виджет “поиск по сайту” с нужной мне иконкой. Возможно ли это?
Да, возможно. Тогда вам нужно и форму поиска прописывать с помощью html. Если форма поиска уже есть у вас на сайте в другом месте, то можно скопировать оттуда, посмотрев исходный код элемента. Вот, для примера, код формы поиска с этого блога:
Если же поиска в шаблоне нет, то это усложняет задачу, потому что нужно самому создавать (или копировать с других шаблонов) файл с алгоритмом поиска.
НЕ работает функция “вставить ссылку” в редакторе вордпресс. Что делать? Плагины отключил все ВОБЩЕ.
Здравствуйте Алексей. У меня никак не получается вывести ссылку из виджета текст на определенную страницу. Допустим, у меня есть страницы, которые невидимы. На них идут ссылки из виджета текст. С первой страницей вышло все сразу, поставила ссылку, она работает без проблем. А вот ссылка на другую страницу ведет на несуществующую страницу. Но она же есть, только невидима. Как это можно реализовать нормально? Подскажите, пожалуйста, “чайнику”))), а то я уже несколько дней только этим и занимаюсь, а толку никакого.
Здравствуйте, Надежда!
Для размещения ссылки в виджете нужно разместить html код следующего вид:
Если что-то не срабатывает, тогда, пожалуйста, сообщайте подробней какой виджет, какой текст и т.д. По возможности – посмотрю.
В “Приятного аппетита” вижу у Вас неверно ссылки указаны.
Скопировал
add_filter(‘widget_text’, ‘my_widget_execute_php’, 100);
function my_widget_execute_php($text) {
if(strpos($text,”.$text);
$text = ob_get_contents();
ob_end_clean();
}
return $text;
}
Вставил в файл functions.php, используемой темы, при попытке подключения РНР пишет на сайте: Есть идеи почему?
Parse error: syntax error, unexpected ‘<' in /home/burabai/burabai.org/www/wp-content/themes/accelerate-pro/functions.php(75) : eval()'d code on line 1
Добрый день.
Подскажите как запустить скрипт на сайте через виджет “текст”
вот код
вставляю, ничего не происходит, только белое поле. Хотя файл загружен в корень
К сожалению, не работает. Добавил код вниз файла functions.php и теперь на всех страницах верху отображается “add_filter(‘widget_text’, ‘my……” и т.д. весь код. Пришлось вернуть functions.php из резервной копии.