1

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

我创建了这个函数:

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

在此处输入图像描述

它也不被 woocommerca 识别为可下载文件。非常感谢任何有关解决此问题的帮助。

编辑:第二部分

这是要设置的产品标题:

在此处输入图像描述

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

4

1 回答 1

2

更新 2 (添加了一个 if 语句以允许只下载一个文件

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

您应该以这种方式更好地使用 woocommerce 3 引入的专用woocommerce_admin_process_product_object操作挂钩和可用的CRUD 对象和 getter / setter 方法:

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 文件中。测试和工作。

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

于 2018-10-23T18:36:05.157 回答