it-swarm.com.de

Wie man json mit wp-super cache zwischenspeichert

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 Design 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 Sie feststellen können, 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 - 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

14
Starfs

Es hat den Anschein, als würde der Json nicht von wp-super-cache zwischengespeichert, aber wir haben uns für einen anderen Ansatz entschieden. Durch die Verwendung von transient 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;
9
Starfs

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

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

Warum macht WP Super Cache das so? Sehen Sie, 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 (Entwickler von WP Super Cache) eigenen Worten : "Es soll verhindern, dass die Hälfte der generierten Seiten zwischengespeichert wird."

6
its_me

SICHERHEITSHINWEIS: Diese (und die anderen Lösungen) sollten nur verwendet werden, wenn Sie die Möglichkeit haben, den von WP Super Cache gesendeten Content-Type: text/html-Header mit dem entsprechenden application/json-Wert zu überschreiben. Wenn Sie JSON als text/html senden, wird 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 API REST verwenden, sollten Sie REST_REQUEST anstelle von JSON_REQUEST verwenden.

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' );
3
Ian Dunn

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.

 enter image description here 

Aktualisieren Sie einfach Ihren Code wie meine Änderungen.

Es funktioniert jetzt für mich.

0
Liang Rongze