Como fazer cache do json com o cache wp-super

13

Em um novo projeto, estamos usando o wp-super-cache (o plug-in preferido do cliente) para criar os arquivos estáticos de html para tipos de conteúdo personalizados. Mas estamos tentando descobrir se tudo está sendo armazenado corretamente.

Esta é uma pergunta de 2 partes.

1) O tema que criamos utiliza modelos de página para gerar o json que é ingerido através de chamadas ajax. ie. se você clicar na página: theurl.com/sample - você receberá json puro. Embora exista uma versão não-javascript de todas as páginas e postagens, o Ajax direciona o front-end desse tema. Nós removemos o cabeçalho e rodapé nesses arquivos para que seja puro json, e estamos tentando descobrir como determinar se o json está sendo armazenado em cache. Em teoria, os dados seriam armazenados em cache, porque é tecnicamente uma página servida pelo wordpress. Mas, como podemos descobrir se está sendo armazenado em cache?

2) Estamos usando o plugin json api para servir certos dados de postagem também. enlace Para este exemplo, digamos que estamos utilizando o método padrão de saída do plugin e acessando esta página: my url.com/category/news?json=1 - Alguém sabe como podemos verificar se esta saída está sendo armazenada em cache? Se não estiver sendo armazenado em cache, qual método faria isso acontecer?

Parece não haver muita informação sobre isso on-line, portanto, no espírito de criar sites wordpress convincentes e otimizados, ajude um irmão a sair

    
por Starfs 26.04.2012 / 16:48

4 respostas

9

Parecia que o json não estava sendo armazenado em cache pelo wp-super-cache, mas decidimos adotar uma abordagem diferente. Ao usar a API transitiva , conseguimos fazer um cache falso em todos os json e reduzir drasticamente a sobrecarga do banco de dados. Então, no lado do ajax, estamos armazenando em cache o html que é criado a partir desse json semi-armazenado em cache. As coisas estão super velozes! Aqui está uma versão reduzida do código e conceito.

    $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;
    
por Starfs 09.05.2012 / 01:07
6

O WP Super Cache examina as páginas do seu site WordPress para algumas tags HTML antes de armazená-las em cache.

As suas páginas provavelmente não têm </html> tag (problema comum), nesse caso, tente adicionar algo como //</html> - que é uma solução alternativa, e o WP Super Cache deve gerar versões em cache de suas páginas.

Por que o WP Super Cache faz isso? Veja, não há nenhuma maneira óbvia de verificar se uma página é apenas parcialmente carregada, do que verificar se todas as tags HTML básicas existem e estão fechadas corretamente.

Em Donncha (desenvolvedor do WP Super Cache) próprias palavras , "É para impedir que metade das páginas geradas sejam armazenadas em cache".

    
por its_me 08.05.2012 / 03:55
3

OBSERVAÇÃO DE SEGURANÇA: Esta (e as outras soluções) não devem ser usadas, a menos que você tenha uma maneira de substituir o cabeçalho Content-Type: text/html que o WP Super Cache envia com o valor application/json apropriado. O envio de JSON como text/html fará com que o navegador o renderize como HTML, o que poderia ser um vetor XSS.

Parece que isso precisa ser feito na camada do servidor, já que o WPSC não fornece os ganchos necessários.

Foi assim que eu fiz. É semelhante à abordagem de Liang, mas não requer a modificação direta do plug-in e tem um padrão de regex mais preciso.

Se você estiver usando v2 da API REST, use REST_REQUEST em vez de JSON_REQUEST .

Seria bom se inscrever no 22 e #79 caso algo mude no Super Cache do WP.

/**
 * 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' );
    
por Ian Dunn 31.12.2015 / 00:23
0

Eu também encontrei esse problema. Eu escrevi meu código para ser API. Quando o tipo de resposta era XML, o cache funcionava. Mas quando o tipo de resposta era json, não funcionou.

Demoro algumas horas para consertar esse bug.

Isso é trabalho para mim.

Atualize seu código como minhas alterações.

Funciona para mim agora.

    
por Liang Rongze 07.09.2015 / 05:05