首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Woocommerce ajax调用中丢失的会话数据

Woocommerce ajax调用中丢失的会话数据
EN

Stack Overflow用户
提问于 2016-01-28 14:19:57
回答 1查看 1.2K关注 0票数 0

我正在开发一个Woocommerce插件,它在会话中添加了一些vars,用于“添加到购物车”操作,并在订单完成后使用这些vars,并用于订单确认电子邮件。

基本上,工作流程如下:

  1. woocommerce_add_to_cart操作中,设置这些会话vars。 add_filter('woocommerce_add_to_cart',数组($this->wc,'add_to_cart'),10,1); 公共函数add_to_cart($cart_item_key) {if(!isset($_SESSION‘key’)){$_SESSION‘key’= array();}$_SESSION‘key’= array();foreach($_POST as $key => $value) {if(preg_match(‘’^$_POST_#,$key)) {$_SESSION‘key’$key=$value}}
  2. woocommerce_email_after_order_table,上,使用这些vars将信息添加到确认邮件中。 add_action('woocommerce_email_after_order_table',数组($this->wc,'email_after_order_table'),10,1; 公共函数email_after_order_table($order) {if(isset($_会话“票证”) &&!空($_会话“票证”)){ $output =‘;foreach($_SESSION‘’as $cart_item) { if(is_array($cart_item) &!空($cart_item)){ foreach($cart_item as $ticket_id) { $ticket = get_post($ticket_id);$room = get_the_term_list($ticket_id,'product_tag');$output .= $彩票->post_title。“(”)$room。}如果(!空($output)){ echo '‘。__(“票证”,“我的上下文”)。“”。$output。‘’}} 请注意,此操作由Woocommerce在?wc-ajax=checkout ajax调用上执行。
  3. woocommerce_order_status_completedwoocommerce_order_status_on-hold,上,使用这些vars更新某些CPT,然后删除会话vars。

我遇到的问题是,当连接到woocommerce_email_after_order_table $_SESSION时是空的。如果我查看$_COOKIE['PHPSESSID'],就会将其设置为与设置这些会话vars的上下文中相同的值。如果我试图查询CPT,它们还没有更新,所以woocommerce_order_status_completed钩子(它正在工作,访问会话vars没有问题)还没有被执行。

我尝试使用WC_Session而不是$_SESSION,它没有改变任何东西(步骤1和步骤3正在工作,但步骤2)。

有人知道为什么woocommerce_email_after_order_table操作与woocommerce_order_status_completed?不在同一个上下文中吗?在这个钩子中有任何方式传递自定义数据吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-28 16:11:26

好的,我通过跟踪钩子的执行时间发现了发生了什么,并认为woocommerce_order_status_complete是在电子邮件挂钩之前稍微执行的。看起来Woocommerce并没有提供任何钩子,事实上,在处理完所有订单操作之后,就会执行这个钩子。

代码语言:javascript
复制
woocommerce_order_status_complete           0.15321100 1453995747
woocommerce_email_after_order_table         0.40655700 1453995747

因此,考虑到我正在删除woocommerce_order_status_complete上的会话vars,它们当然不能用于电子邮件模板。将我的email_after_order_table更改为使用更新的CPT而不是会话vars解决了这个问题:

代码语言:javascript
复制
public function email_after_order_table($order) {
    $tickets = get_posts(array(
        'post_type' => 'tickets',
        'numberposts' => -1,
        'meta_query'    => array(array(
            'key'           => 'tickets_reservation',
            'value'         => $order->id
        ))
    ));
    if($tickets) {
        $output = '';
        foreach($tickets as $ticket) {
            $room = strip_tags(get_the_term_list($ticket->ID, 'product_tag'));
            $output .= $ticket->post_title . ' (' . $room . ')<br />';
        }
        if(!empty($output)) {
            echo '<h4>' . __('Tickets', 'my-context') . '</h4><p>' . $output . '</p>';
        }
    }
}

我之前没有查询CPT的原因很简单:我使用$order->ID而不是$order->id.

我想如果Woocommerce提供更多关于钩子执行命令的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35063996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档