Вставка кода php в виджет без плагина

Вставка кода php в виджет без плагина

Добрый день!

В этой статье я хочу зафиксировать очень полезный фрагмент кода, который позволяет вставлять php код в виджет WordPress без использования плагина. Как это сделать и зачем это нужно читайте далее.

Для тех, кто не знает, давайте сначала разберемся с тем, что такое виджет?

Виджет (от англ. widget – штуковина, попсушка =)) – это блок или контейнер, в который можно помещать различный контент: текст, ссылки, html код, изображения.

В админке WordPress (Внешний видВиджеты) эти блоки можно перемещать (“таскать мышкой”) и располагать в нужном месте и порядке. В зависимости, от используемого шаблона, виджеты можно размещать в сайдбаре (сайдбарах), хедере, футере. По умолчанию, после установки WordPress, вы можете наблюдать наличие виджетов: Поиск, Свежие комментарии, Рубрики, Архивы, Мета.

Теперь для примера рассмотрим такую ситуацию. Пусть у вас в сайдбаре есть два виджета: “Свежие записи” и “Свежие комментарии”. Вы хотите между ними разместить еще что-то. Если это “что-то” из, выше приведенного списка (текст, ссылка, html код или изображение), то вам достаточно взять виджет “Текст” (Произвольный текст или HTML-код) перетянуть его в сайдбар, разместив между существующими виджетами, и внести необходимый текст. После сохранения получаете нужный результат между виджетами “Свежие записи” и “Свежие комментарии”.

В случае, если для получения и вывода данных используется функция, то произвести вызов функции из виджета вы уже не сможете. Нельзя в текстовый виджет вставить такой код для вызова функции:

Т.е., это нельзя сделать в стандартной настройке WordPress. Существуют какие-то плагины, для включения этой возможности, но я предлагаю вам фрагмент кода, который позволит вставлять php код в виджет без плагина. Нашел я этот код у Сеолётчика.

Вот этот код нужно добавить в файл functions.php, используемой темы:

Немного разъяснений для тех, кто хочет понять как работает данный код.

Строка 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 не воспринимался как код.

Ошибка:

Строка “Популярные статьи” воспринимается функцией eval как код к выполнению.

Верно:

Теперь строка расположена между закрывающим ‘?>’ и открывающим ‘<?’ тегами php и функция eval не воспринимает её как код для выполнения.

Строка 7: Получаем содержимое буфера в переменную $text

Строка 8: ob_end_clean() – очищаем буфер и отключаем буферизацию

Строка 10: Возвращаем результат работы функции в виджет.

Вот и всё! Теперь вы можете вставлять любой код в виджет WordPress!

Например, можете написать (или найти готовую) функцию, которая будет возвращать топ самых комментируемых записей. И потом для вывода этого списка в виджет сайдбара просто пропишете вызов вашей функции в текстовый виджет:

Выполнение кода php в виджете открывает широкие возможности для расширения функционала своего блога без использования плагинов.

Можно сделать ряд виджетов типа: “Популярные записи”, “Комментируемые записи”, “Случайные записи”, “Непопулярные записи” =), “Топ комментаторов”, “Случайные комментаторы”. Что еще? Можно реализовать раскрывающийся список рубрик  или написать функцию вывода рубрик с их желаемой сортировкой. Пока на большее фантазии не хватает.

Напишите в комментарии ваши идеи насчет того, что еще можно выводить в виджет? Классно будет, если предложенный вариант не реализован в существующих плагинах и скриптах. По крайней мере, тех, что известны и широко распространены. Если идея мне понравится – я попробую её реализовать. Спасибо за участие!

Всё, пока! До новых встреч!

Оригинальных виджетов!

Понравилась статья? Не забудьте поделиться с друзьями и коллегами:

Вы можете пропустить чтение записи и оставить комментарий. Размещение ссылок запрещено.

23 комментария к записи “Вставка кода php в виджет без плагина”

  1. Павлуха

    Чем больше познаю вордпресс, тем больше обхожусь без виджетов. Хотя, жена иногда жалуется, что при моём подходе к программированию тем оформления не всегда интуитивно понятно, в каком именно шаблоне надо внести правку, чтобы, например, изменить id формы комментариев ВКонтакте, чтобы она заработала на новом сайте. Да и вообще последнее время у меня получаются такие темы, где смешиваются люди, кони, хедеры и сайдбары.

    Насчёт вопроса “Что еще?”, ещё можно вывести последние посещённые страницы, а также указать, с какой ПС приходили и по какому запросу. Можно указывать популярные поисковые запросы со ссылками на соотвествующие посты. Можно выводить список запросов, по которым приходили на текущую страницу (API Метрики в помощь). Или список запросов (в качестве анкоров), по которым приходили на страницы, с которых переходили на текущую страницу.

    PHP в виджете позволит вывести не просто популярные посты, а популярные именно в той рубрике, которая (или пост которой) сейчас просматривается.

    Можно сделать ротатор объявлений, выводить информацию о текущих событиях (обратный таймер, новости из RSS стороннего ресурса, инфу о праздниках в этот день и т.п.)

    • Алексей Ершов

      Чем проще тема, тем лучше. Люди не любят сложности. У моего блога есть читатель, которого WordPress покорил именно виджетами =)
      Вот эта вставка кода для многих уже может быть проблемой. Такие люди будут устанавливать плагин.

      За предложенный функционал для виджетов – спасибо! Беру на заметку.

      • Павлуха

        Я знаком с такими читателями. Таким я вообще боюсь давать сырой код – лучше готовый файл плагина, который можно безбоязненно активировать. А вообще да – виджеты тема. Не такая тема, как произвольные типы записей, но тема.

  2. Анатолий

    Возьму на заметку. Сегодня плагин себе поставил для этих целей, а в будущем может буду обходиться без него.

  3. Ruson

    Добрый день, спасибо за код, поставил все отлично работает!

    p.s. У вас блок лайков слева залазит на контент при небольшом разрешении экрана. У меня такая же проблема =) Думал прописать исключение, что если разрешение екрана меньше чем 1024 то вобще его не показывать или показывать, но гдето в футере, но пока не знаю как…

    • Алексей Ершов

      Добрый день!
      Спасибо за замечание. Что-нибудь придумаю по этому поводу.

  4. Виталий

    Добрый день, Алексей. Столкнулся с проблемой вставки ссылки html в виджет “текст” на сайте, прописываю ссылку на определённую страницу, сохраняю в итоге она всёравно приводит на главную. Подскажите плз, в чём может быть проблема, сломал себе голову уже. Заранее спасибо. Вот код ссылки который прописываю

    • Алексей Ершов

      Добрый день, Виталий!
      В ссылке у вас отсутствует атрибут href.

  5. Виталий

    Добрый день. Спасибо за быстрый ответ. Почему отсутствует, вот он в самом начале

    • Алексей Ершов

      Наверное, у меня в комментариях обрезает код ссылок – приходит без href. Если пишите код верно, тогда затрудняюсь “вслепую” сказать что там не так.

      • Виталий

        а как можно решить проблему, может вы через мой комп зайдёте (можно через удалённый вход в скайп) и посмотрите, я реально сломал голову уже и перерыл кучу форумов…

      • Виталий

        может этот плагин Broken Link Checker как-то блокирует?

        • Алексей Ершов

          Деактивируйте его и проверьте.

  6. Виталий

    в общем убрал из кода кусок, который за цвет ссылки и подчёркивание отвечает и заработало. очень странно что это было помехой. в любом случае спасибо. буду дальше эксперементировать. если у вас есть хорошие seo специалист по вордпресс сайтам давайте знать – нуждаюсь.

  7. Наталья

    Алексей, ОГРОМНОЕ спасибо за информацию, а также за статью “Исполняемый php код в записях WordPress”.

  8. Сергей

    Здравствуйте, Алексей! Если я правильно понял, виджет “текст” может принимать любой вид, главное вставить в него правильный html код. Идея такая – меня не устраивает внешний вид виджета “поиск по сайту” и я хочу вставить в него иконку, которая будет хорошо вписываться в общий внешний вид сайта. Вставлять картинку (иконку) я научился, а вот где взять код того же виджета “поиск по сайту” не пойму. Помогите пожалуйста.

    • Алексей Ершов

      Здравствуйте, Сергей!
      Смотрите в админке: Внешний вид – Виджеты – Доступные виджеты. Там есть и виджет “Текст” и “Поиск” и другие. Обращаю внимание, что не все шаблоны поддерживают виджеты.

  9. Сергей

    Алексей, возможно я не совсем точно описал проблему. Я пытаюсь превратить виджет “текст” в виджет “поиск по сайту” путем вставки html кода. А перед кодом вставить подготовленную иконку. Таким образом получить виджет “поиск по сайту” с нужной мне иконкой. Возможно ли это?

    • Алексей Ершов

      Да, возможно. Тогда вам нужно и форму поиска прописывать с помощью html. Если форма поиска уже есть у вас на сайте в другом месте, то можно скопировать оттуда, посмотрев исходный код элемента. Вот, для примера, код формы поиска с этого блога:

      Если же поиска в шаблоне нет, то это усложняет задачу, потому что нужно самому создавать (или копировать с других шаблонов) файл с алгоритмом поиска.

  10. Алекей

    НЕ работает функция “вставить ссылку” в редакторе вордпресс. Что делать? Плагины отключил все ВОБЩЕ.

  11. Надежда

    Здравствуйте Алексей. У меня никак не получается вывести ссылку из виджета текст на определенную страницу. Допустим, у меня есть страницы, которые невидимы. На них идут ссылки из виджета текст. С первой страницей вышло все сразу, поставила ссылку, она работает без проблем. А вот ссылка на другую страницу ведет на несуществующую страницу. Но она же есть, только невидима. Как это можно реализовать нормально? Подскажите, пожалуйста, “чайнику”))), а то я уже несколько дней только этим и занимаюсь, а толку никакого.

    • Алексей Ершов

      Здравствуйте, Надежда!
      Для размещения ссылки в виджете нужно разместить html код следующего вид:

      Если что-то не срабатывает, тогда, пожалуйста, сообщайте подробней какой виджет, какой текст и т.д. По возможности – посмотрю.
      В “Приятного аппетита” вижу у Вас неверно ссылки указаны.

  12. Дмитрий

    Скопировал

    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

Оставить комментарий

Для размещения кода в комментарии используйте теги <pre> </pre>, например:


Подписаться, не комментируя