исключить шорткод из кеша - Wordpress - PullRequest
0 голосов
/ 28 января 2019

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

Мой код находится в footer.php и создается div со всей необходимой мне информацией, затемс помощью сценария litte js я использую его содержимое на своей домашней странице.

Есть способ исключить только эту функцию / шорткод из кэша?

Это мой код в functions.php

global $news;
$today = date('d-m-Y');

$args = array (
    'posts_per_page' => 100,
    'post_type' => 'news'
);

$query = new WP_Query($args);

$ids = array();
$dates = array();

if($query->have_posts()){
    while ($query->have_posts()) : $query->the_post();
        array_push($dates,get_field('end_date'));
        array_push($ids,get_the_ID());
    endwhile;
}
function getClosestEventID($date, array $dates, $last, $ids) {
    $interval               = array();
    $now                    = strtotime(date('Y-m-d'));

    foreach ($dates as $d) {
        // strtotime often has problems with d/m/y so we use d-m-y
        $d = str_replace("/", "-", $d);
        $dateTime           = strtotime($date);
        $toTime             = strtotime($d);
        if (strtotime($d) < $now) { continue 1; }
        if ($toTime < $dateTime) { continue 1; }
        $interval[$d]       = abs($dateTime - $toTime);
    }

    if (!count($interval)) {
        return $last;
    }

    asort($interval);
    $closest                = key($interval);

    $id_key = array_search(str_replace("-", "/", $closest), $dates);
    return $ids[$id_key];
}

$nearestEventID = getClosestEventID($today, $dates, end($ids), $ids);

echo  '<div class="last-event" style="display: none;">'
    . '<span class="event-title">' . get_the_title($nearestEventID) . '</span>'
    . '<span class="event-content">' . get_the_content($nearestEventID) . '</span>'
    . '<span class="event-place">' . get_field('ort', $nearestEventID) . '</span>'
    . '<span class="event-start-date">' . get_field('start_date', $nearestEventID) . '</span>'
    . '<span class="event-end-date">' . get_field('end_date', $nearestEventID) . '</span>'
    . '<span class="event-discipline">' . get_field('discipline', $nearestEventID) . '</span>'
    . '</div>';
?>

1 Ответ

0 голосов
/ 29 января 2019

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

$( document ).ready(function() {
    loadNews();
});

function loadNews() {
    $.ajax({
        url: ajaxurl, // or example_ajax_obj.ajaxurl if using on frontend
        data: {
            'action': 'load_news',
        },
        success:function(data) {
            // output the response into the newsblock
            $("#newsblock").html(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });  
}

ваша функция ajax может содержать копирование / вставкувашего текущего кода для вывода новостей.Вы даже можете использовать интервал для обновления блока каждую минуту или около того, пока пользователь находится на странице: setInterval

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...