Добавление PHP-кода в виджеты WordPress без использования плагинов

По умолчанию виджеты поддерживают только обычный текст и HTML-код. Но люди очень часто сталкиваются с необходимостью вставки в виджет кода PHP, например при установки Sape.

Конечно, есть уйма плагинов, позволяющих это реализовать, но мы, как обычно, воздержимся от их использования и всё, что потребуется — это вставить следующий код в functions.php текущей темы:

function php_in_widgets($widget_content) {
	if (strpos($widget_content, '<' . '?') !== false) {
		ob_start();
		eval('?' . '>' . $widget_content);
		$widget_content = ob_get_contents();
		ob_end_clean();
	}
	return $widget_content;
}
 
add_filter('widget_text', 'php_in_widgets', 99);

Та-дам, теперь можете добавлять PHP-код в текстовые виджеты. И никаких плагинов.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 14

Комментирование этого поста более не доступно.
  • Ольга 13 ноября 2012 #

    Спасибо, Миша!!! Только недавно уже установила похожий код, до этого пользовалась плагином. Эту статью немного бы пораньше - но думаю другим это будет очень полезно. -1 плагин +скорость работы блога.

    • Миша 13 ноября 2012 #

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

      • Ольга 16 ноября 2012 #

        Я с радостью буду туда заглядывать... Вот ещё бы руки там выдавали и голову... Такого раздела не планируется создать??? ))))

      • Миша 16 ноября 2012 #

        ыы)

  • Nurlan 26 ноября 2012 #

    Меня очень смущают эти строки:

    eval('?' . '>' . $widget_content);
    $widget_content = ob_get_contents();

    Пож. объясните.

    • Миша 26 ноября 2012 #

      Добрый день, Нурлан!
      в данном примере функции ob_get_contents, ob_start, ob_end_clean нужны для буферизации вывода, то есть всё, начиная с функции ob_start вместо того, чтобы выводиться, записывается в буфер.
      Если у вас ругается антивирус, то возможно проблема в eval, так как она выполняет PHP-код, содержащийся в виджете.

  • Илья 11 января 2013 #

    Подскажите пожалуйста, может немного не по теме, но все-таки...вот есть стандартный виджет "Свежие записи". Где можно просмотреть код этого виджета, дабы внести изменения в него (хочу миниатюры постов в сайдбаре вывести через стандартный виджет)?

    • Миша 11 января 2013 #

      класс виджета свежих записей находится в этом файле
      wp-includes\default-widgets.php, начиная с 527й строчки)

  • Сергей 5 июня 2013 #

    А как обойтись без eval? Antivirus ругается... Не опасно ли использование данного кода?

    • Миша 5 июня 2013 #

      ну, антивирус недоволен тем, что выполняется php-код из виджета, если к настройкам виджета не будет доступа у подозрительных лиц, тогда никакой опасности нет

  • prostolinux 28 мая 2014 #

    Скажите, а как навигацию сделать как у вас тут кнопки справа и влево экрана?

    • Миша 29 мая 2014 #

      1. добавить две ссылки в HTML сайта, расположить их при помощи position:fixed,
      2. сами ссылки генерируются функцией get_adjacent_post()
      как-то так 🙂 могу на следующей неделе написать об этом пост.

  • Чернов Игорь 9 ноября 2019 #

    Не робит уже =(

  • Alexander 30 марта 2020 #

    спасибо. то что искал! работает как описано.