WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Исполняемый php код в записях WordPress

Бывают ситуации, когда очень удобно использовать весь потенциал языка программирования PHP в тексте при написании статей. Речь идет о статьях для WordPress.

Все кто пробовал написать какой либо php код в посте, в надежде что он сработает, знают, что WordPress воспринимает такой код как простой текст. Однако иногда бывает удобно запустить, например, какой-нибудь цикл вывода прямо в тексте при написании статьи, ведь контент такой статьи будет обновляться динамически. Другим примером может служить возможность вызывать готовые функции в посте, в случае необходимости или, например, вставить какой-нибудь php файл в текст поста по средствам php функции require():

require 'my_script.php';

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

Итак, чтобы реализовать возможность вставлять исполняемые PHP скрипты в текст статьи / поста или статической страницы, нужно добавить в уже, наверное, до боли знакомый нам файл темы functions.php следующий код:

## Исполняемый PHP код в контенте записи WordPress.
## [exec]PHP_код[/exec]
##
## @version: 1.0
if( 'Исполняемый PHP код в контенте' ){

	add_filter( 'the_content', 'content_exec_php', 0 );

	function content_exec_php( $content ){
		return preg_replace_callback( '/\[exec( off)?\](.+?)\[\/exec\]/s', '_content_exec_php', $content );
	}

	function _content_exec_php( $matches ){

		if( ' off' === $matches[1] ){
			return "\n\n<".'pre>'. htmlspecialchars( $matches[2] ) .'</pre'.">\n\n";
		}
		else {
			eval( "ob_start(); {$matches[2]}; \$exec_php_out = ob_get_clean();" );
			return $exec_php_out;
		}

	}

}

После того, как код добавлен станет возможным использовать в статьях конструкцию такого вида:

[exec]php код[/exec]

Например:

[exec]
// Комментарий
global $wp_version;
echo "Текущая версия WP: $wp_version";
[/exec]

Чтобы отключить выполнение кода, можно использовать следующую конструкцию. Она выведет просто код, как если бы мы вставили php код как текст.

[exec off]php код[/exec]

Важно о защите

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

Чтобы обезопасить себя от возможных пагубных последствий этого хака, можно сделать следующую простую защиту (то что сразу пришло мне в голову): включать исполнение конструкции [exec]php код[/exec], только в том случае, если, например, у поста есть какое-либо произвольное поле или, скажем, пост написан в 00 минут. Естественно только вы будете знать эту хитрость при которой код будет исполняться и соответственно только вам будет доступна возможность вставить php код в статью.

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

