我正在使用安装了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及其功能吗?
任何想法都值得赞赏。谢谢。
答案 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。