Come memorizzare nella cache json con wp-super cache


15

In un nuovo progetto stiamo usando wp-super-cache (il plug-in preferito del client) per creare i file html statici per tipi di contenuto personalizzati. Ma stiamo cercando di capire se tutto viene memorizzato nella cache correttamente.

Questa è una domanda in 2 parti.

1) Il tema che abbiamo creato utilizza i modelli di pagina per generare json che viene ingerito tramite chiamate ajax. vale a dire. se colpisci la pagina: theurl.com/sample - otterrai puro json. Mentre esiste una versione non javascript di ogni pagina e post, Ajax guida il front-end di questo tema. Abbiamo rimosso l'intestazione e il piè di pagina in questi file in modo che sia json puro e stiamo cercando di capire come determinare se il json viene memorizzato nella cache. In teoria i dati verrebbero memorizzati nella cache perché tecnicamente è una pagina servita da wordpress. Ma come possiamo capire se viene memorizzato nella cache?

2) Stiamo utilizzando il plugin json api per fornire anche determinati dati di post. http://wordpress.org/extend/plugins/json-api/ Per questo esempio, supponiamo di utilizzare il metodo di output predefinito del plugin e di colpire questa pagina: my url.com/category/news?json=1 - Lo fa qualcuno sa come possiamo verificare se questo output viene memorizzato nella cache? Se non viene memorizzato nella cache, quale metodo farebbe accadere questo?

Sembra che non ci siano molte informazioni su questo online, quindi nello spirito di creare siti wordpress avvincenti e ottimizzati, aiuta un fratello

Risposte:


9

Sembrava che il json non venisse memorizzato nella cache da wp-super-cache, ma abbiamo deciso di adottare un approccio diverso. Usando l' API transitorio , siamo stati in grado di creare una cache falsa su tutti i json e ridurre drasticamente la tassazione del database. Quindi dal lato Ajax delle cose, stiamo memorizzando nella cache l'html che viene creato da questo json semi-cache. Le cose sono super veloci! Ecco una versione ridotta del codice e del concetto.

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

bello, pollice in alto !!!
Dipesh KC

6

WP Super Cache esamina le pagine del tuo sito WordPress per alcuni tag HTML prima di memorizzarle nella cache.

Molto probabilmente le tue pagine non hanno </html>tag (problema comune), in tal caso, prova ad aggiungere qualcosa del genere //</html>: è una soluzione alternativa e WP Super Cache dovrebbe quindi generare versioni cache delle tue pagine.

Perché WP Super Cache fa così? Vedi, non esiste un modo ovvio per verificare se una pagina è caricata solo a metà, piuttosto che verificare se tutti i tag HTML di base esistono e sono chiusi correttamente.

Con le parole di Donncha (sviluppatore di WP Super Cache) , "è per impedire la memorizzazione nella cache delle pagine generate per metà".


Vorrei che avessero la possibilità di memorizzare nella cache json specificamente o altri tipi di dati. Così tante opzioni e non quella di cui avevamo bisogno per questo progetto. Ma questa è una soluzione alternativa. Lo proverò.
Starfs,

3

NOTA DI SICUREZZA: questa (e le altre soluzioni) non dovrebbe essere utilizzata a meno che non si abbia un modo per ignorareContent-Type: text/html intestazione che WP Super Cache invia con il application/jsonvalore appropriato . L'invio di JSON come text/htmlfarà sì che il browser lo visualizzi come HTML, che potrebbe essere potenzialmente un vettore XSS.

Sembra che debba essere fatto a livello di server, poiché WPSC non fornisce gli hook necessari.


È così che l'ho fatto. È simile all'approccio di Liang, ma non richiede la modifica diretta del plugin e ha un modello regex più preciso.

Se stai usando la v2 dell'API REST, dovresti usare REST_REQUEST invece di JSON_REQUEST.

Sarebbe bene iscriversi a 22 e # 79 nel caso in cui qualcosa cambi in 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' );

Ciao. Uso il filtro wp_cache_eof_tags, ma ora (e solo quando la cache è abilitata) Ho un errore: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.come posso ripararlo?
Łukasz Florczak,

Poiché hai l'API REST su un dominio separato, probabilmente il tuo sito principale sta esportando Access-Control-Allow-Originun'intestazione per consentire la richiesta di origine incrociata. Immagino che le pagine memorizzate nella cache non stiano producendo quell'intestazione.
Ian Dunn,

0

Ho riscontrato anche questo problema. Avevo scritto del mio codice come API. Quando il tipo di risposta era XML, la cache funzionava. Ma quando il tipo di risposta era json, non funzionava.

Ho impiegato alcune ore per correggere questo errore.

Questo è lavoro per me.

inserisci qui la descrizione dell'immagine

Aggiorna il tuo codice come le mie modifiche.

Funziona per me adesso.


5
Si prega di pubblicare il codice reale e non un'immagine del codice.
Pieter Goosen il

1
Dovresti usare il wp_cache_eof_tagsfiltro invece di modificare direttamente il plugin.
Ian Dunn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.