Ajax prend 10 fois aussi longtemps qu'il devrait / pourrait


50

Je viens de frapper mon premier problème sérieux avec WordPress et pour quelqu'un qui aime Ajax, c'est une biggy.

J'ai une demande Ajax qui prend 1,5 seconde à se terminer tout en utilisant l'API Ajax.

Si je prends le même code exact et l'exécute avec un script personnalisé (pas de WordPress), la demande Ajax ne prend que 150 millisecondes. Ce n'est pas une exagération

Si vous regardez le tout premier commentaire de http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/ et que la conversation qui suit vous permettra de constater que cette lenteur est causée par le fait que sur votre demande, tout WP est chargé ...

J'espère qu'il existe une solution permettant de faire des requêtes Ajax sans charger tout WordPress.

Quelles sont vos expériences avec l’accélération des requêtes Ajax avec WordPress?


3
Je me demande si les plugins de cache populaires couvrent cette situation.
Raphael

@Raphael, j'y ai pensé aussi, mais je n'en ai pas vu mention. Ce serait super s'ils le faisaient
Mike

Réponses:


57

Eh oui, c’est un problème désagréable: pour avoir un environnement WordPress complet, vous devez passer un temps considérable à le charger.

J'ai eu besoin de beaucoup plus de performances (pour une fonction de recherche incrémentielle très dynamique) pour le travail et je suis allé avec:

  1. Fichier personnalisé en tant que gestionnaire Ajax.
  2. Constante SHORTINIT pour charge de base WP limitée.
  3. Parties du noyau très sélectivement chargées, uniquement celles nécessaires à la tâche.

Cela fournit un environnement très limité, mais les performances sont bien meilleures et un degré raisonnable de compatibilité avec WP (à partir de $wpdb) est conservé.

Voici mon fichier de chargement, pas joli mais qui répond à des besoins spécifiques:

<?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

1
Que voulez-vous dire par SHORTINIT contant? Pouvez-vous donner des exemples? J'imagine que je devrai configurer mes propres gestionnaires avec différents niveaux de WP chargés en fonction du besoin de la demande, mais j'aimerais voir quelques exemples que vous avez créés.
Mike

6
@Mike n'est pas très connu mais son concept est simple: si SHORTINITconstant est défini, WP ne chargera pas la plupart des fonctions de base (pas la plupart des API / fonctions, pas de plugins, pas de thème). Je vais ajouter du code pour répondre.
Rarst

1
Ça a l'air bien. Je n'aime tout simplement pas le fait que nous devons utiliser require '../../../../wp-load.php'; cela fait cette jolie coutume. Je m'inquiète également de la facilité avec laquelle vous obtiendrez les ressources dont vous avez "besoin". B / c, de mon expérience, WordPress n'est pas très modulaire.
Mike

@ Mike est correct, mais même avec des problèmes, c'est beaucoup mieux que le point final qui n'a aucune idée de WP. Cela peut (et devrait) être encore amélioré mais ce n’est pas une tâche urgente pour moi pour le moment.
Rarst

Existe-t-il des méthodes pour détecter l'emplacement du fichier wp-load.php à partir de WordPress? Par exemple, pourrais-je écrire un fichier statique avec le chemin défini comme une variable lors du chargement du plug-in, puis inclure ce fichier dans le fichier de réponse Ajax autonome?
Hereswhatidid

0

J'ai trouvé ça et ça a accéléré mon ajax.

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' );
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.