Puedes extender el wp.Uploader
Evento javascript para obtener datos de respuesta de archivos adjuntos cargados.
Usando este javascript a continuación, si la página es /wp-admin/upload.php
y cuando cada archivo adjunto termine de procesarse, se activará una solicitud ajax para crear productos de Woocommerce.
// document ready
(function($) {
// if pagenow is upload
if(pagenow === 'upload') {
// extend uploader lister
$.extend(wp.Uploader.prototype, {
success: function (attachment) {
// console our attachment attributes data
console.log(attachment.attributes);
// jquery ajax call
$.ajax({
cache: false,
timeout: 300000, // 5 hours
url: ajaxurl,
method: 'GET',
data: {
action: 'media_upload_generate_product',
author_id: attachment.attributes.author,
attachment_id: attachment.attributes.id,
filename: attachment.attributes.filename,
title: attachment.attributes.title,
type: attachment.attributes.type
},
success: function (response) {
// log our response
console.log(response);
},
error: function (response) {
// log our response
console.log(response.data.message);
}
}).done(function (response) {
// log our response
console.log(response);
});
}
});
}
})(jQuery);
Deberá poner en cola el javascript anterior agregando esto a su functions.php
solo necesita asegurarse de que las URL de su directorio apunten a la ubicación correcta del archivo js …
// enqueue js and css dist
add_action('admin_enqueue_scripts', 'enqueue_js_css', 5);
// enqueue js and css dist
function enqueue_js_css() {
// re-register jquery
$filename = get_stylesheet_directory_uri() . '/dist/js/admin.js';
$filepath = get_stylesheet_directory() . '/dist/js/admin.js';
wp_register_script('admin',$filename,[],filemtime($filepath),true);
// enqueue jquery
wp_enqueue_script('admin');
}
No queremos que esto funcione para cada imagen que cargue en la biblioteca de medios. Solo queremos que esto funcione para sus imágenes pintadas. Así que usamos algo de PHP para filtrar y ejecutar las acciones correctas a través de nuestra llamada ajax anterior.
Entonces tienes dos tipos de imagen, una es Paint Color
y el otro es Paint Brush
Si te aseguras de todo Paint Color
las imágenes comienzan con paintcolor_
y todos los espacios se reemplazan con un guión bajo _
por ejemplo…
paintcolor_maximum_yellow_red.png
paintcolor_quinacridone_magenta.png
paintcolor_quinacridone_magenta.png
paintcolor_ruby.png
paintcolor_sky_blue_crayola.png
paintcolor_teal.png
Entonces lo mismo para Paint Brush
imágenes, asegúrese de que empiecen por empezar por paintcolor_
etc…
paintbrush_maximum_yellow_red.png
paintbrush_quinacridone_magenta.png
paintbrush_quinacridone_magenta.png
paintbrush_ruby.png
paintbrush_sky_blue_crayola.png
paintbrush_teal.png
Desea adjuntar dos imágenes a un producto de woocommerce. Lo que significa que necesita dos campos personalizados de imagen o un solo campo personalizado de galería. Mi código de ejemplo a continuación muestra el uso de dos campos de imagen ACF…
https://i.stack.imgur.com/DxCXk.png
Bien, aquí está el PHP para manejar el archivo adjunto cargado, si lee mis comentarios en el código, es realmente sencillo. Esto tiene que ir en tu functions.php
también.
// media upload generate product ajax actions
add_action('wp_ajax_nopriv_media_upload_generate_product', 'ajax_media_upload_generate_product', 20);
add_action('wp_ajax_media_upload_generate_product', 'ajax_media_upload_generate_product', 20);
// media upload generate product ajax function
function ajax_media_upload_generate_product() {
// get our passed variables
$author_id = (int)$_GET['author_id'];
$attachment_id = (int)$_GET['attachment_id'];
$filename = (string)$_GET['filename'];
$title = (string)$_GET['title'];
$type = (string)$_GET['type'];
// check if file title starts with paintcolor_
// so we will only run and process images and convert to products if file name starts with paintcolor_
if(substr($title, 0, 11) === 'paintcolor_') {
// create our paint color product title
// strip paintcolor_ from string
$title = str_replace('paintcolor_', '', $title);
// explode underscores for paint color titles then implode title parts with a space seperator and then uppercase each word
$title = ucwords(implode(' ', explode('_', $title)));
// chech to see if paint colour product already exists
$paint_color = get_page_by_path(sanitize_title($title), OBJECT, 'product');
// if paint color is not an object, therefore paint colour has not already been created
if(!is_object($paint_color)) {
// set our new product using WC_Product_Simple
$product = new WC_Product_Simple();
// build our new woocommerce product using the uploaded attachment data
$product->set_name($title);
$product->set_status('publish');
$product->set_catalog_visibility('visible');
$product->set_price(19.99);
$product->set_regular_price(19.99);
$product->set_sold_individually(true);
$product->set_image_id($attachment_id);
$product->set_downloadable(true);
$product->set_virtual(true);
// store current attachment data
$src_img = wp_get_attachment_image_src($attachment_id, 'full');
$file_url = reset($src_img);
$file_md5 = md5($file_url);
// start new product download using WC_Product_Download
$download = new WC_Product_Download();
$download->set_name('Paint Color ' . $title);
$download->set_id($file_md5);
$download->set_file($file_url);
// add new WC_Product_Download to downloads array
$downloads[$file_md5] = $download;
// finishing setting downloads and finally save product
$product->set_downloads($downloads);
$product->save();
// add paint color image to paint color acf image field
update_field('paint_color',$attachment_id,$product->get_id());
// send json success response
wp_send_json_success((array)$product);
} else {
// force delete duplicate media item
wp_delete_post($attachment_id,true);
// send json error response
wp_send_json_error(['message' => 'Paint color ' + $title + ' product already exist! Attachment has been deleted.']);
}
// check if file title starts with paintbrush_
// so we will only run and process images if file name starts with paintbrush_
} elseif(substr($title, 0, 11) === 'paintbrush_') {
// create our paint color product title
// strip paintbrush_ from string
$title = str_replace('paintbrush_', '', $title);
// explode underscores for paint color titles then implode title parts with a space seperator and then uppercase each word
$title = ucwords(implode(' ', explode('_', $title)));
// chech to see if paint color already exists
$paint_color = get_page_by_path(sanitize_title($title), OBJECT, 'product');
// if paint color is an object, therefore paint color has already been created
// and paint color object has property ID
if(is_object($paint_color) && property_exists($paint_color,'ID')) {
// get our existing product using WC_Product_Simple
$product = new WC_Product_Simple($paint_color->ID);
// store current attachment data
$src_img = wp_get_attachment_image_src($attachment_id, 'full');
$file_url = reset($src_img);
$file_md5 = md5($file_url);
// get current downloads
$downloads = $product->get_downloads('edit');
// start new product download using WC_Product_Download
$download = new WC_Product_Download();
$download->set_name('Paint Brush ' . $title);
$download->set_id($file_md5);
$download->set_file($file_url);
// add new WC_Product_Download to downloads array
$downloads[$file_md5] = $download;
// finishing setting downloads and finally save product
$product->set_downloads($downloads);
$product->save();
// add paint brush image to paint brush acf image field
update_field('paint_brush',$attachment_id,$paint_color->ID);
} else {
// force delete duplicate media item
wp_delete_post($attachment_id,true);
// send json error response
wp_send_json_error(['message' => 'Paint brush color ' + $title + ' product does not exist yet so cannot add attachment to ACF paint brush field. This attachment has been deleted.']);
}
} else {
// send json error response
wp_send_json_error(['message' => 'Cannot generate product because filename does not start with `paintcolor_`']);
}
// death becomes us
die();
}
Obviamente, deberá modificar la forma en que maneja los precios y otros datos de productos de Woocommerce. He puesto algunas opciones en el $product
y descargas incluidas también.
He probado esto y funciona.
También maneja los duplicados y elimina el archivo adjunto si ya existe un archivo adjunto con el mismo nombre.
Debes subir todos tus paintcolor_
primero las imágenes, para que paintbrush_
imágenes para tener un wooproduct para adjuntar también.
Imágenes que usé para probar… https://imgur.com/a/RhQWAjO
.