以编程方式将可下载文件添加到Woocommerce产品

时间:2018-10-23 17:04:59

标签: php wordpress woocommerce product digital-downloads

在我的解决方案中,我想尽可能地使产品创建自动化。 我认为,一种省时的方法是将可下载文件自动添加到产品中。

我已经创建了此功能:

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界面创建的另一种产品:

enter image description here

woocommerca也不会将其识别为可下载文件。任何解决此问题的帮助都将受到赞赏。

编辑:第二部分

这是要设置的产品标题:

enter image description here

我们必须从图像的EXIF元标记“ title”中获取它,并且在保存产品之前或同时将其设置为产品名称。 ($filemeta['image_meta']['title'];

1 个答案:

答案 0 :(得分:1)

更新2 (添加了一条if语句,允许仅生成一个下载文件

  

以下代码将自动添加由产品图片制成的可下载文件(下载标题来自EXIF数据标题)

您最好以这种方式使用专用的woocommerce_admin_process_product_object动作挂钩和woocommerce 3引入的可用CRUD objects and getters / setters methods

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文件中。经过测试,可以正常工作。

  

您还可以在函数内部启动时在IF语句中使用is_downloadable()方法检查产品是否可下载。