Используем PHP-сессии в Wordpress

ob_start - включает буферизацию вывода.

Описание

void ob_start ()

Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой вывод скрипта не высылается (кроме шапок/headers); вывод сохраняется во внутреннем буфере.

Содержимое этого внутреннего буфера может быть скопировано в строковую переменную с использованием ob_get_contents() . Для вывода содержимого этого внутреннего буфера используйте ob_end_flush() . Альтернативно ob_end_clean() втихую отбрасывает содержимое буфера.

Может быть специфицирована необязательная функция output_callback . Эта функция принимает строку как параметр и должна возвращать строку. Функция будет вызвана при вызове ob_end_flush() , или если буфер выводится в браузер в конце запроса. Когда вызывается output_callback , она примет содержимое буфера вывода как параметр и по идее должна возвратить новый буфер вывода как результат, который будет направлен в браузер.

It"s like comparing oranges to oranges.

Сегодня я хочу рассказать, как использовать сессии PHP в WordPress . В стандартном PHP-приложении сессия начинается после вызова функции session_start , запущенной в начале PHP-скрипта . Вам нужно открыть файл header.php используемой темы и добавить туда следующий код:

....

Но этот метод сложно назвать самым эффективным. WordPress предлагает API Actions , к которому можно привязывать собственные функции. В приведенном далее примере используется как раз этот метод. Добавьте следующий код в самое начало файла functions.php .

  1. Мы воспользуемся событием init , с помощью которого можно запустить PHP-сессию . При первой инициализации WordPress мы добавляем действие, которое вызывает функцию:

add_action("init", "start_session", 1);

  1. Далее создаем функцию start_session . Обратите внимание, что функция сначала проверяет, активна ли сессия, и только потом запускает новую сессию при помощи функции session_id :

function start_session() { if(!session_id()) { session_start(); } }

Закрываем PHP-сессию

Функция session_destroy позволяет очистить сессию PHP . Но когда именно вызывать эту функцию? Многое зависит от самого приложения. WordPress также предлагает несколько способов реализовать это при помощи API Actions .

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

add_action(‘wp_logout’, ‘end_session’); add_action(‘wp_login’, ‘end_session’);

  1. Далее создаем функцию end_session :

function end_session() { session_destroy (); }

Принудительное закрытие сессии

Можно использовать собственный хук, чтобы с помощью PHP закрыть сессию в любом фрагменте шаблона. Мы воспользуемся do_action для вызова функции end_session , которую мы создали выше.

  1. В файл functions.php нужно добавить следующий код:

add_action("end_session_action", "end_session");

Если вы все сделали правильно, то самый верх вашего файла functions.php будет выглядеть следующим образом:

