在WordPress中有没有更好的方法来处理AJAX请求?

时间:2016-08-20 作者:connorb

我目前正在构建一个非常简单的插件,但它在很大程度上依赖于AJAX请求。我用的是标准admin-ajax 请求的端点,但我发现它似乎非常不一致,有时请求(对于相同的数据)需要几百毫秒,有时需要几秒钟。

我知道有heartbeat 使用时可能出现问题的问题admin-ajax 修改后可以帮助提高使用端点时的请求速度。

我想我可以将请求直接指向一个PHP文件并将其用作端点,但我是否可以创建一个使用Wordpress路由的端点?

So my question is; Does Wordpress have support for custom ajax endpoints / url parameters that will fire function calls etc..?

我也知道我可以使用REST API路由回调,但我希望这个插件在可能的情况下是无依赖的,因此它将在不包含REST API的Wordpress版本上得到支持。

谢谢你的帮助!

2 个回复
最合适的回答,由SO网友:jgraup 整理而成

使用add_rewrite_rule 创建自己的API并自己处理端点。

工具,如Monkeyman Rewrite Analyzer 将帮助您了解重写规则最终如何与现有规则一起工作。

<小时>

if ( ! class_exists( \'WPSEAPIEndpoint\' ) ):

    class WPSEAPIEndpoint {

        // WordPress hooks
        public function __construct() {
            add_filter( \'query_vars\', array ( $this, \'add_query_vars\' ), 0 );
            add_action( \'parse_request\', array ( $this, \'sniff_requests\' ), 0 );
            add_action( \'init\', array ( $this, \'add_endpoint\' ), 0 );
        }

        // Add public query vars
        public function add_query_vars( $vars ) {
            $vars[] = \'___my-api\';
            $vars[] = \'action\';
            return $vars;
        }

        // Add API Endpoint
        public function add_endpoint() {
            add_rewrite_rule( \'^my-api/v1/([^/]*)/?\', \'index.php?___my-api=1&action=$matches[1]\', \'top\' );
            flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE TESTING
        }

        // Sniff Requests
        public function sniff_requests( $wp_query ) {
            global $wp;

            if ( isset( $wp->query_vars[ \'___my-api\' ], $wp->query_vars[ \'action\' ] ) ) {
                wp_die( "Action requested: " . $wp->query_vars[ \'action\' ] );
            }
        }
    }

    $wptept = new WPSEAPIEndpoint();

endif; // WPSEAPIEndpoint
这有三个主要部分;添加自定义查询变量,添加自定义端点,并在看到自定义查询变量时处理请求。

flush_rewrite_rules() 实际上,只需要在添加新规则后进行一次测试,但它可以使测试更快地将其内联,如我所示。完成后就把它取下来。或者通过在“设置”菜单中保存永久链接,尽早删除它并刷新重写规则。

SO网友:Rarst

本机ajax端点的主要问题是它必须加载整个WordPress核心。除非是什么原因导致了你的代码速度变慢,否则很可能是其他原因阻碍了这个过程。

在这种情况下,通过不同的端点对您没有任何帮助,因为您仍然需要加载核心并返回到第一个端点。

几秒钟听起来不正常,我建议首先弄清楚延迟是从哪里来的。

WP中快速ajax端点的唯一实用技术是使用SHORTINIT, 但这仅限于私人项目,因为它实际上无法编写出足够通用的代码,以在公共解决方案中分发(尽管有些人这样做了,而且在任何安装中都会出现比死默认值稍小的错误)。

相关推荐

将用户从wp-admin(而不是管理员)重定向

我想重定向除管理员以外的所有用户,使其远离wp admin页面如果登录用户尝试访问/wp admin,则他们将被重定向回主页现在他们看到一个页面,上面写着;抱歉,不允许您访问此页面<你们能帮我在函数中构造一个函数吗。php文件来检查这些条件并重定向<这就是我所拥有的,它并不是为了我想要的。function acme_login_redirect( $redirect_to, $request, $user ) { return ( is_array( $user->role