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

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

17 декабря 2013 378 11

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

Reg.ru: Регистрируем домены в любой зоне мира
Reg.ru: Регистрируем домены в любой зоне мира

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

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 — все тот же ваш уникальный тэг, на который среагирует фильтр.

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

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

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

Комментарии
  • Shura

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

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

  • Shura

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

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

  • Baga

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

    • Используйте в сайдбаре динамические блоки или подгружайте контент с помощью JS.

      • Baga

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

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

          • Baga

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

  • Валодя

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

  • Валодя

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

Разгоните свой WordPress

Хостинг-провайдер номер один в России — REG.RU

Подробнее