Як кешувати json за допомогою кешу wp-super


15

У новому проекті ми використовуємо wp-super-cache (бажаний плагін клієнта) для створення статичних HTML-файлів для спеціальних типів вмісту. Але ми намагаємось з’ясувати, чи правильно кешується все.

Це питання з 2 частини.

1) Створена нами тема використовує шаблони сторінок для виведення json, який приймається через дзвінки ajax. тобто. якщо ви потрапите на сторінку: theurl.com/sample - ви отримаєте чистий json. Незважаючи на те, що версія для кожної сторінки та публікації не містить JavaScript, Ajax визначає передню частину цієї теми. Ми видалили заголовок і нижній колонтитул у цих файлах, щоб він був чистим json, і ми намагаємося розібратися, як визначити, чи json кешується. Теоретично дані будуть кешовані, оскільки технічно це сторінка, яку обслуговує wordpress. Але, як ми можемо розібратися, якщо він кешований?

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

Здається, не дуже багато інформації про це в Інтернеті, тому, в дусі створення переконливих та оптимізованих сайтів Wordpress, допоможіть братові

Відповіді:


9

Здавалося, json не кешується wp-super-cache, але ми вирішили застосувати інший підхід. Використовуючи перехідні api , ми змогли зробити faux-кеш на всіх 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;

приємно, великі пальці вгору !!!
Діпеш KC

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 як 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.як це можна виправити?
Łukasz Florczak

Оскільки API REST у вас є окремим доменом, напевно, ваш головний сайт експортує Access-Control-Allow-Originзаголовок, щоб дозволити запит перехресного походження. Я здогадуюсь, що кешовані сторінки не виводять цей заголовок.
Ян Данн

0

Я також зустрів цю проблему. Я написав свій код, щоб бути API. Коли тип відповіді був XML, кеш спрацював. Але коли тип відповіді був json, він не працював.

Щоб виправити цю помилку, потрібно кілька годин.

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

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

Просто оновіть свій код, як і мої зміни.

Це працює для мене зараз.


5
Будь ласка, опублікуйте реальний код, а не зображення коду.
Пітер Гузен

1
Ви повинні використовувати wp_cache_eof_tagsфільтр, а не змінювати плагін безпосередньо.
Іван Данн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.