Php 在WooCommerce电子邮件通知上显示自定义产品图像
我正在尝试修改自动生成的WooCommerce订单电子邮件中的产品图像。请注意,我尝试使用钩子来实现这一点,而不是创建一个修改过的电子邮件模板 首先,我在单一产品页面上有一个隐藏的输入。我有一些JS设置图像的ID,它基于产品的颜色(我用ACF制作的自定义属性) 这很好,但我很难按顺序复制电子邮件。到目前为止,我遇到了以下几点。这会在电子邮件中显示图像,但这是产品的特色图像。值得注意的是,“show_image”键被设置为truePhp 在WooCommerce电子邮件通知上显示自定义产品图像,php,wordpress,image,woocommerce,email-notifications,Php,Wordpress,Image,Woocommerce,Email Notifications,我正在尝试修改自动生成的WooCommerce订单电子邮件中的产品图像。请注意,我尝试使用钩子来实现这一点,而不是创建一个修改过的电子邮件模板 首先,我在单一产品页面上有一个隐藏的输入。我有一些JS设置图像的ID,它基于产品的颜色(我用ACF制作的自定义属性) 这很好,但我很难按顺序复制电子邮件。到目前为止,我遇到了以下几点。这会在电子邮件中显示图像,但这是产品的特色图像。值得注意的是,“show_image”键被设置为true // Add prod IMG to e-mails functi
// Add prod IMG to e-mails
function jwd_add_images_woocommerce_emails( $output, $order ) {
// set a flag so we don't recursively call this filter
static $run = 0;
// if we've already run this filter, bail out
if ( $run ) {
return $output;
}
$args = array(
'show_image' => true,
//'image_size' => array( 300, 300 ),
'image_size' => 'full',
);
// increment our flag so we don't run again
$run++;
// if first run, give WooComm our updated table
return wc_get_email_order_items($order, $args);
}
add_filter( 'woocommerce_email_order_items_table', 'jwd_add_images_woocommerce_emails', 10, 2 );
为了修改图像,我找到了这个过滤器,但是我很难弄清楚我需要做什么来复制我在购物车页面上所做的。我得到的最接近的数据是$item_data
工作,我确实在var转储中看到了产品colimg id
键,尽管它位于受保护的对象中,我不确定如何访问它。即使我可以访问,我也不知道如何从这里设置图像
add_filter('woocommerce_order_item_thumbnail', 'jwd_add_colour_img', 10, 2);
function jwd_add_colour_img($image, $item) {
$item_id = $item->get_id();
//var_dump($item->get_current_data());
$product = $item->get_product();
$product_id = $item->get_product_id();
$item_data = $item->get_data();
$col_img_id = false;
$item->set_image_id(1);
foreach ($item_data as $key => $item) {
//current_data
var_dump($item);
//echo "<br><br>";
$col_img_id = $item['product-col-img-id'] ?? false;
if ($col_img_id) {
break;
}
}
//var_dump($col_img_id);
//$item_id = $item->get_product_id();
//var_dump(wc_get_order_item_meta( $item_id, 'col_img_id', true ) );
return $image;
}
add_filter('woocommerce_order_item_缩略图,'jwd_add_color_img',10,2);
功能jwd\u添加\u颜色\u img($image,$item){
$item_id=$item->get_id();
//变量转储($item->get_current_data());
$product=$item->get_product();
$product_id=$item->get_product_id();
$item_data=$item->get_data();
$col\u img\u id=false;
$item->set_image_id(1);
foreach($item_数据为$key=>$item){
//当前数据
var_dump(项目);
//回声“
”;
$col\u img\u id=$item['product-col-img-id']??错误;
如果($col\u img\u id){
打破
}
}
//变量转储($col\u img\u id);
//$item_id=$item->get_product_id();
//var_dump(wc_get_order_item_meta($item_id,'col_img_id',true));
返回$image;
}
要获取自定义元数据,可以使用WC\u data
方法get\u meta()
请尝试以下操作以在电子邮件通知中显示自定义图像:
// Save custom image ID as order item meta
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_image_id_to_order_item', 10, 4 );
function save_custom_image_id_to_order_item( $item, $cart_item_key, $values, $order ) {
if ( isset($values['product-colour']) && ! empty($values['product-colour']) ) {
$item->add_meta_data('Colour', $values['product-colour'] );
}
if ( isset($values['product-col-img-id']) && ! empty($values['product-col-img-id']) ) {
$item->add_meta_data('_col_img_id', $values['product-col-img-id'] );
}
}
// (optional) Force display item image on emails
add_filter( 'woocommerce_email_order_items_args', 'show_image_on_email_notifications' );
function show_image_on_email_notifications( $args ) {
$args['show_image'] = true;
return $args;
}
// Display custom image on emails
add_filter( 'woocommerce_order_item_thumbnail', 'display_email_order_item_custom_image', 10, 2 );
function display_email_order_item_custom_image( $image, $item ) {
// Only on email notifications
if( is_wc_endpoint_url() )
return $image;
$image_id = $item->get_meta('_col_img_id');
if( $image_id ) {
$image = wp_get_attachment_image( $image_id, array( 32, 32 ), false, array() );
}
return $image;
}
代码进入活动子主题(或活动主题)的functions.php文件。应该能用。谢谢!!!哇,我太接近了,关键是使用了get_meta()函数并在标签前面添加了下划线(这样它就不会显示在电子邮件前端)。天啊,我发现很难找到解释这类事情的文档。您是如何知道$item参数是WC_数据类并具有get_Data()方法的?另外,感谢您显示woocommerce_email_order_items_args过滤器,这是一个很好的操作,简化了我在其他地方使用的内容。那个有一个防止重复的标志,但我想有了这个,就可以不这样做了?还有x2,使用isset除了空的必要吗?我刚用过!“空的,看起来工作正常。@JordanCarter真正的文档是WooCommerce源代码。我知道这一切,因为我是一名WooCommerce开发人员,已经有6到7年了(我从WooCommerce 2.4版开始)。使用
isset()
是必要的,因为如果所需的购物车项目自定义字段不存在,您将得到一个错误,empty()
将无法避免…因此始终首先使用isset()
。天哪,这必须是经验使然。再看一眼,我想我找到了wc_get_email_order_items函数(我看到它使用了您指出的woocommerce_email_order_items_args过滤器),这是一条正确的道路。我想下一步是研究$order->get\u items()方法。它看起来就像一个大兔子洞的代码哈哈。再次感谢你的帮助!保持安全,好好休息一天。
add_filter('woocommerce_order_item_thumbnail', 'jwd_add_colour_img', 10, 2);
function jwd_add_colour_img($image, $item) {
$item_id = $item->get_id();
//var_dump($item->get_current_data());
$product = $item->get_product();
$product_id = $item->get_product_id();
$item_data = $item->get_data();
$col_img_id = false;
$item->set_image_id(1);
foreach ($item_data as $key => $item) {
//current_data
var_dump($item);
//echo "<br><br>";
$col_img_id = $item['product-col-img-id'] ?? false;
if ($col_img_id) {
break;
}
}
//var_dump($col_img_id);
//$item_id = $item->get_product_id();
//var_dump(wc_get_order_item_meta( $item_id, 'col_img_id', true ) );
return $image;
}
// Save custom image ID as order item meta
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_image_id_to_order_item', 10, 4 );
function save_custom_image_id_to_order_item( $item, $cart_item_key, $values, $order ) {
if ( isset($values['product-colour']) && ! empty($values['product-colour']) ) {
$item->add_meta_data('Colour', $values['product-colour'] );
}
if ( isset($values['product-col-img-id']) && ! empty($values['product-col-img-id']) ) {
$item->add_meta_data('_col_img_id', $values['product-col-img-id'] );
}
}
// (optional) Force display item image on emails
add_filter( 'woocommerce_email_order_items_args', 'show_image_on_email_notifications' );
function show_image_on_email_notifications( $args ) {
$args['show_image'] = true;
return $args;
}
// Display custom image on emails
add_filter( 'woocommerce_order_item_thumbnail', 'display_email_order_item_custom_image', 10, 2 );
function display_email_order_item_custom_image( $image, $item ) {
// Only on email notifications
if( is_wc_endpoint_url() )
return $image;
$image_id = $item->get_meta('_col_img_id');
if( $image_id ) {
$image = wp_get_attachment_image( $image_id, array( 32, 32 ), false, array() );
}
return $image;
}