以编程方式将可下载文件添加到 Woocommerce 产品
在我的解决方案中,我希望尽可能自动化产品创建.在我看来,一种节省时间的方法是将可下载文件自动添加到产品中.
In my solution I want to automate the product creation as much as possible. One time saver is, in my opinion, to auto add the downloadable file to the product.
我创建了这个函数:
function fcsp_add_downloadable_file($post_id, $post, $update){
$post_thumbnail_id = get_post_thumbnail_id( $post_id );
$url = get_site_url()."/wp-content/uploads/".get_the_date('Y')."/".get_the_date('m')."/".$filename_only = basename( get_attached_file( $post_thumbnail_id ) );
update_post_meta($post_id, '_downloadable_files' , $url);
}
add_action( 'save_post', 'fcsp_add_downloadable_file', 99, 3 );
当我更新产品时,我可以看到文件路径已保存到 _downloadable_files 元键.然而,它只是纯文本,而不是 woocommerce 存储它的方式.查看屏幕截图(这是使用 Woo Add Product 界面创建的另一个产品:
I can see when I update the product that the file path is saved to the _downloadable_files meta key. However it is just plain text and not in the way woocommerce stores it. See screenshot (this is from another product created with the Woo Add Product interface:
它也未被 woocommerca 识别为可下载文件.非常感谢您对解决此问题的任何帮助.
It is also not recognized by woocommerca as a downloadable file. Any help on fixing this is much appreciated.
第二部分
这是要设置的产品标题:
This is the product title to be set:
我们必须从图像的 EXIF 元标记标题"中获取它,并且必须在保存产品之前或保存产品时将其设置为产品名称.($filemeta['image_meta']['title'];
)
We have to get it from the EXIF meta tag "title" from the image and has te be set as the product name before or while saving the product. ($filemeta['image_meta']['title'];
)
推荐答案
Update 2 (添加了 if 语句以允许下载生成仅到一个文件)
以下代码将自动添加由产品图片制作的可下载文件(下载标题来自 EXIF 数据标题).
The following code will auto add a downloadable file made from the product image (The download title comes from the EXIF data title).
您最好使用专用的 woocommerce_admin_process_product_object
动作挂钩和可用的 CRUD 对象和 getter/setter 方法 woocommerce 3 以这种方式引入:
You should better use dedicated woocommerce_admin_process_product_object
action hook and available CRUD objects and getters / setters methods introduced with woocommerce 3 this way:
add_action( 'woocommerce_admin_process_product_object', 'auto_add_downloadable_file', 50, 1 );
function auto_add_downloadable_file( $product ){
// Get downloads (if there is any)
$downloads = (array) $product->get_downloads();
// Only added once (avoiding repetitions
if( sizeof($downloads) == 0 ){
// Get post thumbnail data
$thumb_id = get_post_thumbnail_id( $product->get_id() );
$src_img = wp_get_attachment_image_src( $thumb_id, 'full');
$img_meta = wp_get_attachment_metadata( $thumb_id, false );
// Prepare download data
$file_title = $img_meta['image_meta']['title'];
$file_url = reset($src_img);
$file_md5 = md5($file_url);
$download = new WC_Product_Download(); // Get an instance of the WC_Product_Download Object
// Set the download data
$download->set_name($file_title);
$download->set_id($file_md5);
$download->set_file($file_url);
$downloads[$md5_num] = $download; // Insert the new download to the array of downloads
$product->set_downloads($downloads); // Set new array of downloads
}
}
代码位于活动子主题(或活动主题)的 function.php 文件中.经测试有效.
Code goes in function.php file of your active child theme (or active theme). Tested and works.
您还可以使用 is_downloadable 检查产品是否可下载()
方法在函数内部启动时的 IF
语句中.
You could also check if product is downloadable using
is_downloadable()
method in anIF
statement on start inside the function.
相关文章