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

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

17 декабря 2013 1 050 11

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

Начну с предыстории

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

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

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

Теперь ближе к делу.

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

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

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

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

Затем подключаемся к вашему сайту по FTP и в каталоге плагина 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 — все тот же ваш уникальный тег, на который среагирует фильтр.

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

Подписываемся на канал Danilin.biz в Telegram, все самое интересное теперь там.
Иван Данилин
Автор: Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе Вордпресс.

Комментарии
  1. Прочитал вашу статью, и появились вопросы. Буду благодарен если ответите.
    Допустим вместо сапы имеем 5 блоков яндекс директ.
    Каждый блок имеет свой код.
    Все эти пять скриптов должны записоваться в один файл dinamic-cache-test.php??? Нужно ли каждому из скриптов присваивать уникальный тэг, или достаточно одного?

    • Код Директа на JavaScript, его необязательно включать в динамический блок. Он будет нормально работать и на кешированных страницах.

  2. При посещении страницы обрабатывается директ, после этого при каждом следующем посещении на странице выводится тоже самое обьявление. Отключаю плагин, динамика работает нормально.
    Так что обьявления залетают в кэш.
    Пробывал этот плагин около 2 месяцев назад. Сейчас ищу решение.

    • Ваш вопрос меня поставил в тупик! 🙂 Я не могу понять где связь между JS и кешем. Ведь по сути JS-код исполняется на стороне клиента и остается неизменным как при динамической генерации страницы, так и при выводе из кеша. Может попробовать другой браузер или покопаться в настройках Директа?

  3. Подскажите, пожалуйста, как вывести сайдбар с виджетами, чтобы его содержимое не кешировалось.

      • У меня там виджет с динамической информацией. То есть обычными методами его никак не исключить из кеширования?

        • Для WP Super Cache «обычным методом» является способ описанный выше. «Галочками» вопрос не решить.

          • Я понимаю, что там нужен вывод через dynamic-cache-test.php, но как прописать туда сайдбар или вывод одного виджета я так нигде и не нашел.

  4. А как передать туда переменную? такие вещи как get_user_meta() например не рабтают

  5. Так всё же — как передать переменные или заставить некий php код не кешироваться, по инструкции в статье не получилось.

Добавить комментарий

Лучшие премиум-темы для Вордпресс