试图找出同一个程序员遇到的问题。我想知道当您执行管理端AJAX时是否会完全调用functions.php文件?我知道当您进行AJAX调用时,会加载一部分WP以处理该调用并发送回响应。

我问的原因是因为他使用的是Meta-Box`插件中的类,并将其加载为主题的一部分。该类中有一些AJAX仅返回空响应,我认为是因为处理响应的代码未加载。 WP处理AJAX时加载的内容是否有任何文档?

#1 楼

admin-ajax.php负载wp-load.php

/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );


wp-load.php负载wp-config.php,并且wp-settings.php也被加载。 br />
// Load the functions for the active theme, for both parent and child theme if applicable.
if ( ! defined( 'WP_INSTALLING' ) || 'wp-activate.php' === $pagenow ) {
    if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
        include( STYLESHEETPATH . '/functions.php' );
    if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
        include( TEMPLATEPATH . '/functions.php' );
}


因此,是的,主题的functions.php已加载。


wp-settings.php中有一​​个例外:

SHORTINIT较早地定义为TRUE时,将不会加载主题。

因此请出于某种原因检查SHORTINIT是否为TRUE。 br />另一个常见的错误是is_admin()的错误使用。这始终是TRUE中的admin-ajax.php,因此以下操作将失败:正在使用HTTP标头调试AJAX。

这是一个简单的辅助函数:

// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
    return false;


此插件演示了如何使用它:

if ( ! is_admin() )
    // register or execute AJAX stuff


它将在前端添加一个按钮,单击该按钮会触发AJAX请求。打开浏览器的网络控制台,然后查看请求的响应标头:



评论


与以往一样详细,@ toscho。当代码在您的端上运行正常但对其他人不行时,尤其难以调试。似乎无法重现问题,但您的回答可能会向我指示正确的方向。

–曼妮·弗勒蒙德(Manny Fleurmond)
13年4月20日在13:15

@MannyFleurmond我添加了一个调试助手插件。那应该有助于发现问题。

– fuxia♦
13年4月20日在13:46

伙计,你很彻底:)

–曼妮·弗勒蒙德(Manny Fleurmond)
13年4月20日在13:58

TEMPLATEPATH? ;)

– kaiser
13年7月14日在0:16

#2 楼

我假设您的问题AJAX在您登录后仍无法正常工作的情况下正常工作,对吧?
WordPress中有一个功能可以为未登录的用户访问基于AJAX的文件:wp_ajax_nopriv,例如
/* works for logged users */
add_action( 'wp_ajax_my_action', 'my_action_callback');

/* works for non logged users */
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback');