» » » Выполнение PHP-кода в виджетах WordPress без плагина
logotip

Выполнение PHP-кода в виджетах WordPress без плагина

Всем привет! Сегодня на seo-mayak.com я расскажу как избавиться от еще одного плагина, который многие используют для вставки кодов на PHP в виджет WordPress.

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

Я постарался проявить сдержанность и посоветовал горе-вебмастеру установить плагин PHP Code Widget.

Но потом я понял, что сам виноват. Ведь действительно, я ни словом не обмолвился от том, как вставлять PHP в виджет.

php kod v vidzhetakh

Наверное мне казалось, что все знают, как это делается, но я ошибся и сегодня хочу исправить сей недочет.

Многие веб-мастера, для выполнения PHP-кодов в виджетах WordPress, используют плагины. Один из-них я уже назвал выше, но стоит отметить еще один плагин, который называется Exec-PHP.

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

Итак, по умолчанию в WordPress виджеты не поддерживают PHP, правильно, ведь для этого есть файл sidebar.php, через который при желании можно реализовать вывод любой функции.

Но дело в том, что современные шаблоны, например сверстанные на основе kubrick, без специальных знаний не позволяют вставлять в sidebar.php вообще какие-либо коды. Поэтому для многих тем виджеты остаются единственным вариантом.

Использование плагинов конечно выход из положения, но как я уже много раз говорил, если есть возможность, то лучше обойтись без них. Поехали!

Вывод PHP-кода через виджеты WordPress без плагина

Давайте заставим WordPress выполнять PHP коды в виджетах. Сложного в этом ну вообще ничего нет.

Открываем для редактирования файл functions.php, ищем знак ?>, в некоторых темах ob_end_clean(); и перед ним вставляем следующий код:

function mayak_widget_php($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', 'mayak_widget_php', 99);

Теперь любой PHP-код будет выполняться в виджетах. Все просто! О плагинах не может быть и речи.

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

До встречи!

С уважением, Виталий Кириллов

Комментарии: 32

  1. Мария:

    Спасибо, Виталий! Скопировала вашу функцию, вставила в functions.php, проверила: все действительно работает, и как итог — удалила плагин Exec-PHP.

    Ответить
  2. Виктор:

    А как сделать выполнение php кода в статье и на страницах подобным методом без плагинов?

    Ответить
    • Виталий Кириллов:

      Пока проблема!

      Ответить
  3. Михаил:

    Спасибо огромное, наконец-то действительно полезное чтиво

    Ответить
  4. Татьяна:

    Виталий, здравствуйте!
    С интересом читаю статьи блога, очень нравится ваш стиль изложения такой сложной для новичков информации. Но применить у себя эти нужные рекомендации не могу… Дело в том, что на моем блоге файл functions.php не содержит ни знака ?>, ни ob_end_clean().
    Мне крайне важно вывести PHP-код в виджет. Может, подскажете, как это сделать. Спасибо.

    Ответить
    • Виталий Кириллов:

      Татьяна, в самом начале файла functions.php есть такой знак «<?php» можно вставить функцию сразу после него.

      Ответить
    • Дим:

      У меня тоже не так такого. Но я вставил в конце файла..и нормально. Надо было вам тоже так делать.

      Ответить
  5. Татьяна:

    Виталий, спасибо большое!
    Ваш метод мне отлично помог. Могу ли я уточнить некоторые сложные для меня вопросы через обратную связь?

    Ответить
    • Виталий Кириллов:

      Татьяна, если только их не будет много.

      Ответить
      • Татьяна:

        Спасибо! Пока только относительно виджета))

        Ответить
      • Татьяна:

        Виталий, несколько раз пыталась отправить вам сообщение, но почему-то не сработала форма обратной связи — какие-то проблемы с окном «Тема».
        Спасибо большое, что помогли мне разобраться с кодом PHP для виджета. Если вас не затруднит, подскажите, пожалуйста, как мне подкорректировать контуры этого виджета. Моя тема позволяет вставить виджет через модуль ТЕКСТ, который состоит из окна для названия и окна для самого содержания.
        Сейчас у меня размещено все это в сайдбаре криво: окно с содержанием немного смещено вправо и еще немного наползает на окно с названием. Лечится ли мой случай? Буду бесконечно признательна, если подскажете, как мне это поправить.

        Ответить
        • Виталий Кириллов:

          Татьяна, откройте файл style.css, что находится в папке с темой и найдите там строчку №1507. Там между фигурными скобками надо удалить строчку:

          float: left;
          

          и вставить:

          margin-left: -11px;
          
          Ответить
          • Татьяна:

            Виталий, выполнила все по вашей инструкции, но, увы, не помогли эти действия((

            Ответить
            • Татьяна:

              Виталий, как же я Вам благодарна! Спасибо за такую детальную инструкцию. Благодаря Вам, виджет на моем блоге теперь в порядке.

              Ответить
  6. Максим:

    Спасибо большое за простую реализацию размещения php-кода в виджетах! В прошлой теме все в шаблон внедрял, а в новой теме разработчики так намудрили, что простому смертному не разобрать 🙂 Поставил на сайт — все работает! Криво виджеты отображались, а сейчас все как нужно.

    Ответить
  7. Dmitriy Solodukha:

    Было полезно.
    Спасибо большое!

    Ответить
  8. tux:

    Подскажите пожалуйста, а как можно вставить php код в миню сайта?
    хочу чтобы в меню отображалось имя текущего залогиненного пользователя, или «гость», если человек не залогинен

    Ответить
    • Виталий Кириллов:

      Вы имеете в виду вставить php код в виджет?

      Ответить
      • tux:

        я имею ввиду вставить php-код, как один из пунктов миню.
        чтобы был вид: главная, пункт2, пункт3, о нас, контакты, добро пожаловать %name

        Ответить
        • Виталий Кириллов:

          Немного не пойму Вашу задумку. Зачем использовать php, если можно обычную ссылку прописать.

          Ответить
          • tux:

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

            если в названии пункта меню ввести просто «добро пожаловать %name» или любую другую переменную, она так текстом и отобразится

            Ответить
            • Виталий Кириллов:

              Согласен, спорол чушь, забыл тему предыдущего вопроса. Вот попробуйте код вывода имени пользователя:

              <?php 
              global $current_user;
              get_currentuserinfo();
              echo 'Username: ' . $current_user->user_login . "\n";
              ?>

              Прикрутить к меню не сложно, просто надо подставить код после функции меню и довести в нужное место с помощью стилей.

              Ответить
              • tux:

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

                именно по этому и возник вопрос про пункт меню, как таковой.

                Ответить
                • Виталий Кириллов:

                  Какой функцией у Вас меню выводится?

                  Ответить
                  • tux:

                    в среду буду на работе запощю кусок кода сюда.

                    спасибо за ваше внимание к моей проблеме -))

                    Ответить
                  • tux:

                    если я правильно понимаю, то код такой:

                    function storefront_primary_navigation() {
                    ?>
                    <nav id="site-navigation" class="main-navigation" role="navigation" aria-label="<?php esc_html_e( 'Primary Navigation', 'storefront' ); ?>">

                    <button class="menu-toggle" aria-controls="primary-navigation" aria-expanded="false"><?php echo esc_attr( apply_filters( 'storefront_menu_toggle_text', __( 'Navigation', 'storefront' ) ) ); ?></button>

                    <?php
                    wp_nav_menu(
                    array(
                    'theme_location' => 'primary',
                    'container_class' => 'primary-navigation',
                    )
                    );

                    wp_nav_menu(
                    array(
                    'theme_location' => 'handheld',
                    'container_class' => 'handheld-navigation',
                    )
                    );
                    ?>
                    </nav>

                    Ответить
                    • Виталий Кириллов:

                      К функции wp_nav_menu нет возможности прикрутить стороннею функцию. Я все же думаю, что можно с помощью css вывести строчку в нужное место, просто надо правильно прописать стили.

  9. tux:

    спасибо за потраченное на меня время…

    Ответить
  10. Виктор:

    Спасибо ! Очень помогли кода вставляешь шорткоды ! или какие то другие вещи ! Огромное спасибо !

    Ответить
  11. Александр:

    Спасибо за пример, очень помогло. Заработало сразу.

    Ответить
  12. Татьяна:

    Виталий, здравствуйте! У меня есть коды словарей РНР. Я бы хотела, чтобы в виджете эти словари были просто перечислены списком, и чтобы по клику открывались на отдельной странице. Пока что я их ставила по одному как запись, и выглядят они так: yaimoyotelo.ru/slovar-kosmeticheskikh-terminov/
    Один вообще весь сайдбар вниз сдвигает. Можно ли их все как-то в виджет засунуть? И куда нужно код вставить?
    Заранее спасибо.

    Ответить
    • Виталий Кириллов:

      Здравствуйте Татьяна!
      Сделать можно все, но сходу я Вам не подскажу.
      С каждым случаем надо разбираться индивидуально.
      Набирайтесь знаний и у Вас все получится.

      Ответить

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

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS