Ajax tarda 10 veces más de lo que debería / podría

50

Acabo de llegar a mi primer problema serio con WordPress y para alguien que disfruta de Ajax, esto es muy importante.

Tengo una solicitud de Ajax que tarda 1.5 segundos en completarse mientras uso la API de Ajax.

Si tomo el mismo código exacto y lo ejecuto con un script personalizado (sin WordPress), la solicitud de Ajax solo toma 150 milisegundos. esto no es una exageración

Si miras el primer comentario de http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/ y la conversación que sigue verás que esta lentitud es causada por el hecho de que en su solicitud, todo WP se carga ...

Espero que haya una solución que permita realizar solicitudes de Ajax sin cargar todo WordPress.

¿Cuáles son sus experiencias al acelerar las solicitudes de Ajax con WordPress?

Miguel
fuente
3
Me pregunto si los complementos de almacenamiento en caché populares cubren esta situación.
Raphael
@ Raphael, también pensé en eso, pero no he visto ninguna mención al respecto. Eso sería GENIAL si lo hacen
Mike

Respuestas:

57

Sí, este es un problema desagradable que para tener un entorno completo de WordPress necesita pasar un tiempo considerable cargándolo.

He necesitado un rendimiento mucho mejor (para una función de búsqueda incremental muy dinámica) para el trabajo y lo que elegí es:

  1. Archivo personalizado como controlador Ajax.
  2. SHORTINIT constante para carga de núcleo WP limitada.
  3. Partes del núcleo muy selectivamente cargadas, solo aquellas necesarias para la tarea.

Esto proporciona un entorno muy limitado, pero el rendimiento es mucho mejor y se conserva un grado razonable de compatibilidad con WP (comenzando con $wpdb).

Aquí está comenzar mi archivo de cargador, no bonito pero funciona para necesidades específicas:

<?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
fuente
1
¿Qué quieres decir con SHORTINIT contant? ¿Puedes dar ejemplos? Imaginé que tendré que configurar mis propios controladores con diferentes grados de carga de WP dependiendo de la necesidad de la solicitud, pero me gustaría ver algunos ejemplos que ha creado.
Mike
66
@Mike no es ampliamente conocido, pero su concepto es realmente simple: si SHORTINITse establece constante, WP no cargaría la mayor parte del núcleo (no la mayoría de las API / funciones, ni complementos, ni tema). Agregaré un código para responder.
Rarst
1
Eso se ve bien. Simplemente no me gusta el hecho de que tenemos que usar require '../../../../wp-load.php'; eso hace que esto sea bastante personalizado. También me preocupa lo fácil que es obtener los recursos que "necesita", según mi experiencia, WordPress no es muy modular.
Mike
@Mike es correcto, pero incluso con problemas es mucho mejor que un punto final que no tiene idea sobre WP. Esto puede (y debería) mejorarse un poco más, pero no es una tarea urgente para mí en este momento.
Rarst
¿Hay algún método para detectar la ubicación de wp-load.php desde WordPress? Por ejemplo, ¿podría escribir un archivo estático con la ruta establecida como una variable dentro de él en la carga del complemento, y luego incluir ese archivo en el archivo de respuesta Ajax independiente?
hereswhatidid
0

Encontré esto y aceleró mi 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' );
Lisa Daugherty Thompson
fuente