我正在开发一个Woocommerce插件,可以在会话中添加一些vars;添加到购物车"操作,并在订单完成后使用这些变量以及订单确认电子邮件。
基本上工作流程如下:
在 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=checkout
ajax电话上执行。
在 woocommerce_order_status_completed
或 woocommerce_order_status_on-hold
上,使用这些变种更新一些CPT,然后删除会话变量。
我遇到的问题是,挂钩 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
在同一上下文中的原因?有没有办法在该钩子中传递自定义数据?
答案 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提供了有关钩子执行顺序的更多信息,我想要。