wp-super cache로 json을 캐시하는 방법


15

새 프로젝트에서는 wp-super-cache (클라이언트가 선호하는 플러그인)를 사용하여 사용자 정의 컨텐츠 유형에 대한 정적 html 파일을 작성합니다. 그러나 우리는 모든 것이 올바르게 캐시되고 있는지 알아 내려고 노력하고 있습니다.

이것은 두 부분으로 된 질문입니다.

1) 우리가 만든 테마는 페이지 템플릿을 사용하여 ajax 호출을 통해 수집 된 json을 출력합니다. 즉. theurl.com/sample 페이지를 방문하면 순수한 json을 얻을 수 있습니다. 모든 페이지와 게시물에 자바 스크립트가 아닌 버전이 있지만 Ajax는이 테마의 프론트 엔드를 구동합니다. 이 파일에서 헤더와 바닥 글을 제거하여 순수 json이되도록하고 json이 캐시되는지 판별하는 방법을 알아 내려고합니다. 이론적으로 데이터는 기술적으로 워드 프레스가 제공하는 페이지이기 때문에 캐시됩니다. 그러나 캐시되고 있는지 어떻게 알 수 있습니까?

2) 우리는 특정 게시물 데이터를 제공하기 위해 json api 플러그인을 사용하고 있습니다. http://wordpress.org/extend/plugins/json-api/ 이 예제의 경우 플러그인의 기본 출력 방법을 사용하여이 페이지를 방문한다고 가정하겠습니다. my url.com/category/news?json=1-않습니다 누구나이 출력이 캐시되는지 확인하는 방법을 알고 있습니까? 캐시되지 않은 경우 어떤 방법으로이를 수행 할 수 있습니까?

온라인에 대한 정보가 많지 않은 것 같습니다. 따라서 강력하고 최적화 된 워드 프레스 사이트를 만들려면 형제를 도와주세요

답변:


9

json이 wp-super-cache에 의해 캐시되지 않은 것으로 보였지만 우리는 다른 접근법을 취하기로 결정했습니다. transient api 를 사용함으로써 모든 json에 대해 가짜 캐시를 수행하고 데이터베이스의 과세를 크게 줄일 수있었습니다. 그런 다음 아약스 측면 에서이 세미 캐시 된 json에서 생성 된 html을 캐싱합니다. 상황이 매우 빠릅니다! 다음은 코드 및 개념의 축소 버전입니다.

    $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;

좋아요 엄지 손가락 !!!
Dipesh KC

6

WP Super Cache는 일부 HTML 태그를 캐시하기 전에 WordPress 사이트의 페이지를 검사합니다.

귀하의 페이지에는 아마도 </html>태그 (일반적인 문제) 가 없을 것입니다.이 경우 //</html>해결 방법이며 WP Super Cache는 캐시 된 버전의 페이지를 생성해야합니다.

WP Super Cache가 왜 그렇게합니까? 모든 기본 HTML 태그가 존재하고 올바르게 닫혔는지 확인하는 것보다 페이지가 반만로드되었는지 확인하는 확실한 방법은 없습니다.

Donncha의 (WP 슈퍼 캐시의 개발자)에서 자신의 말로 , "그것은 절반 생성 된 페이지가 캐시되는 정지입니다."


json 또는 다른 데이터 유형을 구체적으로 캐시 할 수있는 옵션이 있었으면합니다. 이 프로젝트에 필요한 옵션은 많지만 아직 없습니다. 그러나 이것은 멋진 해결 방법입니다. 시도해 볼게요.
Starfs

3

보안 정보 :Content-Type: text/html WP Super Cache가 전송 하는 헤더를 적절한 application/json값 으로 재정의하는 방법이 없다면이 솔루션 (및 기타 솔루션)을 사용해서는 안됩니다 . JSON을 전송 text/html하면 브라우저가 HTML로 렌더링하여 XSS 벡터가 될 수 있습니다.

WPSC는 필요한 후크를 제공하지 않기 때문에 서버 계층에서 수행해야하는 것처럼 보입니다.


이것이 내가 한 방법입니다. Liang의 접근 방식과 비슷하지만 플러그인을 직접 수정하지 않아도되며보다 정확한 정규식 패턴이 있습니다.

REST API v2를 사용 REST_REQUEST하는 경우 대신 대신 사용해야 합니다 JSON_REQUEST.

WP Super Cache에서 변경 사항이있는 경우 22# 79 를 구독하는 것이 좋습니다 .

/**
 * 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

별도의 도메인에 REST API가 있으므로 기본 사이트는 Access-Control-Allow-Origin원본 간 요청을 허용하기 위해 헤더를 내보내고있을 것입니다 . 캐시 된 페이지가 해당 헤더를 출력하지 않는 것 같습니다.
Ian Dunn

0

나는이 문제도 만났다. API로 코드를 작성했습니다. 응답 유형이 XML 인 경우 캐시가 작동했습니다. 그러나 응답 유형이 json 일 때는 작동하지 않았습니다.

이 버그를 수정하려면 몇 시간이 걸립니다.

이것은 나를 위해 일한 것입니다.

여기에 이미지 설명을 입력하십시오

내 변경 사항처럼 코드를 업데이트하십시오.

그것은 지금 나를 위해 작동합니다.


5
코드 이미지가 아닌 실제 코드를 게시하십시오.
Pieter Goosen

1
wp_cache_eof_tags플러그인을 직접 수정하는 대신 필터를 사용해야합니다 .
Ian Dunn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.