87 комментов
Полезные 6 Вопросы 4 Все
  • pessimist www.begomotbed.ru

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

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

    P.S. Не знал, как отблагодарить - жахнул по яду, я им не пользуюсь так, что должны зачесть smile

    Ответить27.Авг.2016 18:15 #
  • Paradogz

    Не работает к сожалению. Пишет ошибку Parse error: syntax error, unexpected '<' in /home/gryphon/public_html/wp-content/themes/MinecraftTheme/functions.php(763) : eval()'d code on line 1

    Ответить28.Авг.2016 03:13 #
    • pessimist www.begomotbed.ru

      между шорткодами [exec][/exec] нельзя писать <?php и ?> Похоже Ваша проблема связана именно с этим.

      Попробуйте вставить между шорткодами в записи Вордпресс простую инструкцию:
      [exec]echo 'Тестовая надпись';[/exec]

      Если выполнение этой записи вызовет ошибку - значит Вы некорректно вставили код в файл functions.php Еще раз проверьте себя, важен каждый символ. Новые функции лучше вставлять на самом "верху" файла functions.php

      3
      Ответить28.Авг.2016 16:00 #
  • @ campusboy3542 www.youtube.com/c/wpplus

    Насчёт защиты: можно проверять, кто написал статью. Если админ, то можно выполнять smile

    Ответить5.Окт.2016 23:41 #
  • Игорь api.net.ua

    Спасибо за такую идею, а на счет защиты я реализовал вот так:

    function inline_php($content){
    	global $post;
    	if($post->ID==1 || $post->ID==2) {
    	$content = preg_replace_callback('/\[exec\]((.|\n)*?)\[\/exec\]/', 'exec_php', $content);
    	$content = preg_replace('/\[exec off\]((.|\n)*?)\[\/exec\]/', '$1', $content);
    	return $content;
    	}
    	else {return $content;}
    }

    Если страниц не так много, где используется PHP, то можно просто перебрать их ID.

    Ответить17.Окт.2016 18:18 #
  • MyDoom

    Работает, но почему-то автоматически заменяет знаки "больше" и "меньше " на символы, чтобы отображаться не как код

    Ответить2.Фев.2017 18:00 #
    • Kama7752

      Потому что так работает WordPress... Вообще я не рекомендую юзать такой подход. Но если уж юзать, то нужно все делать в HTML редкторе, при переключении в Виз редактор, код будет портиться...

      Один из способов решения - это отключить виз редактор если в контенте есть [/exec]. Можно придумать другие костыли...

      Ответить2.Фев.2017 19:08 #
      • MyDoom

        Спасибо за ответ

        Ответить3.Фев.2017 16:52 #
      • Дмитрий

        А подскажите как это сделать?

        Ответить13.Апр.2018 01:58 #
        • Мижган
          [exec]include("counter/file.txt");[/exec] - вот так должно работать. Скобочки ставить не надо.

          Ответить2.Янв.2019 11:24 #
  • @ Sergey

    Здравствуйте.
    Подскажите пожалуйста, можно ли эту функцию применить и к "Advanced Custom Fields" или что-то нужно дописать?
    В дефолтных постах работает, а вот через "acf_add_options_page" не хочет выводить.
    Заранее благодарен, за любой ответ.

    Ответить20.Сен.2018 00:56 #
    • @ campusboy3542 www.youtube.com/c/wpplus

      Здравствуйте. Что Вы хотите сделать? Задачу расскажите.

      Ответить20.Сен.2018 03:48 #
      • @ Sergey

        Здравствуйте. Спасибо за отклик.

        1. В Advanced Custom Fields по этому методу https://www.advancedcustomfields.com/resources/options-page/ создал поле "Редактор WordPress" для настройки футера http://take.ms/lFVrl
        2. Применил в "functions.php" выше описаный скрипт с данной статьи http://take.ms/vnnPx
        3. Но на сайте http://take.ms/fHSsr выводиться строкой
        Ответить20.Сен.2018 10:34 #
        • @ campusboy3542 www.youtube.com/c/wpplus

          Думаю, что надо сделать так:

          echo apply_filters( 'the_content', get_field( 'my-option-key', 'option' ) );

          Ключ опции my-option-key не забудьте поменять на свой.

          Ответить20.Сен.2018 11:59 #
          • @ Sergey

            Спасибо за помощь.
            С редактором не хочет, но на этом поле http://take.ms/OZ0Go хоть стало работать

            Ответить20.Сен.2018 13:34 #
            • @ campusboy3542 www.youtube.com/c/wpplus

              Потому что Визуальный редактор WP конвертирует некоторые символы. Чтобы такого не было, нужно работать с ним в режиме "Текст".

              Ответить20.Сен.2018 13:37 #
              • @ Sergey

                в режиме "Текст" и было)
                Для теста пробовал в двух режимах "Визуально" и "Текст", но результат отрицательный.
                Возможно "Редактор WordPress" обрабатывается дополнительными скриптами системы, в отличии от "Область текста", что и есть причиной с выводом

                Ответить20.Сен.2018 13:50 #
                • @ campusboy3542 www.youtube.com/c/wpplus

                  Возможно ACF обрабатывает контент этого поля в целях безопасности smile Так и не понимаю, зачем это делать в произвольном поле, почему бы сразу не редактировать код шаблона темы?

                  1
                  Ответить20.Сен.2018 13:52 #
                  • @ Sergey

                    Жизнь себе усложняю scratch_one-s_head
                    Хотел на будущее предусмотреть, чтоб была возможность php вставки с административной части. Большое Вам спасибо, за поддержку. good2

                    Ответить20.Сен.2018 14:11 #
                  • @ Иван

                    А как прописать, что бы в созданном текстовом поле acf на странице выводилось значение другого поля Acf например [exp] if($adress=get_field("adress", 116 )){echo $adress;} [/exp]. Сейчас выводиться этот код а не значение поля.

                    Ответить17.Фев.2020 18:10 #
  • Максим

    Подскажите, а как реализовать защиту о которой Вы написали в конце статьи (включать исполнение конструкции [exec]php код[/exec], только в том случае, если, например, у поста есть какое-либо произвольное поле или, скажем, пост написан в 00 минут)?
    Спасибо!

    1
    Ответить12.Дек.2018 18:35 #
  • Ambitus ambitus-dev.com

    Здравствуйте! Хочу задать глобальную переменную в редакторе поста между [exec] [/exec] и прочитать ее в functions.php. Ничего не получается. Возможно ли это? Спасибо!

    Ответить2.Янв.2019 14:55 #
    • Kama7752

      Вообще глобальную переменную задать можно, но тут проблема в том что functions.php подключается раньше чем выводится контент (срабатывает код в [exec] [/exec]. Поэтому это невозможно. Хотя все зависит от того как используются функции в коде, нужно соблюдать порядок.

      Ответить2.Янв.2019 15:41 #
  • @ Eliya

    Приветствую.
    В четвёртой строке функция работает некорректно. Или вообще не работает. Еле нашёл.
    Надо:

    eval('ob_start();'.$matches[1].';$inline_execute_output = ob_get_contents();ob_end_clean();');

    Иначе выдаёт такую ошибку:

    [Tue Jan 22 22:30:42.152733 2019] [:error] [pid 3675] [client 192.168.50.10:17212] PHP Parse error: syntax error, unexpected '$inline_execute_output' (T_VARIABLE), expecting ',' or ';' in /var/www/sites/wp-ru/www/wp-content/themes/test-theme/functions.php(522) : eval()'d code on line 1, referer: http://wp-ru/

    sad

    Ответить23.Янв.2019 00:34 #
    • Kama7752

      Это проблема в исполняемом коде вашем, а не в этом коде... ; в конце там забыл поставить... Немного подправил этот код, чтобы такой ошибки не было.

      Ответить30.Янв.2019 13:23 #
  • @ Василий

    Kama, привет! Помоги пожалуйста разобраться, как можно написать эту защиту, я просто не кодер, а и многие читающие на сайте, будет полезно. Спасибо большое! smile

    Ответить24.Июн.2019 10:49 #