会话数据在Woocommerce ajax调用中丢失

时间:2016-01-28 14:19:57

标签: php ajax wordpress woocommerce

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

基本上工作流程如下:

  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_completed woocommerce_order_status_on-hold 上,使用这些变种更新一些CPT,然后删除会话变量。

  4. 我遇到的问题是,挂钩 woocommerce_email_after_order_table $_SESSION时为空。如果我查看$_COOKIE['PHPSESSID'],则将其设置为与设置这些会话变量的上下文中的值相同。如果我尝试查询CPT,它们尚未更新,那么 woocommerce_order_status_completed 挂钩(正在运行并且没有访问会话变量的问题)不是&#39;尚未执行。

    我尝试使用WC_Session代替$_SESSION,但它没有改变任何内容(第1步和第3步正在运行,但不是第2步)。

    是否有人知道 woocommerce_email_after_order_table 操作与 woocommerce_order_status_completed 在同一上下文中的原因?有没有办法在该钩子中传递自定义数据?

1 个答案:

答案 0 :(得分:0)

好吧我通过跟踪挂钩执行时间找出了发生了什么,并且发现在电子邮件挂钩之前稍微执行了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->ID代替$order->id ...

如果Woocommerce提供了有关钩子执行顺序的更多信息,我想要。