O Ajax leva 10x o tempo que deveria / poderia

50

Acabei de acertar meu primeiro problema sério com o WordPress e, para alguém que gosta do Ajax, isso é um grande problema.

Eu tenho uma solicitação do Ajax que está demorando 1,5 segundos para concluir enquanto estiver usando a API do Ajax.

Se eu pegar o mesmo código exato e executá-lo com um script personalizado (sem WordPress), a solicitação do Ajax leva apenas 150 milissegundos. Isto não é um exagero

Se você olhar o primeiro comentário de http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/ e a conversa a seguir, verá que essa lentidão é causada pelo fato de que, a seu pedido, todo o WP é carregado ...

Espero que exista uma solução disponível que permita fazer solicitações do Ajax sem carregar todo o WordPress.

Quais são suas experiências com a aceleração das solicitações do Ajax com o WordPress?

Mike
fonte
3
Gostaria de saber se os plug-ins populares de cache cobrem essa situação.
Raphael
@ Rafael, eu pensei sobre isso também, mas não vi nenhuma menção a isso. Isso seria ótimo se eles fazem
Mike

Respostas:

57

Sim, esse é um problema desagradável: para ter um ambiente completo com WordPress, você precisa gastar um tempo considerável carregando-o.

Eu precisava de um desempenho muito melhor (para o recurso de pesquisa incremental muito dinâmico) para trabalhar e o que eu fiz foi:

  1. Arquivo personalizado como manipulador de Ajax.
  2. SHORTINIT constante para carga de núcleo WP limitada.
  3. Partes do núcleo carregadas muito seletivamente, somente as necessárias para a tarefa.

Isso fornece um ambiente muito limitado, mas o desempenho é muito melhor e o grau de compatibilidade razoável com o WP (começando com $wpdb) é mantido.

Aqui está o início do meu arquivo do carregador, não é bonito, mas funciona para necessidades 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
fonte
11
O que você quer dizer com SHORTINIT contant? Você pode fornecer exemplos? Eu imagino que precisarei configurar meus próprios manipuladores com vários graus de WP carregados, dependendo da necessidade da solicitação, mas gostaria de ver alguns exemplos que você criou.
9772 Mike
6
@ Mike não é amplamente conhecido, mas realmente simples em conceito - se SHORTINITconstante, o WP não carregaria a maior parte do núcleo (não há muitas APIs / funções, plugins, temas). Vou adicionar um código para responder.
Rarst
11
Isso parece ok. Eu simplesmente não gosto do fato de que precisamos usar o comando '../../../../wp-load.php'; isso torna isso bastante personalizado. Também me preocupo com o quão fácil é realmente extrair os recursos que você "precisa", porque minha experiência com o WordPress não é muito modular.
10242 Mike
@ Mike correto, mas mesmo com problemas, é muito melhor do que o endpoint que não tem idéia do WP. Isso pode (e deve) ser melhorado um pouco mais, mas não é tarefa urgente para mim no momento.
Rarst
Existem métodos para detectar a localização do wp-load.php no WordPress? Por exemplo, eu poderia escrever um arquivo estático com o caminho definido como uma variável no carregamento do plug-in e incluir esse arquivo no arquivo de resposta Ajax independente?
hereswhatidid
0

Eu encontrei isso e acelerou meu 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
fonte