【发布时间】:2019-05-09 16:30:49
【问题描述】:
更新:
我正在构建一个 WooCommerce 网站,用户在其中从单个产品页面的下拉列表中选择一系列选项,然后显示在购物车页面中,感谢我在这里收到的帮助,以及结帐时的帮助。选择的选项也会影响产品的价格。我从两个产品变体开始:“打印”和“原始”(该网站出售古董地图)。
一切正常,直到结帐时所有订单详细信息都正确显示,但是在下订单后,详细信息不会出现在“订单详细信息”下的“已收到订单”屏幕上,也不会出现在客户中确认邮件。
为了提供一些背景知识,使用 jQuery 选择不同的变体,并在下面的示例中添加到隐藏字段:
$( ":root" ).find("#mapchest-custom-fields").append("<input type='hidden'
name='test' value='wibble'>");
...然后引用这些隐藏字段以通过以下方式将详细信息添加到购物车:
add_filter('woocommerce_add_cart_item_data','add_custom_field_data', 20,3);
function add_custom_field_data($cart_item_data, $product_id, $variation_id)
{
if(isset($_REQUEST['test']) && ! empty( 'test' )) { // not
$mc_test = sanitize_text_field($_POST['test']);
$cart_item_data['custom_data']['test'] = array(
'label' => 'Test',
'value' => $mc_test
);
}
if(isset($_REQUEST['original_map_vendor_details']) && ! empty(
'original_map_vendor_details' )) {
$mc_original_map_size =
sanitize_text_field($_REQUEST['original_map_vendor_details']);
$cart_item_data['custom_data']['original_map_vendor_details'] =
array(
'label' => 'Vendor',
'value' => $mc_original_map_size
);
}
// process above repeated for other fields
return $cart_item_data;
}
使用以下功能在购物车和结帐中显示详细信息:
add_filter('woocommerce_get_item_data','wdm_add_item_meta',10,2);
function wdm_add_item_meta($cart_data, $cart_item)
{
$custom_items = array();
if( !empty( $cart_data ) )
$custom_items = $cart_data;
if( isset( $cart_item['custom_data'] ) ) {
foreach( $cart_item['custom_data'] as $key => $custom_data ){
if( $key != 'key' ){
$custom_items[] = array(
'name' => $custom_data['label'],
'value' => $custom_data['value'],
);
}
}
}
return $custom_items;
}
正如我所说,我想做的是在“已收到订单”页面和电子邮件中显示详细信息,但我无法使其正常工作。我知道对于电子邮件,我需要将其连接到其中一个电子邮件挂钩,但我不知道如何访问上述函数中发送到购物车的数据。
我尝试使用 woocommerce_checkout_create_order_line_item 挂钩添加到以下几行:
add_action( 'woocommerce_checkout_create_order_line_item',
'add_custom_order_line_item_meta', 20,4 );
function add_custom_order_line_item_meta($item, $cart_item_key, $values,
$order)
{
if( array_key_exists('test', $values['custom_data']) ){
$item->update_meta_data( 'Test', $values['custom_data']['test'] );
}
}
...但是如果我像这样在电子邮件中 var_dump 可以看到数据:
add_action('woocommerce_email_customer_details',
'add_custom_checkout_field_to_emails_notifications', 25, 4 );
function add_custom_checkout_field_to_emails_notifications( $order,
$sent_to_admin, $plain_text, $email ) {
var_dump($order);
}
因此,总而言之,我的数据一直在工作并显示到结帐时。之后,我希望它显示在客户确认电子邮件和“已收到订单”页面上,但我无法访问数据。在查看了关于同一主题的其他问题后,我会认为这会自动发生在收到的订单页面上,但事实并非如此。我怀疑代码中缺少一个阶段,但我无法弄清楚它应该是什么。
关于我在这里做错了什么的任何提示?
提前致谢。
ps。我现在已经设法使用以下功能在确认电子邮件中显示字段(经过一段时间):
add_action( 'woocommerce_checkout_create_order_line_item',
'add_custom_order_line_item_meta', 20,4 );
function add_custom_order_line_item_meta($item, $cart_item_key, $values,
$order)
{
if ( isset( $values['custom_data'] ) ) {
$item->update_meta_data( __('The Custom Data', 'woocommerce'),
$values['custom_data'] );
}
}
和
add_action('woocommerce_email_customer_details',
'add_custom_checkout_field_to_emails_notifications', 25, 4 );
function add_custom_checkout_field_to_emails_notifications( $order,
$sent_to_admin, $plain_text, $email ) {
// var_dump($order);
foreach( $order->get_items() as $item_id => $item ){
$custom_data = $item->get_meta( 'The Custom Data' );
foreach( $custom_data as $key => $value ){
foreach( $value as $key1 => $value1 ){
$output = '';
$output .= '<span class="text">' . $value1 . '</span>';
echo $output;
}
echo "<br>";
}
echo "<br><br>";
// var_dump($custom_data );
}
'</strong> <span class="text">' . $order->get_data() . '</span></div>';
}
但这是一个老套的解决方案,并没有解决为什么信息没有出现在收到的订单页面或直接出现在电子邮件的订单行项目中的根本问题。
【问题讨论】:
-
$order的var_dump向您展示了什么? -
它向我展示了订单数据,但包含以下内容: int(1513) ["key"]=> string(4) "Test" ["value"]=> array(2) { ["label"]=> string(4) "测试" ["value"]=> string(8) "wibble" }
-
尝试添加你的问题,带有钩子的完整功能,因为人们不能总是猜到(你的第一个sn-p)......记住这些问题的答案,需要对每个人都有用.这样,它将帮助您获得更好的答案,并且对其他人有用。
-
公平竞争...现在编辑
-
戴夫,抱歉,这并不是说听起来很简洁……它基本上会在电子邮件中返回整个订单对象,其中包括我想要获取的字段。问题是访问实际数据并显示它(在电子邮件和收到的订单屏幕中)。
标签: php wordpress email woocommerce