Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ajax调用时会话数据丢失_Php_Ajax_Wordpress_Woocommerce - Fatal编程技术网

Php ajax调用时会话数据丢失

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

我正在开发一个Woocommerce插件,在“添加到购物车”操作的会话中添加一些变量,并在订单完成后以及订单确认电子邮件中使用这些变量

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);
    
  • 在订单后的电子邮件表中,使用这些VAR将信息添加到确认电子邮件中

    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执行订单的信息