Как правильно закешировать динамически обновляемый контент в WordPress?

Рейтинг: 0Ответов: 1Опубликовано: 21.03.2023

У меня сайт на WordPress с установленным плагином кеширования и включенным браузерным кэшем.

На главной странице есть блок <div id="wrapper"></div>, который должен динамически обновляться, поэтому я вывожу его посредством ajax, чтобы он не попал в браузерный кэш плагина.

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

Верно ли я понимаю, что, как только истечет срок кеширования в заголовках Expires, сможет отработать условие if ( false === ( $buffer = get_transient( 'json_data' ) ) ) {..} внутри функции get_data()?

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

PHP

add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
function my_scripts_method(){
  wp_localize_script( 'custom-js', 'myajax', array( 'url' => admin_url( 'admin-ajax.php' ) ) );
}

function get_data() {

  $saturday = strtotime("next saturday");

  header( 'Expires: ' . gmdate('D, d M Y H:i:s', $saturday) . ' GMT' );
  header( 'Cache-control: public' );

  if ( false === ( $buffer = get_transient( 'json_data' ) ) ) {
    set_transient( 'json_data', $buffer, $saturday); 
  }

  echo $buffer;
  wp_die();
}

if( wp_doing_ajax() ){
  add_action( 'wp_ajax_get_front_slider', 'get_front_slider' );
  add_action( 'wp_ajax_nopriv_get_front_slider', 'get_front_slider' );
}

js

(function($){   
    var data = { action: 'get_data' };

    $.post( myajax.url, data, function(response) {
        $('#wrapper').html(response);
    });
    
})(jQuery);

P.S. В объектном кэше json_data хранится запрос с API сервера, который тоже должен обновляться каждую неделю (раз в субботу)

Ответы

▲ 0Принят

При помощи @KAGG Design пришёл вот к такому решению

php

add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
function my_scripts_method(){
  wp_localize_script( 'custom-js', 'myajax', array( 'url' => admin_url( 'admin-ajax.php' ) ) );
}

function get_data() {
  $now = time();
  $saturday = strtotime("next saturday");
  $diff = $saturday - $now;

  header( 'Expires: ' . gmdate('D, d M Y H:i:s', $saturday) . ' GMT' );
  header( 'Cache-control: public' );

  if ( false === ( $buffer = get_transient( 'json_data' ) ) ) {

    $args = array(
       'post_type' => 'post',
       'post_status' => 'publish',
       'posts_per_page' => -1
    );
    $query = new WP_Query($args);
    foreach($query->posts as $post) {
       ob_start();
       ...
       $buffer .= ob_get_clean(); 
    }
    wp_reset_postdata();
    set_transient( 'json_data', $buffer, $diff); 
  }

  echo $buffer;
  wp_die();
}

if( wp_doing_ajax() ){
  add_action( 'wp_ajax_get_front_slider', 'get_front_slider' );
  add_action( 'wp_ajax_nopriv_get_front_slider', 'get_front_slider' );
}

js

(function($){   
    var data = { action: 'get_data' };

    $.post( myajax.url, data, function(response) {
        $('#wrapper').html(response);
    });
    
})(jQuery);