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 Все
  • Маинблогер mainbloger.ru

    а как поставить в ваш редактор визуальный кнопку CODE ?

    или сделать как у вас код выводится в постах.

    Спасибо smile

    Ответить20.Авг.2012 13:14 #
  • Александр avglearnit.com

    Здравствуйте, Kama. Вставил предложенный вами код в до боли знакомый functions.php и попытался вывести в посте банальное

    [exec]
    <?php echo "Hello, world."; ?>
    [/exec]

    смотрю на страницу блога, а там пишет такое:

    Parse error: syntax error, unexpected '<' in /home/char/avglearnit.com/www/wp-content/themes/avg-learnit-theme-v6/functions.php(411) : eval()'d code on line 2

    В чем может быть проблема?

    Ответить31.Авг.2012 15:02 #
    • Александр avglearnit.com

      Сам разобрался, оказывается нужно просто вставлять код без конструкции: <?php ?>

      Ответить7.Сен.2012 17:10 #
      • иисус eguap.ru

        Та же ошибка. Без какой конструкции надо вставлять код?

        Ответить26.Май.2013 20:57 #
        • иисус eguap.ru

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

          Ответить26.Май.2013 21:17 #
  • Tesla

    Kama, спасибо Вам за блог ) Благодаря Вам за последний месяц узнал многое. smile

    1
    Ответить6.Мар.2013 21:08 #
  • BUTAMUHbI4 BUTAMUHbI4.ru

    "..Чтобы обезопасить себя от возможных пагубных последствий этого хака, можно сделать.." намного проще: не говорить юзерам, имеющим доступ к написанию статей на сайте, о том, что вы добавили подобный фильтр, и усложнить название шорткода. А это то, что сразу пришло в голову мне. smile

    А вообще, это очень полезная вещь! Спасибо.

    2
    Ответить11.Май.2013 17:20 #
  • Андрей kosmetik-kab.ru

    Добрый день! Вставляю код в файл functions.php моей темы, в конце, и сайт не отображается, точнее отображается белая страница. Что я делаю не так?

    Ответить24.Фев.2015 08:36 #
    • Kama7751

      Что-то не так вставляете... Это прочитайте.

      Ответить24.Фев.2015 13:37 #
    • Quazimorda www.vsmirnov.ru

      Именно, что в самый конец вставляете. Файл functions.php - обычный php-файл. Скорее всего вы код поставили уже после закрывающего "?>".

      Ответить5.Окт.2015 23:39 #
  • WPNoob wpnoob.ru

    А как сделать, чтобы и описание к рубрике понимало [exec]php код[/exec] ?

    Эммм...
    Просто добавить:

    add_filter('category_description', 'inline_php', 0);

    ?

    Ответить11.Янв.2016 07:38 #
  • @ Костя marvelbitvachempionov.ru

    я уже понял, что в коде надо писать без <?php и ?>, а что делать, если у меня код в котором есть закрывающиеся теги, чтобы вписать html-код? у меня код, который выводит список записей по определенному тегу:

    <?php
    $id=1; // ID заданной рубрики
    $n=-1; // количество выводимых записей
    $met=22; // название тега
    $recent = new WP_Query("cat=$id&showposts=$n&tag_id=$met&orderby=title&order=asc"); 
    
    while($recent->have_posts()) : $recent->the_post();
    ?>
    <div class="nmch2"><a href="<?php the_permalink() ?>"><?php if ( function_exists("has_post_thumbnail") && has_post_thumbnail() ) { the_post_thumbnail(array(117,117), array("class" => "thumbrand")); } ?><span><?php the_title(); ?></span></a></div><div class="cleared"></div>
    <?php endwhile; ?>
    Ответить19.Июн.2016 11:26 #
    • Павел

      как вариант напиши все это в фукцию и вывод сделай только одной этой функции...

      2
      Ответить20.Июн.2016 14:29 #
      • @ Костя marvelbitvachempionov.ru

        чтобы еще понимать как это туда пихнуть.
        ладно, но идею понял, спасибо smile

        Ответить20.Июн.2016 15:05 #
        • Kama7751

          Функцию сунь в тему или плагин, а в шоткоде сделай только вызов этой функции...

          1
          Ответить20.Июн.2016 15:30 #
      • @ Костя marvelbitvachempionov.ru

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

        function chempion($met = 22){
        $recent = new WP_Query("cat=1&showposts=-1&tag_id=$met&orderby=title&order=asc"); 
        while($recent->have_posts()) : $recent->the_post(); ?>
        <a href="<?php the_permalink() ?>"><?php the_post_thumbnail(array(20,20), array("class" => "thumbrand")); ?></a>
        <?php
        endwhile;
        }
        Ответить20.Июн.2016 15:37 #
        • @ Костя marvelbitvachempionov.ru

          все, я наигрался. сделал как хотел.
          спасибо большое за помощь smile

          Ответить20.Июн.2016 15:43 #
  • Дим pol3.kz

    Не пашет. Просто выводит [exec][/exec]

    1
    Ответить25.Июл.2016 14:51 #
    • Александр

      Все отлично работает, вставил код в functions.php в поле content пишешь к примеру [exec] echo $a; [/exec] пару дней назад использовал все норм!

      1
      Ответить26.Июл.2016 15:26 #
  • Анастасия

    Спасибо за функцию, очень полезная. Единственное, не поняла на практике, как обезопасить, но я не кодер.

    Если функцию написания статей для пользователей убрать, соответственно и код безопасности не нужен?

    Спасибо

    Ответить2.Авг.2016 13:15 #
    • Kama7751

      Да, верно, если только админ может публиковать, то обычно код безопасности не нужен. Только при этом нужно всегда это помнить... А то можно забыть и расширить функционал и привет дырень... crazy

      Ответить2.Авг.2016 20:18 #
  • Навруз

    Отлично, работает. Спасибо!

    Ответить5.Авг.2016 22:27 #