Php ajax调用时会话数据丢失
我正在开发一个Woocommerce插件,在“添加到购物车”操作的会话中添加一些变量,并在订单完成后以及订单确认电子邮件中使用这些变量Php ajax调用时会话数据丢失,php,ajax,wordpress,woocommerce,Php,Ajax,Wordpress,Woocommerce,我正在开发一个Woocommerce插件,在“添加到购物车”操作的会话中添加一些变量,并在订单完成后以及订单确认电子邮件中使用这些变量 add_action('woocommerce_email_after_order_table', array(&$this->wc, 'email_after_order_table'), 10, 1); 工作流程基本上如下所示: 在“向购物车添加”操作中,设置这些会话变量 add_filter('woocommerce_add_to_cart
add_action('woocommerce_email_after_order_table', array(&$this->wc, 'email_after_order_table'), 10, 1);
工作流程基本上如下所示:
add_filter('woocommerce_add_to_cart', array(&$this->wc, 'add_to_cart'), 10, 1);
add_action('woocommerce_email_after_order_table', array(&$this->wc, 'email_after_order_table'), 10, 1);
公共功能电子邮件\u在\u订单\u表之后($order){
如果(isset($_会话['tickets'])和&!empty($_会话['tickets'])){
$output='';
foreach($\会话['tickets']作为$cart\项目){
if(是数组($cart\u item)&&!空($cart\u item)){
foreach($cart\u项目作为$ticket\u id){
$ticket=get\u post($ticket\u id);
$room=获取术语列表($ticket\u id,'product\u tag');
$output.=$ticket->post_title.'('.$room.')
;
}
}
}
如果(!空($output)){
回显'.''Tickets','my context'.'p>'.$output'.';
}
}
}
请注意,此操作由Woocommerce在?wc ajax=checkout
ajax调用上执行woocommerce\u order\u status\u completed
或woocommerce\u order\u status\u On-hold
上,使用这些变量更新一些CPT,然后删除会话变量add_filter('woocommerce_add_to_cart', array(&$this->wc, 'add_to_cart'), 10, 1);
我遇到的问题是,当在订单后挂接woocommerce\u email\u时,表
$\u会话
为空。如果我查看$\u COOKIE['PHPSESSID']
,它被设置为与设置这些会话变量的上下文中相同的值。如果我尝试查询CPT,它们还没有更新,因此尚未执行woocommerce\u order\u status\u completed
钩子(该钩子正在工作,访问会话变量没有问题)
我尝试使用而不是$\u SESSION
,它没有改变任何东西(步骤1和步骤3正常,但步骤2无效)
有人知道为什么“订单”表后的“woocommerce电子邮件”操作与“woocommerce订单”状态“已完成”不在同一上下文中吗?有什么方法可以在钩子中传递自定义数据吗?好吧,我通过跟踪钩子的执行时间发现了发生了什么,并计算出
woocommerce\u order\u status\u complete
是在电子邮件钩子之前执行的。看起来Woocommerce没有提供任何钩子,事实上,钩子是在处理完所有订单操作后执行的
woocommerce\u订单\u状态\u完成0.15321100 1453995747
订单后的WOOCOMERCE电子邮件表0.40655700 1453995747
因此,考虑到我正在删除woocommerce\u order\u status\u complete
上的会话变量,它们当然无法用于电子邮件模板。将我的电子邮件\u在订单\u表之后更改为使用更新的CPT而不是会话变量解决了问题:
公共功能电子邮件\u在\u订单\u表之后($order){
$tickets=get_posts(数组(
“post_type”=>“tickets”,
“numberposts”=>-1,
“元查询”=>数组(数组(
“钥匙”=>“订票”,
“值”=>$order->id
))
));
若有($门票){
$output='';
foreach($tickets作为$ticket){
$room=strip_标签(获取术语列表($ticket->ID,'product_标签');
$output.=$ticket->post_title.'('.$room.')
;
}
如果(!空($output)){
回显'.''Tickets','my context'.'p>'.$output'.';
}
}
}
我之前查询CPT失败的原因很简单:我使用了$order->ID
而不是$order->ID
我想如果Woocommerce提供更多关于hooks执行订单的信息