【问题标题】:Session data lost on Woocommerce ajax callWoocommerce ajax 调用中的会话数据丢失
【发布时间】:2016-05-05 23:26:27
【问题描述】:

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

基本上工作流程如下:

  1. woocommerce_add_to_cart 操作中,设置这些会话变量。

    add_filter('woocommerce_add_to_cart', array(&$this->wc, 'add_to_cart'), 10, 1);
    
    public function add_to_cart($cart_item_key) {
        if(!isset($_SESSION['tickets'])) {
            $_SESSION['tickets'] = array();
        }
        $_SESSION['tickets'][$cart_item_key] = array();
        foreach($_POST as $key => $value) {
            if(preg_match('#^ticket_#', $key)) {
                $_SESSION['tickets'][$cart_item_key][$key] = $value;
            }
        }
    }
    
  2. woocommerce_email_after_order_table 上,使用这些变量将信息添加到确认电子邮件中。

    add_action('woocommerce_email_after_order_table', array(&$this->wc, 'email_after_order_table'), 10, 1);
    
    public function email_after_order_table($order) {
        if(isset($_SESSION['tickets']) && !empty($_SESSION['tickets'])) {
            $output = '';
            foreach($_SESSION['tickets'] as $cart_item) {
                if(is_array($cart_item) && !empty($cart_item)) {
                    foreach($cart_item as $ticket_id) {
                        $ticket = get_post($ticket_id);
                        $room = 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>';
            }
        }
    }
    

    请注意,此操作由 Woocommerce 在 ?wc-ajax=checkout ajax 调用上执行。

  3. woocommerce_order_status_completedwoocommerce_order_status_on-hold 上,使用这些变量更新一些 CPT,然后删除会话变量。

我遇到的问题是,当挂钩 woocommerce_email_after_order_table $_SESSION 是空的。如果我查看$_COOKIE['PHPSESSID'],它被设置并且与设置这些会话变量的上下文中的值相同。如果我尝试查询 CPT,它们还没有更新,所以 woocommerce_order_status_completed 钩子(它正在工作并且访问会话变量没有问题)尚未执行。 p>

我尝试使用 WC_Session 而不是 $_SESSION,它没有改变任何东西(第 1 步和第 3 步有效,但第 2 步无效)。

有谁知道为什么 woocommerce_email_after_order_table 操作与 woocommerce_order_status_completed 的上下文不同?有没有办法在那个钩子中传递自定义数据?

【问题讨论】:

    标签: php ajax wordpress woocommerce


    【解决方案1】:

    好吧,我通过跟踪钩子执行时间发现了发生了什么,并发现woocommerce_order_status_complete 是在电子邮件钩子之前执行的。实际上,Woocommerce 似乎没有提供任何在 处理完所有订单操作之后执行的钩子。

    woocommerce_order_status_complete           0.15321100 1453995747
    woocommerce_email_after_order_table         0.40655700 1453995747
    

    所以考虑到我正在删除woocommerce_order_status_complete 上的会话变量,电子邮件模板当然无法访问它们。更改我的email_after_order_table 以使用更新的 CPT 而不是会话变量解决了问题:

    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-&gt;ID而不是$order-&gt;id...

    我希望 Woocommerce 提供有关挂钩执行顺序的更多信息。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 1970-01-01
      • 2016-07-03
      • 2020-07-11
      • 2012-09-29
      • 1970-01-01
      • 2014-12-05
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多