Comment mettre en cache JSON avec wp-super cache

13

Dans un nouveau projet, nous utilisons wp-super-cache (le plug-in préféré du client) pour créer les fichiers HTML statiques destinés aux types de contenu personnalisés. Mais nous essayons de déterminer si tout est correctement mis en cache.

Ceci est une question en 2 parties.

1) Le thème que nous avons créé utilise des modèles de page pour générer un json ingéré via des appels ajax. c'est à dire. Si vous cliquez sur la page: theurl.com/sample, vous obtiendrez du JSON pur. Bien qu'il existe une version non-javascript de chaque page et publication, Ajax pilote le frontal de ce thème. Nous avons supprimé l'en-tête et le pied de page de ces fichiers pour qu'il s'agisse d'un fichier json pur. Nous essayons de déterminer comment déterminer si le fichier json est en cours de mise en cache. En théorie, les données seraient mises en cache car il s'agit techniquement d'une page servie par wordpress. Mais comment pouvons-nous savoir s’il est mis en cache?

2) Nous utilisons également le plug-in json api pour diffuser certaines données de publication. enlace Pour cet exemple, supposons que nous utilisions la méthode de sortie par défaut du plug-in et que nous consultions cette page: mon url.com/category/news?json=1 - Quelqu'un sait-il comment nous pouvons vérifier si cette sortie est mise en cache? Si cela n’est pas mis en cache, quelle méthode permettrait d’arriver cela?

Il semble qu'il n'y ait pas beaucoup d'informations à propos de cette connexion en ligne, aussi, dans un esprit de création de sites wordpress convaincants et optimisés, aidez un frère à sortir

    
posée Starfs 26.04.2012 - 16:48

4 réponses

9

Il est apparu que le fichier json n’était pas mis en cache par wp-super-cache, mais nous avons décidé d’adopter une approche différente. En utilisant la api transitoire , nous avons pu créer un faux cache sur tous les json et réduire considérablement le poids de la base de données. Ensuite, du côté ajax des choses, nous mettons en cache le code HTML créé à partir de ce JSON semi-mis en cache. Les choses sont super rapides! Voici une version réduite du code et du concept.

    $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;
    
réponse donnée Starfs 09.05.2012 - 01:07
6

WP Super Cache examine les pages de votre site WordPress à la recherche de balises HTML avant de les mettre en cache.

Vos pages n'ont probablement pas de balise </html> (problème courant). Dans ce cas, essayez d'ajouter quelque chose comme //</html> . C'est une solution de contournement. WP Super Cache devrait ensuite générer des versions en cache de vos pages.

Pourquoi WP Super Cache le fait-il comme ça? Vous voyez, il n'y a pas de moyen évident de vérifier si une page est seulement à moitié chargée, mais de vérifier si toutes les balises HTML de base existent et sont fermées correctement.

Dans Donncha's (développeur de WP Super Cache) propres mots , "Il faut empêcher la mise en cache des pages à moitié générées."

    
réponse donnée its_me 08.05.2012 - 03:55
3

NOTE DE SÉCURITÉ: Ceci (et les autres solutions) ne doit pas être utilisé à moins que vous ne puissiez remplacer l'en-tête Content-Type: text/html que WP Super Cache envoie avec la valeur application/json appropriée. L'envoi de JSON en tant que text/html fera en sorte que le navigateur le rende au format HTML, ce qui pourrait être un vecteur XSS.

Il semble que cela doive être fait au niveau du serveur, car WPSC ne fournit pas les points d'ancrage nécessaires.

C'est comme ça que je l'ai fait. Son approche est similaire à celle de Liang, mais elle ne nécessite pas de modifier directement le plug-in et présente un motif de regex plus précis.

Si vous utilisez la v2 de l'API REST, vous devez utiliser REST_REQUEST au lieu de JSON_REQUEST .

Il serait bon de s'abonner à 22 et #79 au cas où quelque chose change dans 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' );
    
réponse donnée Ian Dunn 31.12.2015 - 00:23
0

J'ai rencontré ce problème aussi. J'avais écrit mon code pour être API. Lorsque le type de réponse était XML, le cache fonctionnait. Mais lorsque le type de réponse était json, cela ne fonctionnait pas.

Cela prend quelques heures à résoudre ce bogue.

Ceci est un travail pour moi.

Mettez simplement à jour votre code, comme mes modifications.

Cela fonctionne pour moi maintenant.

    
réponse donnée Liang Rongze 07.09.2015 - 05:05

Lire d'autres questions sur les étiquettes