只要/应该,Ajax就会花费10倍的时间


50

我刚刚遇到了WordPress的第一个严重问题,对于喜欢Ajax的人来说,这是一个大问题。

我有一个Ajax请求,在使用Ajax API时需要1.5秒才能完成。

如果我使用完全相同的代码并使用自定义脚本(没有WordPress)运行它,则Ajax请求仅需150毫秒。这并不夸张

如果您看一下http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/的第一条评论,随后的对话中您会发现,这种缓慢是由根据您的要求,所有WP都已加载...

我希望有一个解决方案,可以在不加载所有WordPress的情况下发出Ajax请求。

您通过WordPress加快Ajax请求的经验是什么?


3
我不知道流行的缓存插件能否涵盖这种情况。
拉斐尔2012年

@Raphael,我也曾考虑过,但未见任何提及。如果这样做的话,那就太好了
Mike

Answers:


57

是的,这是一个令人讨厌的问题,要拥有完整的WordPress环境,您需要花费大量时间来加载它。

我需要更好的性能(非常动态的增量搜索功能)才能工作,我要做的是:

  1. 自定义文件作为Ajax处理程序。
  2. SHORTINIT常数,用于限制WP核心负载。
  3. 选择性地加载核心部分,仅完成任务所需的部分。

这提供了非常有限的环境,但是性能是更好的方式,并且$wpdb保留了与WP(以开头)的合理程度的兼容性。

这是启动我的加载程序文件,虽然不漂亮,但可以满足特定需求:

<?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
SHORTINIT contant是什么意思?你能提供例子吗?我预想需要根据请求的需要设置不同程度的WP加载,以设置自己的处理程序,但是我希望看到您创建的一些示例。
Mike

6
@Mike并没有广为人知,但概念上确实很简单- 如果SHORTINIT设置了常量, WP不会加载大多数核心(没有大多数API /功能,没有插件,没有主题)。我将添加一些代码来回答。
拉斯特

1
看起来还可以。我只是不喜欢我们必须使用require'../../../../wp-load.php'的事实;这使得这个很漂亮。我还担心从我的经验来看,实际提取您“需要”的资源有多么容易,因为WordPress不是模块化的。
Mike

@Mike是正确的,但是即使有问题,它也比完全不了解WP的端点要好得多。这可以(并且应该)进一步改进,但对我而言,这并不是紧迫的任务。
拉斯特

有没有什么方法可以从WordPress中检测wp-load.php的位置?例如,是否可以在加载插件时编写一个静态文件,并将其路径设置为变量,然后将该文件包含在独立的Ajax响应文件中?
hereswhatidid 2012年

0

我发现了它,加快了我的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' );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.