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 Все
  • WishMaster www.sandreev.ru

    Отлично, это то, что я искал. Только один вопрос, а как сделать, чтобы при просмотре анонса статьи php код тоже выполнялся или вообще не выполнялся. А то сейчас он просто показывается как есть, что не безопасно.

    Ответить24.Сен.2010 18:41 #
    • Kama7751

      Вообще, вроде как автоматом должен вырезаться, конструкция шоткода ведь.

      Чтобы поправить, добавьте еще такой хак в functions.php

      add_filter( 'the_excerpt', create_function('$a', 'return preg_replace("!\[exec.*/exec\]!isU","",$a);') );

      Он будет вырезать коды для функции the_excerpt(), которая используется WordPress для вывода анонсов.

      Ответить24.Сен.2010 19:14 #
  • WishMaster www.sandreev.ru

    Спасибо, помогло. Теперь как надо!

    Ответить24.Сен.2010 23:45 #
    • WishMaster www.sandreev.ru

      Я погорячился, все так же выводит весь код вставленный в [exec] [/exec].

      Ответить25.Сен.2010 02:08 #
  • WishMaster www.sandreev.ru

    У меня в шаблоне это реализовано через the_content_rss, а не через the_excerpt(). Спасибо, разобрался.

    Ответить25.Сен.2010 02:10 #
  • Kostromi4 joborgame.ru

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

    Parse error: syntax error, unexpected '<' in путь/functions.php(740) : eval()'d code on line 1

    то есть ругается на эту строку

    eval('ob_start();'.$matches[1].'$inline_execute_output = ob_get_contents();ob_end_clean();');
    Ответить28.Дек.2010 23:05 #
  • Kostromi4 joborgame.ru

    "php код" - это код оформленный по всем правилам php.

    возможно дело в этом, покажи на примере пожалуйста smile

    Ответить28.Дек.2010 23:14 #
  • Kostromi4 joborgame.ru

    Собственно хочу вставить в некоторые места вывод твоей функции вывода просмотров, поэтому вывести надо вот этот код

    Просмотров: <?php echo get_post_meta ($post->ID,'views',true); ?>
    Ответить28.Дек.2010 23:22 #
    • Kama7751

      Ага, проблема в том что вставляемый код неправильный. nea Нужно так:

      echo 'Просмотров: ' . get_post_meta ($post->ID,'views',true);

      или

      ?> Просмотров: <?php echo get_post_meta ($post->ID,'views',true);

      Точно не уверен второй пример сработает или нет, но логика думаю понятна. wink

      Ответить29.Дек.2010 06:54 #
  • Kostromi4

    Ни то ни другое не выводят данные, хотя отрабатывают без ошибок

    Ответить29.Дек.2010 07:48 #
    • Kama7751

      Значит данных нет.
      Проверьте ключ произвольного поля, может он неправильно указан, это единственное что приходит на ум. unknw

      Ответить29.Дек.2010 07:55 #
      • Kostromi4

        Ну поле точно не пустое это, а ключи даже другие пробовал выводить, но все равно пусто.

        Ответить29.Дек.2010 08:16 #
      • Kama7751

        Аааа, ну да, все правильно smile $post то глобально нужно определить, внутри функции же вызывается:

        global $post;
        echo 'Просмотров: ' . get_post_meta ($post->ID,'views',true);
        Ответить29.Дек.2010 09:51 #
  • Kostromi4

    Спасибо wink

    Ответить29.Дек.2010 10:12 #
  • Виталий ratblog.ru

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

    А как это реализовать чайнику?

    Ответить9.Янв.2011 20:39 #
  • Ян gravura-art.ru

    Как заставить исполняться в рамках [exec]php код[/exec] процедуру include

    Ответить10.Мар.2011 21:45 #
    • Kama7751

      Как обычно в php это делается: [exec]include ('путь_к_файлу.php');[/exec]

      Ответить11.Мар.2011 01:03 #