Как кешировать json с помощью wp-super cache

15

В новом проекте мы используем wp-super-cache (предпочтительный плагин клиента) для создания статических html-файлов для пользовательских типов контента. Но мы пытаемся выяснить, все ли кешируется правильно.

Это вопрос из двух частей.

1) Созданная нами тема использует шаблоны страниц для вывода json, который принимается через вызовы ajax. то есть. если вы нажмете на страницу: theurl.com/sample - вы получите чистый JSON. В то время как существует не-javascript версия каждой страницы и сообщения, Ajax управляет внешним видом этой темы. Мы удалили верхний и нижний колонтитулы в этих файлах, так что это чистый json, и мы пытаемся выяснить, как определить, кэшируется ли json. Теоретически данные будут кэшироваться, потому что технически это страница, обслуживаемая WordPress. Но как мы можем выяснить, кэшируется ли это?

2) Мы также используем плагин json api для обслуживания определенных почтовых данных. http://wordpress.org/extend/plugins/json-api/ Для этого примера, скажем, мы используем метод вывода плагина по умолчанию и попадаем на эту страницу: мой url.com/category/news?json=1 - делает Кто-нибудь знает, как мы можем проверить, если этот вывод кэшируется? Если он не кэшируется, каким методом это произойдет?

Похоже, в Интернете не так много информации об этом, поэтому в духе создания убедительных и оптимизированных сайтов WordPress помогите брату

Starfs
источник

Ответы:

9

Казалось, что json не кэшируется с помощью wp-super-cache, но мы решили использовать другой подход. Используя временные API , мы смогли создать поддельный кеш на всех json и значительно снизить нагрузку на базу данных. Затем на стороне AJAX мы кэшируем HTML, созданный из этого полукэшированного JSON. Все очень быстро! Вот уменьшенная версия кода и концепции.

    $transient_key = 'my-transient-key'; 
    $data = get_transient( $transient_key ); 

    if ( $data == '' ) { 
      $args = array(

    'post_type' => 'brand', 
    'posts_per_page' => 50

  );

  $postsArray = array();  
  // The Query
 query_posts( $args );

  // The Loop
  while ( have_posts() ) : the_post();

    $brand_id = get_the_ID();
    $slug = basename(get_permalink());
    $title = get_the_title();
    $description = get_the_content();

                $posts = array(

                   'brand_id' => $brand_id,
                   'machine_name' => $slug,
                              'postTitle' => $title,
                   'description' => $description,

                   );

    array_push($postsArray,$posts);


  endwhile;

   $data = json_encode($postsArray);


 set_transient( $transient_key, $data, 60 * 60 * 24 ); // one day
 }  // now all the brand information is cached as one table call.

echo $data;
Starfs
источник
хорошо, недурно !!!
Дипеш К.С.
6

WP Super Cache проверяет страницы вашего сайта WordPress на наличие некоторых HTML-тегов, прежде чем кэширует их.

Ваши страницы, скорее всего, не имеют </html>тега (общая проблема), в этом случае попробуйте добавить что-то вроде //</html>этого - это обходной путь, и WP Super Cache должен генерировать кэшированные версии ваших страниц.

Почему WP Super Cache делает это так? Видите, нет очевидного способа проверить, загружена ли страница только наполовину, чем проверить, все ли основные теги HTML существуют и правильно ли закрыты.

По словам Доннчи (разработчика WP Super Cache) : «Это остановит кэширование половины сгенерированных страниц».

это я
источник
Хотелось бы, чтобы у них была возможность кешировать json конкретно или другие типы данных. Так много вариантов и еще не тот, который нам нужен для этого проекта. Но это крутой обходной путь. Я попробую.
Starfs
3

ПРИМЕЧАНИЕ БЕЗОПАСНОСТИ: Это (и другие решения) не должно использоваться, если у вас нет способа переопределить Content-Type: text/htmlзаголовок, который WP Super Cache отправляет с соответствующим application/jsonзначением. Отправка JSON as text/htmlприведет к тому, что браузер отобразит его как HTML, который потенциально может быть вектором XSS.

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


Вот как я это сделал. Это похоже на подход Ляна, но не требует непосредственной модификации плагина и имеет более точный шаблон регулярных выражений.

Если вы используете v2 API REST, вы должны использовать REST_REQUESTвместо JSON_REQUEST.

Было бы хорошо подписаться на 22 и # 79 на случай, если что-то изменится в WP Super Cache.

/**
 * Tell WP Super Cache to cache API endpoints
 *
 * @param string $eof_pattern
 *
 * @return string
 */
function wcorg_json_cache_requests( $eof_pattern ) {
    global $wp_super_cache_comments;

    if ( defined( 'JSON_REQUEST' ) && JSON_REQUEST ) {
        // Accept a JSON-formatted string as an end-of-file marker, so that the page will be cached
        $json_object_pattern     = '^[{].*[}]$';
        $json_collection_pattern = '^[\[].*[\]]$';

        $eof_pattern = str_replace(
            '<\?xml',
            sprintf( '<\?xml|%s|%s', $json_object_pattern, $json_collection_pattern ),
            $eof_pattern
        );

        // Don't append HTML comments to the JSON output, because that would invalidate it
        $wp_super_cache_comments = false;
    }

    return $eof_pattern;
}
add_filter( 'wp_cache_eof_tags', 'wcorg_json_cache_requests' );
Йен Данн
источник
Здравствуй. Я использую фильтр wp_cache_eof_tags, но теперь (и только при включенном кешировании) появляется ошибка: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.как я могу это исправить?
Лукаш
Так как у вас есть REST API в отдельном домене, ваш основной сайт, вероятно, экспортирует Access-Control-Allow-Originзаголовок, чтобы разрешить перекрестный запрос. Я предполагаю, что кэшированные страницы не выводят этот заголовок.
Ян Данн
0

Я тоже столкнулся с этой проблемой. Я написал свой код для API. Когда типом ответа был XML, кеш работал. Но когда тип ответа был json, он не работал.

Мне понадобилось несколько часов, чтобы исправить эту ошибку.

Это работа для меня.

введите описание изображения здесь

Просто обновите свой код, как мои изменения.

Это работает для меня сейчас.

Лян Ронгзе
источник
5
Пожалуйста, отправьте реальный код, а не изображение кода.
Питер Гусен
1
Вы должны использовать wp_cache_eof_tagsфильтр, а не изменять плагин напрямую.
Ян Данн