Динамический блок в «WP Super Cache» версии 1.4 на примере кода Сапы

Сразу обращаю внимание на то, что ничего нового вы из этого поста не узнаете. Этот пост посвящен лентяям, которые по каким-то неизвестным мне причинам не хотят прочесть пару десятков строк, посвященных динамическому кешированию в документации к «WP Super Cache».

«WP Super Cache» — это плагин кеширования для Вордпресс, который позволяет существенно снизить нагрузки на сервер.

Я не буду вдаваться в подробности функционирования данного плагина. Образно говоря, плагин снижает количество динамических вычислений путем периодического пересохранения статических копий страниц сайта. Да, это очень удобно, и за счет этого плагина можно сэкономить немало средств на хостинге и его ресурсах. Я не берусь утверждать, что «WP Super Cache» лучший в своем роде, т.к. не проводил сравнительных тестов, но по-моему субъективному мнению «WP Super Cache» удобнее и проще в эксплуатации, нежели его немногочисленные аналоги.

🔥 Кстати, кто хочет получить скидку на хостинг, могут воспользоваться моим промокодом для Таймвеб.

Но не все так гладко как может показаться на первый взляд. Проблемы с использованием большинства плагинов кеширования начинаются в процессе их эксплуатации, когда владелец сайта начинает замечать, что некоторые блоки сайта обновляются очень редко, хотя по идее должны отображать актуальную информацию. Например, различные рейтинги, количество просмотров, какие-то баннеры, количество комментариев, да и сами комментарии не редко появляются на страницах сайта спустя несколько часов или даже суток. Очень часто виджеты Вордпресс с какой-то актуальной информацией начинают «опаздывать». В условиях современной интернет-конкуренции это просто недопустимо. Но как решить подобную задачу? Отключение кеширования упирается в финансы, связанные с ресурсами хостинга, увеличение периодичности сброса кеша вообще ставит под сомнение весь смысл кеширования, т.к частый сброс кеша может, наоборот, вызвать гораздо бОльшую нагрузку на сервер. Некоторые задачи можно решить с помощью JavaScript и Ajax, но, к сожалению, далеко не все. Вот тогда и приходит на помощь т.н. блочное кеширование, т.е методом включения в кешированную страницу необходимых нам динамических блоков. Я не знаю как это реализовано в «W3 Total Cache» и «WP Hyper Cache», т.к. не работаю с ними, а как это делается в «WP Super Cache» я сегодня расскажу.

До недавнего времени у плагина «WP Super Cache» существовали функции mfunc и mclude, с помощью которых можно было подключать к кешированным страницам динамические блоки. Еще в мае этого года, разработчик оповестил, что существующая реализация оставляет желать лучшего, в девелоперских версиях плагина уже реализован новый вывод через фильтры, а в версии 1.4 он и вовсе откажется от поддержки старых функций. В октябре, незадолго до релиза «WP Super Cache» 1.4, уже было подробное описание и примеры интеграции динамики. Но, к сожалению, далеко не все вебмастера следят за новостями веб-разработчиков. Во-избежании различных казусов, я все же рекомендую хоть иногда знакомиться с нововведениями перед обновлениями как плагинов, так и самой платформы Вордпресс.

Естественно, после обновления «WP Super Cache» до версии 1.4, у многих пользователей просто отвалился вывод динамических блоков либо стал работать некорректно. Как известно, многие владельцы сайтов на Вордпресс монетизируют их с помощью Сапы и других подобных ссылочных бирж. Понятное дело, доход многих веб-мастеров в связи с этим заметно просел и ко мне уже обратились несколько человек за помощью.

Как я уже говорил выше, ничего кардинально нового я вам не скажу, так как все уже придумано и без нас. Раз уж вы здесь, я предполагаю, что на вашем WordPress уже установлен «WP Super Cache» как минимум версии 1.4. Поэтому, я не буду рассказывать каким образом устанавливается и настраивается сей плагин, а перейдем сразу к настройке динамических блоков. И я сделаю это на примере кода Сапы.

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

WP Super Cache — Включение динамического кэширования

Затем подключаемся к вашему сайту по ФТП и в каталоге плагина «WP Super Cache» находим файл:
/wp-content/plugins/wp-super-cache/plugins/dynamic-cache-test.php

Все что нужно — это внимательно прочесть комментарии к коду и октябрьский пост разработчика. Информация более чем исчерпывающая. Если по каким-то причинам вам не удается это сделать, вы можете удалить весь код из этого файла и добавить мой:

