web-dev-qa-db-fra.com

Comment mettre en cache json avec wp-super cache

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.

C'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 trouver un moyen de déterminer si le fichier json est mis 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. http://wordpress.org/extend/plugins/json-api/ Pour cet exemple, supposons que nous utilisons la méthode de sortie par défaut du plugin et que nous consultons cette page: mon url.com/category/news?json = 1 - Est-ce que quelqu'un sait comment on peut vérifier si cette sortie est mise en cache? Si ce n'est pas mis en cache, quelle méthode pourrait y arriver?

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

14
Starfs

Il semble que le fichier json n’ait pas été mis en cache par wp-super-cache, mais nous avons décidé d’adopter une approche différente. En utilisant transitient api , nous avons pu créer un faux cache sur tous les fichiers json et réduire considérablement l’imposition 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;
9
Starfs

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> - il s'agit d'une solution de contournement et 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 générées à moitié."

6
its_me

NOTE DE SÉCURITÉ: Ceci (et les autres solutions) ne devrait 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. En envoyant JSON en tant que text/html, le navigateur le rendra au format HTML, ce qui pourrait être un vecteur XSS.

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


Voici comment je l'ai fait. C'est semblable à l'approche de Liang, mais ne nécessite pas de modifier directement le plugin, et a 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 changerait 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' );
3
Ian Dunn

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 bug.

C'est un travail pour moi.

 enter image description here 

Il suffit de mettre à jour votre code comme mes modifications.

Ça marche pour moi maintenant.

0
Liang Rongze