WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Рекомендуемые продукты со скидкой от Template Monster

Исполняемый 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 код в статью.

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

86 комментов
Полезные 5 Вопросы 4 Все
  • @ 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

    Ответить8 мес назад #
    • Kama7611

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

      Ответить8 мес назад #
  • @ Василий

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

    Ответить3 мес назад #
  • Иван

    почему то не работает с созданной группой полей через плагин acf.

    Ответить2 дня назад #
Здравствуйте, !     Войти . Зарегистрироваться