Ren*_*ndy 1 javascript php ajax wordpress woocommerce
我有以下 Ajax 片段,它调用一个 php 文件,该文件打算返回短代码的 HTML 内容。
Ajax 调用如下所示:
var PostData = "Action=refresh-cart";
jQuery.ajax({
dataType: "text",
type: 'POST',
url : '<?php echo plugins_url( 'class-booking-system/class-booking-process.php', dirname(__FILE__) );?>',
cache: false,
data : PostData,
complete : function() { },
success: function(data) {
// jQuery("#loading-img").hide();
alert(data);
// jQuery("#join-class-div-3").html(data);
}
});
Run Code Online (Sandbox Code Playgroud)
PHP 看起来像这样:
<?php
require_once( ABSPATH . '/wp-includes/shortcodes.php' );
if(isset($_POST['Action'])) {
$Action = $_POST['Action'];
if($Action == "refresh-cart") {
echo do_shortcode('[woocommerce_cart]');
}
}
?>
Run Code Online (Sandbox Code Playgroud)
但是,当我调用 Ajax 方法时,它返回 HTTP 500 - 我认为这意味着在此上下文中找不到 do_shortcode 函数。我怎样才能让我的插件能够通过ajax调用这个wordpress函数?
我认为您应该看一下 Codex 关于在插件中使用 Ajax 的文章。它提供了一个关于如何在 WordPress 中进行 ajax 调用的非常好的示例。
将他们的示例适应您的代码,我得到如下内容:
首先我们加载 JavaScript。我们还通过 传递一些 javascript 变量wp_localize_script。在本例中,我们将传递管理员的 URL 来处理所有 ajax 调用。
wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery') );
// in JavaScript, object properties are accessed as ajax_object.ajax_url
wp_localize_script( 'ajax-script', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
Run Code Online (Sandbox Code Playgroud)
其次,在我们的 javascript 中,我们可以进行 ajax 调用并定义我们的 ajax“操作”以及数据对象中我们需要的任何其他数据。因为“action”有不同的含义,所以我将您的操作重命名为“refresh_cart”。
jQuery(document).ready(function($) {
$.ajax({
type: 'POST',
url : ajax_object.ajax_url,
cache: false,
data : { 'action': 'my_action', 'refresh_cart': 'yes' },
complete : function() { },
success: function(data) {
// $("#loading-img").hide();
alert(data);
// $("#join-class-div-3").html(data);
}
});
});
Run Code Online (Sandbox Code Playgroud)
第三,我们需要为 ajax 操作设置回调。admin-ajax.php查看 WordPress 的所有预配置操作,然后还会查找添加到wp_ajax_$my_action_name后端和wp_ajax_nopriv_$my_action_name前端的任何内容。我假设您的问题涉及前端,因为在data对象中我们设置了action = my_action相应的操作钩子wp_ajax_nopriv_my_action......我们已将函数附加到该钩子上my_action_callback。WordPress 应该完全加载,据我所知,运行短代码不应该成为问题。
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
function my_action_callback() {
if( isset($_POST['refresh-cart']) && $_POST['refresh-cart'] == 'yes' ) {
echo do_shortcode('[woocommerce_cart]');
}
die();
}
Run Code Online (Sandbox Code Playgroud)
瞧!我认为应该可以,但我必须警告您,我没有测试任何这些,所以请谨慎使用。