Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在WooCommerce电子邮件通知上显示自定义产品图像_Php_Wordpress_Image_Woocommerce_Email Notifications - Fatal编程技术网

Php 在WooCommerce电子邮件通知上显示自定义产品图像

Php 在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

我正在尝试修改自动生成的WooCommerce订单电子邮件中的产品图像。请注意,我尝试使用钩子来实现这一点,而不是创建一个修改过的电子邮件模板

首先,我在单一产品页面上有一个隐藏的输入。我有一些JS设置图像的ID,它基于产品的颜色(我用ACF制作的自定义属性)

这很好,但我很难按顺序复制电子邮件。到目前为止,我遇到了以下几点。这会在电子邮件中显示图像,但这是产品的特色图像。值得注意的是,“show_image”键被设置为true

// 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;
}