我需要在php jquery WC()->set
函数中设置.get
。我需要在php文件中做什么才能访问WC()
。现在它告诉我WC
未定义。
这是在显示购物车的cart.php
文件中,并显示了两个用于投放选项的单选按钮。
这是处理RB更改的脚本(我简化了以便在从php查询返回时执行重新加载的函数):
<script>
jQuery(document).ready(function($){
$("#myid").change(function(){
console.log("RB Changed!");
passed_variable = "1";
$.get('http://www.example.com/test.php',
{pass_var: passed_variable},
function(data, status) {
console.log("returned");
location.reload();
});
});
});
</script>
这是PHP查询:
<?php
global $woocommerce;
echo "START<BR>";
$temp = $_GET["pass_var"];
WC()->session->set('_delivery_loading', $temp);
// or
$woocommerce->session->set('_delivery_loading', $temp);
echo "DONE[" . $temp . "]";
?>
答案 0 :(得分:2)
为什么需要致电test.php
?如果您使用wp_ajax_$action
回调,则您将在WP框架内并加载WC()
。这是一个从codex和jQuery .ajax()拼凑而成的例子。
将您从以下位置进行ajax调用的脚本排队:
function so_34107959_enqueue_script(){
wp_enqueue_script( 'so_34107959_script', plugins_url( '/js/so_34107959.js' , __FILE__ ), '1.0b', array('wc-add-to-cart'), true );
}
add_action( 'wp_enqueue_scripts', 'so_34107959_enqueue_script' );
请注意wc-add-to-cart
脚本是依赖项。我只是这样做,所以我们可以使用WooCommerce的本地化脚本变量。如果你需要在不使用add to cart脚本的地方使用它,那么你需要wp_localize_script()
并自己传入admin ajax url。
您的脚本文件so_34107959.js
:
jQuery(document).ready(function($){
$("#myid").change(function(){
var passed_var = "1";
$.ajax({
url: wc_add_to_cart_params.ajax_url, // here's the ajax url from WooCommerce
data: { action: "add_foobar", pass_var: passed_var } // the action must match up to wp_ajax_$action
})
.done(function( data ) {
if ( console && console.log ) {
// should return either success or fail
console.log( data );
}
});
});
});
最后这段代码是你的ajax“action”的回调:
function so_34107959_ajax_add_foobar() {
$temp = isset( $_REQUEST["pass_var"] ) ? $_REQUEST["pass_var"] : '';
if( $test ){
WC()->session->set('_delivery_loading', $temp);
echo 'success';
} else {
echo 'fail';
}
die();
}
add_action( 'wp_ajax_add_foobar', 'so_34107959_ajax_add_foobar' );
add_action( 'wp_ajax_nopriv_add_foobar', 'so_34107959_ajax_add_foobar' );
未经测试,请注意拼写错误。
进一步说明:
PHP代码假定您正在编写插件。你可以作弊并把它放在你的主题functions.php
中,但我认为主题应该保留用于演示,任何功能都应该在插件中。
Codex对wp_ajax_$action
钩子有这样的解释:
此钩子允许您为自己的自定义AJAX请求创建自定义处理程序。 wp_ajax_钩子遵循格式“wp_ajax_ $ youraction”,其中$ youraction是你的AJAX请求的'action'属性。
这意味着,如果您将“操作”传递给.ajax()
中的“数据”,则相同的操作最终将作为wp_ajax_$youraction
回调的尾部。
在我的例子中,因此这里是.ajax()
脚本的数据位:
data:{action:“add_foobar”,pass_var:passed_var}
动作是“add_foobar”。它可以是任何东西。
然后将该操作“add_foobar”附加到“wp_ajax_”的末尾,以便add_action()
看起来像:
add_action( 'wp_ajax_add_foobar', 'so_34107959_ajax_add_foobar' );
这适用于admin /登录用户。 “nopriv”中的:
add_action( 'wp_ajax_add_foobar', 'so_34107959_ajax_add_foobar' );
表示非登录用户可以使用ajax挂钩。
最后,so_34107959_ajax_add_foobar()
是处理ajax请求的服务器端函数。