Добавление 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-код в текстовые виджеты. И никаких плагинов.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 12

  • Ольга13 ноября 2012 в 15:11 #

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

    • Миша13 ноября 2012 в 16:11 #

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

  • Nurlan26 ноября 2012 в 11:11 #

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

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

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

    • Миша26 ноября 2012 в 21:11 #

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

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

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

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

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

  • Сергей5 июня 2013 в 11:06 #

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

    • Миша5 июня 2013 в 12:06 #

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

  • prostolinux28 мая 2014 в 11:05 #

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

    • Миша29 мая 2014 в 06:05 #

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

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • alex morozov: Ура, спасибо! Все-таки я разобрался ! Сделал:

  • alex morozov: Сделал Класс добаляется даже если поле пустое

  • Vladislav: Лучше бы посоветовали изящное решение имеющейся проблемы.

  • alex morozov: Не очень понял. Я добавляю метабокс через класс, почти как у вас. class Desc_Meta_Box { private $screens = array(...

  • Миша: Метод тыка хорош, но оснвоы нужно знать в любом случае. Рекомендую почитать это.