Ajax dauert 10x so lange wie es sollte / könnte

50

Ich habe gerade mein erstes ernstes Problem mit WordPress gelöst und für jemanden, der Ajax mag, ist dies ein großes Problem.

Ich habe eine Ajax-Anfrage, die 1,5 Sekunden dauert, während ich die Ajax-API verwende.

Wenn ich denselben genauen Code verwende und ihn mit einem benutzerdefinierten Skript (kein WordPress) ausführe, dauert die Ajax-Anforderung nur 150 Millisekunden. Das ist keine Übertreibung

Wenn Sie sich den ersten Kommentar von http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/ und das folgende Gespräch ansehen , werden Sie feststellen, dass diese Langsamkeit verursacht wird durch die Tatsache, dass auf Ihre Anfrage alle WP geladen wird ...

Ich hoffe, dass es eine Lösung gibt, die es ermöglicht, Ajax-Anfragen zu stellen, ohne WordPress vollständig zu laden.

Was sind Ihre Erfahrungen mit der Beschleunigung von Ajax-Anfragen mit WordPress?

Mike
quelle
3
Ich frage mich, ob beliebte Caching-Plugins diese Situation abdecken.
Raphael
@Raphael, ich habe auch darüber nachgedacht, aber keine Erwähnung davon gesehen. Das wäre großartig, wenn sie das tun
Mike

Antworten:

57

Ja, dies ist ein unangenehmes Problem, dass Sie zum Laden einer vollständigen WordPress-Umgebung viel Zeit aufwenden müssen.

Ich brauchte eine viel bessere Leistung (für eine sehr dynamische inkrementelle Suche) für die Arbeit, und ich ging damit um:

  1. Benutzerdefinierte Datei als Ajax-Handler.
  2. SHORTINIT-Konstante für begrenzte WP- Kernlast .
  3. Sehr selektiv geladene Teile des Kerns, nur die für die Aufgabe benötigten.

Dies bietet eine sehr begrenzte Umgebung, aber die Leistung ist viel besser und ein angemessener Grad an Kompatibilität mit WP (beginnend mit $wpdb) bleibt erhalten.

Hier ist der Start meiner Loader-Datei, die nicht besonders hübsch ist, aber für bestimmte Anforderungen geeignet ist:

<?php

ini_set('html_errors', 0);
define('SHORTINIT', true);

require '../../../../wp-load.php';
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/post.php' );
wp_plugin_directory_constants();

// stuff goes here
Rarst
quelle
1
Was meinst du mit SHORTINIT contant? Können Sie Beispiele nennen? Ich stelle mir vor, dass ich meine eigenen Handler mit unterschiedlichen WP-Auslastungsgraden einrichten muss, abhängig von der Anforderung, aber ich würde gerne einige Beispiele sehen, die Sie erstellt haben.
Mike
6
@Mike Es ist nicht allgemein bekannt, aber sehr einfach im Konzept - wenn die SHORTINITKonstante gesetzt ist, würde WP den größten Teil des Kerns nicht laden (keine APIs / Funktionen, keine Plugins, kein Theme). Ich werde einen Code hinzufügen, um zu antworten.
Rarst
1
Das sieht ok aus Ich mag nur nicht die Tatsache, dass wir erfordern '../../../../wp-load.php' verwenden müssen; das macht diese hübsche Gewohnheit. Ich mache mir auch Sorgen darüber, wie einfach es ist, die Ressourcen einzusammeln, die Sie "benötigen". Aus meiner Erfahrung ist WordPress nicht sehr modular.
Mike
@Mike richtig, aber selbst bei Problemen ist es viel besser als Endpoint, der überhaupt keine Ahnung von WP hat. Dies kann (und sollte) noch verbessert werden, aber es ist im Moment keine dringende Aufgabe für mich.
Rarst
Gibt es Methoden, um die Position der Datei wp-load.php in WordPress zu ermitteln? Könnte ich beispielsweise beim Laden des Plugins eine statische Datei schreiben, in der der Pfad als Variable festgelegt ist, und diese Datei dann in die eigenständige Ajax-Antwortdatei aufnehmen?
Hereswhatidid
0

Ich habe das gefunden und es hat meinen Ajax beschleunigt.

function my_deregister_heartbeat() {
    global $pagenow;

    if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
         wp_deregister_script('heartbeat');
         wp_register_script('heartbeat', false);
     }
}
add_action( 'admin_enqueue_scripts', 'my_deregister_heartbeat' );
Lisa Daugherty Thompson
quelle