【发布时间】:2016-05-05 23:26:27
【问题描述】:
我正在开发一个 Woocommerce 插件,该插件在“添加到购物车”操作的会话中添加一些变量,并在稍后完成订单和订单确认电子邮件时使用这些变量。
基本上工作流程如下:
-
在
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; } } } -
在
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=checkoutajax 调用上执行。 在
woocommerce_order_status_completed或woocommerce_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