我正在开发一个Woocommerce插件,它在会话中添加了一些vars,用于“添加到购物车”操作,并在订单完成后使用这些vars,并用于订单确认电子邮件。
基本上,工作流程如下:
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}}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调用上执行。woocommerce_order_status_completed或woocommerce_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?不在同一个上下文中吗?在这个钩子中有任何方式传递自定义数据吗?
发布于 2016-01-28 16:11:26
好的,我通过跟踪钩子的执行时间发现了发生了什么,并认为woocommerce_order_status_complete是在电子邮件挂钩之前稍微执行的。看起来Woocommerce并没有提供任何钩子,事实上,在处理完所有订单操作之后,就会执行这个钩子。
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解决了这个问题:
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提供更多关于钩子执行命令的信息。
https://stackoverflow.com/questions/35063996
复制相似问题