Добавить программно загружаемый файл в продукты Woocommerce

В своем решении я хочу максимально автоматизировать создание продукта.
По моему мнению, экономия времени заключается в автоматическом добавлении загружаемого файла в продукт.

Я создал эту функцию:

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:

введите описание изображения здесь

Woocommerca также не распознает его как загружаемый файл. Любая помощь по исправлению этого очень ценится.

РЕДАКТИРОВАТЬ: Часть вторая

Это название продукта, которое будет установлено:

введите описание изображения здесь

Мы должны получить его из мета-тэга EXIF ​​«title» на изображении, чтобы оно было установлено в качестве имени продукта до или во время сохранения продукта. ($filemeta['image_meta']['title'];)

1

Решение

Обновление 2 (Добавлен оператор if, чтобы разрешить генерацию загрузки только в один файл)

Следующий код автоматически добавит загружаемый файл из изображения продукта (Заголовок загрузки происходит из заголовка данных EXIF).

Вы должны лучше использовать выделенный woocommerce_admin_process_product_object действие крюк и доступны CRUD объекты и методы получения / установки познакомился с woocommerce 3 следующим образом:

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 вашей активной дочерней темы (или активной темы). Проверено и работает.

Вы также можете проверить, можно ли загрузить продукт, используя is_downloadable() метод в IF Заявление о запуске внутри функции.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]