<?php define( 'DYNAMIC_OUTPUT_BUFFER_TAG', 'SAPEBLOCK' ); function dynamic_output_buffer_test( &$cachedata = 0 ) { if ( defined( 'DYNAMIC_OB_TEXT' ) ) return str_replace( DYNAMIC_OUTPUT_BUFFER_TAG, DYNAMIC_OB_TEXT, $cachedata ); ob_start(); echo date( 'H:i:s' ); // Код вывода Сапы if (!defined('_SAPE_USER')){ define('_SAPE_USER', 'Ваш идентификатор в Sape'); } require_once($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php'); $o['charset'] = 'UTF-8'; $sape = new SAPE_client($o); unset($o); echo $sape->return_links();
$text = ob_get_contents();
ob_end_clean();
if ( $cachedata === 0 )
define( 'DYNAMIC_OB_TEXT', $text );
else
return str_replace( DYNAMIC_OUTPUT_BUFFER_TAG, $text, $cachedata );
}
add_cacheaction( 'wpsc_cachedata', 'dynamic_output_buffer_test' );
function dynamic_output_buffer_test_safety( $safety ) {
if ( defined( 'DYNAMIC_OB_TEXT' ) )
return 1;
else
return 0;
}
add_cacheaction( 'wpsc_cachedata_safety', 'dynamic_output_buffer_test_safety' );
?>

Обратите внимание на следующее:
SAPEBLOCK — ваш уникальный тег, на который будет реагировать фильтр и подставлять вместо него динамический код. В целях безопасности, рекомендую переименовать.
echo date( ‘H:i:s’ ) — выводит текущее время, чтобы вы могли удостовериться, что динамика действительно работает. Отображаемое время не должно быть статичным и, естественно, после каждого обновления страницы должно меняться. Если тест пройден — эту строчку можно удалить.
Вместо «Ваш идентификатор в Sape» нужно подставить непосредственно ваш идентификатор, который вы получили в Сапе. Он, как правило, имеет то же название, что и каталог в котором размещен код и ссылки Сапы в корне вашего сайта.

Дальше открываем каталог вашего активного шаблона и выбираем место где будем выводить блок ссылок. Все стандартно: если это сайдбар — sidebar.php, футер — footer.php и так далее. В нужном вам месте вставляем небольшой код. У меня он выглядит примерно так:

<?php if ( function_exists( 'dynamic_output_buffer_test' ) ) dynamic_output_buffer_test(); ?>SAPEBLOCK<?php … ?>

Где SAPEBLOCK — все тот же ваш уникальный тег, на который среагирует фильтр.

Вот собственно и все. Ничего нового, все стандартно.
Не забудьте после установки кода обязательно сбросить весь кеш.

Иван Данилин
Автор Иван Данилин

Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.

Подробнее
Комментарии
  1. Так всё же — как передать переменные или заставить некий php код не кешироваться, по инструкции в статье не получилось.
  2. Подскажите, пожалуйста, как вывести сайдбар с виджетами, чтобы его содержимое не кешировалось.
    • Используйте в сайдбаре динамические блоки или подгружайте контент с помощью JS.
      • У меня там виджет с динамической информацией. То есть обычными методами его никак не исключить из кеширования?
      • Для WP Super Cache «обычным методом» является способ описанный выше. «Галочками» вопрос не решить.
      • Я понимаю, что там нужен вывод через dynamic-cache-test.php, но как прописать туда сайдбар или вывод одного виджета я так нигде и не нашел.
  3. При посещении страницы обрабатывается директ, после этого при каждом следующем посещении на странице выводится тоже самое обьявление. Отключаю плагин, динамика работает нормально.
    Так что обьявления залетают в кэш.
    Пробывал этот плагин около 2 месяцев назад. Сейчас ищу решение.
    • Ваш вопрос меня поставил в тупик! 🙂 Я не могу понять где связь между JS и кешем. Ведь по сути JS-код исполняется на стороне клиента и остается неизменным как при динамической генерации страницы, так и при выводе из кеша. Может попробовать другой браузер или покопаться в настройках Директа?
  4. Прочитал вашу статью, и появились вопросы. Буду благодарен если ответите.
    Допустим вместо сапы имеем 5 блоков яндекс директ.
    Каждый блок имеет свой код.
    Все эти пять скриптов должны записоваться в один файл dinamic-cache-test.php??? Нужно ли каждому из скриптов присваивать уникальный тэг, или достаточно одного?
    • Код Директа на JavaScript, его необязательно включать в динамический блок. Он будет нормально работать и на кешированных страницах.
Добавить комментарий