Wie man json mit wp-super cache zwischenspeichert

15

In einem neuen Projekt verwenden wir wp-super-cache (das bevorzugte Plugin des Clients), um die statischen HTML-Dateien für benutzerdefinierte Inhaltstypen zu erstellen. Aber wir versuchen herauszufinden, ob alles richtig zwischengespeichert wird.

Dies ist eine zweiteilige Frage.

1) Das von uns erstellte Thema verwendet Seitenvorlagen, um JSON auszugeben, das über Ajax-Aufrufe aufgenommen wird. dh Wenn Sie auf die Seite "theurl.com/sample" klicken, erhalten Sie reinen JSON. Während es für jede Seite und jeden Beitrag eine Nicht-Javascript-Version gibt, steuert Ajax das Front-End dieses Themas. Wir haben die Kopf- und Fußzeile in diesen Dateien entfernt, damit es sich um reinen Json handelt, und wir versuchen herauszufinden, wie festgestellt werden kann, ob der Json zwischengespeichert wird. Theoretisch würden die Daten zwischengespeichert, da es sich technisch gesehen um eine Seite handelt, die von WordPress bereitgestellt wird. Aber wie können wir herausfinden, ob es zwischengespeichert wird?

2) Wir verwenden das json api-Plugin, um auch bestimmte Post-Daten bereitzustellen. http://wordpress.org/extend/plugins/json-api/ In diesem Beispiel verwenden wir die Standardausgabemethode des Plugins und rufen diese Seite auf: my url.com/category/news?json=1 - Does weiß jemand, wie wir überprüfen können, ob diese Ausgabe zwischengespeichert wird? Wenn es nicht zwischengespeichert wird, mit welcher Methode würde dies geschehen?

Es scheint nicht viele Informationen zu diesem Thema zu geben. Helfen Sie also einem Bruder, um überzeugende und optimierte WordPress-Websites zu erstellen

Starfs
quelle

Antworten:

9

Es hat den Anschein, als würde der JSON nicht durch wp-super-cache zwischengespeichert, aber wir haben uns für einen anderen Ansatz entschieden. Durch die Verwendung der transienten API konnten wir einen Faux-Cache für alle JSON-Dateien erstellen und die Belastung der Datenbank drastisch reduzieren. Auf der ajax-Seite zwischenspeichern wir dann den HTML-Code, der aus diesem semi-gecachten Json erstellt wird. Die Dinge sind super schnell! Hier ist eine verkleinerte Version des Codes und des Konzepts.

    $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
quelle
schön, Daumen hoch !!!
Dipesh KC
6

WP Super Cache überprüft die Seiten Ihrer WordPress-Site auf HTML-Tags, bevor sie zwischengespeichert werden.

Ihre Seiten haben höchstwahrscheinlich kein </html>Tag (häufiges Problem). Versuchen Sie in diesem Fall, etwas hinzuzufügen. Dies //</html>ist eine Problemumgehung. WP Super Cache sollte dann zwischengespeicherte Versionen Ihrer Seiten generieren.

Warum macht es WP Super Cache so? Es gibt keine offensichtliche Möglichkeit, zu überprüfen, ob eine Seite nur zur Hälfte geladen ist, als zu überprüfen, ob alle grundlegenden HTML-Tags vorhanden und ordnungsgemäß geschlossen sind.

In Donnchas eigenen Worten (dem Entwickler von WP Super Cache) heißt es : "Es soll verhindern, dass die Hälfte der generierten Seiten zwischengespeichert wird."

da ich bin
quelle
Ich wünschte, sie hätten die Option, json-spezifisch oder andere Datentypen zu cachen. So viele Möglichkeiten und doch nicht die, die wir für dieses Projekt brauchten. Dies ist jedoch eine coole Problemumgehung. Ich werde es versuchen.
Starfs
3

SICHERHEITSHINWEIS: Diese (und die anderen Lösungen) sollten nur verwendet werden, wenn Sie eine Möglichkeit haben, den von Content-Type: text/htmlWP Super Cache gesendeten Header mit dem entsprechenden application/jsonWert zu überschreiben . Wenn Sie JSON as senden, text/htmlwird es vom Browser als HTML gerendert. Dies kann möglicherweise ein XSS-Vektor sein.

Es sieht so aus, als müsste dies auf Serverebene erfolgen, da WPSC nicht die erforderlichen Hooks bereitstellt.


So habe ich es gemacht. Es ähnelt dem Ansatz von Liang, erfordert jedoch keine direkte Änderung des Plugins und verfügt über ein präziseres Regex-Muster.

Wenn Sie Version 2 der REST-API verwenden, sollten Sie REST_REQUESTanstelle von verwenden JSON_REQUEST.

Es wäre gut, 22 und 79 zu abonnieren, falls sich etwas in WP Super Cache ändert.

/**
 * 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
quelle
Hallo. Ich verwende den Filter wp_cache_eof_tags, aber jetzt (und nur bei aktiviertem Caching) tritt ein Fehler auf: XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.Wie kann ich ihn beheben?
Łukasz Florczak
Da Sie die REST-API in einer separaten Domäne haben, exportiert Ihre Hauptwebsite wahrscheinlich einen Access-Control-Allow-OriginHeader, um die ursprungsübergreifende Anforderung zuzulassen. Ich vermute, dass die zwischengespeicherten Seiten diesen Header nicht ausgeben.
Ian Dunn
0

Ich bin auch diesem Problem begegnet. Ich hatte meinen Code als API geschrieben. Wenn der Antworttyp XML war, funktionierte der Cache. Aber als der Antworttyp json war, hat es nicht funktioniert.

Ich brauche einige Stunden, um diesen Fehler zu beheben.

Das ist Arbeit für mich.

Bildbeschreibung hier eingeben

Aktualisieren Sie einfach Ihren Code wie meine Änderungen.

Es funktioniert jetzt für mich.

Liang Rongze
quelle
5
Bitte posten Sie echten Code und kein Bild des Codes.
Pieter Goosen
1
Sie sollten den wp_cache_eof_tagsFilter verwenden, anstatt das Plugin direkt zu ändern.
Ian Dunn