add_action("init", "start_session", 1); function start_session() { if(!session_id()) { session_start(); } add_action(‘wp_logout’, ‘end_session’); add_action(‘wp_login’, ‘end_session’); add_action(‘end_session_action’, ‘end_session’); function end_session() { session_destroy (); }

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

$foo = ‘Foo Data’; $_SESSION[‘foo’] = $foo;

Что нужно учесть:

Если вы занимаетесь разработкой масштабируемого сайта, то возможно вам и не придется использовать эти сессии. HTTP – это протокол без запоминания состояний, сессии PHP основываются на состояниях. Сессии хранятся на сервере и обрабатываются им же. Маршрутизация каждой сессии до нужного сервера требует более сложной конфигурации, и создает проблемы для пользователей, чьи сессии хранятся на этом сервере.

По возможности, информацию о сессиях лучше хранить в браузере. Это позволит сэкономить ресурсы сервера, а также избавиться от ненужного функционала.

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

Перевод статьи “Using PHP Sessions in WordPress ” был подготовлен дружной командой проекта .

Привет, Хабр!

Сегодня я бы хотел познакомить начинающих вебмастеров с разнообразными изящными способами использования буферизации вывода в php. Опытные вебмастера для себя здесь врят ли найдут что-то полезное. Хотя - кто знает?

Как вы все знаете, буферизацией вывода в php управляет набор функций, начинающихся на «ob_». Самая главная из них - ob_start. При запуске она собирает последующий вывод, то есть всевозможные print(), echo и прочее, что потом отдастся посетителю в форме html-странички. И если перед тем, как выводить, мы запустили буферизацию, то с этой, почти готовой уже, страничкой, можно будет напоследок что-нибудь сотворить.


Например, мы хотим отфильтровать все ссылки на посторонние сайты.

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

"http://blackjack-hookers.com" => "http://myoldforum.ru/redirect.php?url=blackjack-hookers.com"

Способ может быть и не самый эффективный, но действенный. Мы написали redirect.php с фильтром и черным листом, и теперь нам надо преобразовывать все ссылки на тысячах страниц форума. С помощью ob_start и парочки регулярных выражений мы сделаем это всего в несколько строк:

Function f_callback($buffer){ $buffer = preg_replace("#http://(www.)?myoldforum\.ru/#","/",$buffer); $buffer = preg_replace("#href="http://([^"]*)"#","#href="/redirect\.php\?url=$1",$buffer); return $buffer; } ob_start(f_callback);

Теперь, подключив этот код в начале index.php, или другого файла, к которому обращается сервер при просмотре страниц, мы получим то, что нам нужно.

Меняя контент таким образом, мы не ограничены рамками методов движка. Это бывает весьма ценно. Можно, например, добавить плагин:

Function generate_plugin(){ /*что-то генерируем*/ } function f_callback($buffer){ /*...*/ $buffer = str_replace ("",generate_plugin(),$buffer); /*...*/ return $buffer; } ob_start("f_callback");

Теперь, там, где мы добавили в контент появится то, что мы хотели получить. Одно из применений - вставка виджета js на страницу сайта. Например, яндекс-карты. Обычно это не составляет никакого труда, но иногда криво написанный редактор страниц сайта экранирует кавычки и фигурные скобки, ломая виджет. Как видим, эта проблема легко решается.

Набор инструментов php для работы с буффером вывода богат, и не ограничивается одним лишь ob_start. Вышеописанные приемы в некоторых случаях излишне ресурсоемки и громоздки, поскольку оперируют со всей страницей. Мы можем обработать только ее часть, создав в шаблоне оболочку вокруг генерации чего-то, в дебри чего нам не хочется лезть, но что обязательно нужно поправить:

{GENERATE BIG CRAZY THING}

Должно быть, вы уже заметили все эти обороты: «не хочется лезть», «древний, как стул тиранозавра», «криво написанный редактор»… В идеальном мире оболочки вокруг буфера вывода не нужны. Все что можно сделать с помощью ob_start, теоретически можно было бы сделать и без него. Этот прием иной раз вносит путанницу в код проекта, многие видят его смысл лишь в том, что бы отдать вывод в ob_gzhandler для сжатия, и считают его применение в иных случаях опасным. Но часто без управления выводом просто не обойтись.

Особенно если не хочется копать вглубь.

On my recent project which uses Joomla v1.5, my client asks for banner management with ability to manage banner based on number of impression or date (period of time). Quick search on Joomla extension repositories show that there are many banner management component and module for Joomla 1.0 but not Joomla 1.5. Most of them which run on 1.5 are module to add animation or customize the display of your banner. At the time I write this blog, I found one component which does this, but it’s fairly plain and does not allow me to limit the banner based on number of impression made, categorize my banners, and keep track of clients.

Fortunately, the default Joomla 1.5 comes with com_banners and mod_banners core component and it has everything I need except start and end date setting to publish banner/ads. So let’s modify this core component to add this feature.

There are two files that you need to edit. First, open up \administrator\components\com_banners\views\banner.php with your favourite editor. Then insert the following codes on line 347 (between and ).

347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
publish_up ) , "publish_up" , "publish_up" , "%Y-%m-%d" , array ("class" => "inputbox" , "size" => "25" , "maxlength" => "19" ) ) ; ?>
publish_down ) , "publish_down" , "publish_down" , "%Y-%m-%d" , array ("class" => "inputbox" , "size" => "25" , "maxlength" => "19" ) ) ; ?>

publish_up) , "publish_up", "publish_up", "%Y-%m-%d", array("class"=>"inputbox", "size"=>"25", "maxlength"=>"19")); ?> publish_down) , "publish_down", "publish_down", "%Y-%m-%d", array("class"=>"inputbox", "size"=>"25", "maxlength"=>"19")); ?>

Secondly, locate and edit \components\com_banners\models\banner.php .
Try to find this line $wheres = ‘(imptotal = 0 OR impmade < imptotal)’; . On my file it’s located on line number 41, and below that add the following code:

42 43 44 45 // BEGIN EDIT - Enable Start and End Date of Banner $wheres = "(publish_up = "0000-00-00 00:00:00" OR publish_up <= CURDATE())" ; $wheres = "(publish_down = "0000-00-00 00:00:00" OR publish_down >= CURDATE())" ; // END EDIT - Enable Start and End Date of Banner

// BEGIN EDIT - Enable Start and End Date of Banner $wheres = "(publish_up = "0000-00-00 00:00:00" OR publish_up <= CURDATE())"; $wheres = "(publish_down = "0000-00-00 00:00:00" OR publish_down >= CURDATE())"; // END EDIT - Enable Start and End Date of Banner

It’s done. Now you will have start and end date field when you create new or edit your banners. The mod_banners will only display ads/banners which sit after the start date (if set) and before the end date (if set). You can leave start and end date field empty to ignore them. Please leave comments if you are satisfied or face any problem. Cheers.