如何在WordPress中将特定插件加载到Ajax处理程序?

时间:2018-11-16 06:32:17

标签: javascript php html wordpress woocommerce

我正在使用安装了WooCommerce的WordPress。我注意到调用WordPress API或WooCommerce API会返回较慢的响应时间。

我创建了一个自定义请求句柄,以便我的ajax调用不会加载整个WordPress来服务端点。自定义请求句柄文件将仅提供内容并处理权限。

myajaxhandler.php

<?php
    // Force a short-init since we just need core WP, not the entire framework stack
    define( 'SHORTINIT', true );
    require_once('../../../wp-load.php');

    echo 'aaa';
    WC()->session->set_customer_session_cookie(true);
    exit();    
?>

custom-js.js

var custom_ajax_url = 'http://localhost/mywebsite' + '/wp-content/plugins/zb-ajax-handler/myajaxhandler.php';

$.ajax({
    type: 'GET',
    url: custom_ajax_url,
    cache: false,
    data: {
        action: 'getwcnonce'
    },
    success: function(data) {},
    error: function(xhr, status, error) {
        console.log(error);
    }
});

对myajaxhandler.php文件的调用 成功 ,但是我收到错误消息:

  

致命错误:调用未定义的函数WC()   C:\ XamppDev \ htdocs \ mywebsite \ wp-content \ plugins \ zb-ajax-handler \ myajaxhandler.php   在第12行

我认为这是因为WooCommerce插件文件未重组。

您知道如何将WooCommerce插件包含/加载到我的Ajax处理程序中,以便可以调用WooCommerce及其功能吗?

任何想法都值得赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

这确实是一个有趣的问题。是的,您是对的-在每个ajax请求上加载整个WordPress安装(包括WooCommerce),可能会很慢。尤其是如果您要处理很多请求(您不是第一个遇到此问题的请求:https://wordpress.stackexchange.com/questions/26254/how-to-include-wp-load-php-from-any-location)。

但是仅包含 wp-load.php 可能还不够。在处理您的请求期间,您可能会偶然发现缺少功能和相关性,这会导致致命错误。

我认为可以稍微加快加载时间的一种可能性是 在您的ajax请求期间禁用不需要的插件的加载 (如您所建议)-示例您可以根据自己的需要进行更改的方法:

    $request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $is_admin = strpos( $request_uri, '/wp-admin/' );

    // add filter in front pages only
    if( false === $is_admin && !DOING_AJAX ){
        add_filter( 'option_active_plugins', 'disable_plugins_for_request' );
    }

    function disable_plugins_for_request( $plugins ){
        global $request_uri;
        $is_contact_page = strpos( $request_uri, '/contact/' );

        $unnecessary_plugins = array();

        // conditions: deactivate plugins if not certain page u.ä.
        if( false === $is_contact_page ){
            $unnecessary_plugins[] = 'contact-form-7/wp-contact-form-7.php';
        }

        foreach ( $unnecessary_plugins as $plugin ) {
            $k = array_search( $plugin, $plugins );
            if( false !== $k ){
                unset( $plugins[$k] );
            }
        }
        return $plugins;
    }

本教程中的更多信息:https://kinsta.com/blog/disable-wordpress-plugins/

不过更容易:为您的API设置适当的缓存机制

只需照常执行请求,并按照WordPress代码库中的说明进行操作:https://codex.wordpress.org/AJAX_in_Plugins

但是使用缓存插件或什至您自己的缓存机制来缓存结果 。您可以通过检查当前请求是否存在缓存文件来做到这一点,并且只有在没有缓存文件时才开始加载WordPress。