Como armazenar em cache o json com o wp-super cache

15

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

Esta é uma pergunta em duas partes.

1) O tema que criamos utiliza modelos de página para gerar o json que é ingerido por meio de chamadas ajax. ie se você acessar a página: theurl.com/sample - você obterá o 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. Removemos o cabeçalho e o rodapé desses arquivos para que ele 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 exibida pelo wordpress. Mas, como podemos descobrir se ele está sendo armazenado em cache?

2) Estamos usando o plugin json api para fornecer também certos dados de postagem. http://wordpress.org/extend/plugins/json-api/ Neste exemplo, digamos que estamos utilizando o método padrão de saída do plugin e acessando esta página: meu url.com/category/news?json=1 - alguém sabe como podemos verificar se essa saída está sendo armazenada em cache? Se não estiver sendo armazenado em cache, que método faria isso acontecer?

Parece não haver muita informação sobre isso online, portanto, no espírito de criar sites wordpress atraentes e otimizados, ajude um irmão

Starfs
fonte

Respostas:

9

Parecia que o json não estava sendo armazenado em cache pelo wp-super-cache, mas decidimos adotar uma abordagem diferente. Usando a API transitória , conseguimos fazer um cache falso em todos os json e reduzir drasticamente a tributação do banco de dados. Então, no lado do ajax, estamos armazenando em cache o html criado a partir desse json semi-armazenado em cache. As coisas são super rápidas! Aqui está uma versão reduzida do código e do 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;
Starfs
fonte
bom, perfeito !!!
Dipesh KC
6

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

Suas páginas provavelmente não possuem </html>tag (problema comum); nesse caso, tente adicionar algo como //</html>- isso é 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 assim? Veja, não há uma maneira óbvia de verificar se uma página está apenas carregada pela metade, do que verificar se todas as tags HTML básicas existem e estão fechadas corretamente.

Nas próprias palavras de Donncha (desenvolvedor do WP Super Cache) : "É para impedir que as páginas geradas pela metade sejam armazenadas em cache".

wsou eu
fonte
Eu gostaria que eles tivessem a opção de armazenar em cache o json especificamente ou outros tipos de dados. Tantas opções e ainda não a que precisávamos para este projeto. Mas, essa é uma solução legal. Vou dar uma chance.
Starfs
3

NOTA DE SEGURANÇA: Esta (e as outras soluções) não devem ser usadas, a menos que você tenha como substituir o Content-Type: text/htmlcabeçalho que o WP Super Cache envia com o application/jsonvalor apropriado . Enviar JSON como text/htmlfará com que o navegador o renderize como HTML, que pode ser um vetor XSS.

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


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

Se você estiver usando a v2 da API REST, use em REST_REQUESTvez de JSON_REQUEST.

Seria bom assinar os itens 22 e 79 , caso algo mude no 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' );
Ian Dunn
fonte
Oi. Uso o filtro wp_cache_eof_tags, mas agora (e somente quando o cache está ativado) tenho um erro: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.Como posso corrigi-lo?
Florukasz Florczak 11/03
Como você possui a API REST em um domínio separado, seu site principal provavelmente está exportando um Access-Control-Allow-Origincabeçalho para permitir a solicitação de origem cruzada. Eu estou supondo que as páginas em cache não estão produzindo esse cabeçalho.
Ian Dunn
0

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

Levo algumas horas para corrigir esse bug.

Isso é trabalho para mim.

insira a descrição da imagem aqui

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

Trabalha para mim agora.

Liang Rongze
fonte
5
Poste código real e não uma imagem do código.
Pieter Goosen
1
Você deve usar o wp_cache_eof_tagsfiltro em vez de modificar o plugin diretamente.
Ian Dunn