Кастомное поле с сылкой и миниатюра товара
-
Здравствуйте, сделал для товара кастомное поле загрузки изображения, изображение загружается. Сделал замену миниатюры в корзине и добавил поле, ссылку на изображение, в мини корзине меняется миниатюра и появляется ссылка на изображение, все работает, когда открываешь основную корзину миниатюра пропадает, появляется стандартная от товара, ссылка становиться не кликабельной, а в заказе тоже ссылка не работает
<?php
/*
Plugin Name: Image Upload for Variations
Plugin URI: https://yourwebsite.com/
Description: Плагин для загрузки изображения для вариативных товаров в WooCommerce.
Version: 1.1
Author: Ваше имя
Author URI: https://yourwebsite.com/
Text Domain: image-upload-for-variations
*/
if (!defined('ABSPATH')) {
exit; // Защита от прямого доступа
}
require_once plugin_dir_path(__FILE__) . 'frontend-functions.php';
// Подключаем AJAX и передаём nonce
function enqueue_frontend_assets() {
wp_enqueue_script('upload-field-frontend-js', plugin_dir_url(__FILE__) . 'upload.js', ['jquery'], null, true);
wp_localize_script('upload-field-frontend-js', 'upload_field_ajax', [
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('upload_field_nonce')
]);
}
add_action('wp_enqueue_scripts', 'enqueue_frontend_assets');
// 1. Добавляем поле загрузки изображения на страницу товара
function iuv_add_image_upload_field() {
if (!is_product()) return;
global $post;
$product = wc_get_product($post->ID);
if (!$product) return;
// Получаем артикул товара
$product_sku = $product->get_sku();
// Проверяем, содержит ли артикул "231913022025" (частичное совпадение)
if (strpos($product_sku, '231913022025') !== false) {
?>
<div class="woocommerce-custom-upload">
<label for="custom_image_upload"><?php _e('Upload Image for Printing', 'image-upload-for-variations'); ?></label>
<input type="file" id="custom_image_upload" name="custom_image_upload" accept="image/*">
<button type="button" id="upload_image_button"><?php _e('Upload Image', 'image-upload-for-variations'); ?></button>
<div id="upload_status"></div>
<img id="uploaded_preview" src="" style="max-width: 100px; display: none;">
<input type="hidden" name="uploaded_image_url" id="uploaded_image_url">
</div>
<?php
}
}
add_action('woocommerce_before_add_to_cart_button', 'iuv_add_image_upload_field');
// 2. Обработчик загрузки изображения в WP
function iuv_handle_image_upload() {
check_ajax_referer('upload_field_nonce', 'nonce'); // Проверяем nonce
if (!isset($_FILES['custom_image_upload'])) {
wp_send_json_error(['error' => 'No file uploaded.']);
return;
}
$file = $_FILES['custom_image_upload'];
$upload = wp_handle_upload($file, ['test_form' => false]);
if (isset($upload['error'])) {
wp_send_json_error(['error' => $upload['error']]);
return;
}
if (!isset($upload['url'])) {
wp_send_json_error(['error' => 'Upload failed, no URL returned.']);
return;
}
wp_send_json_success(['url' => esc_url($upload['url'])]);
}
add_action('wp_ajax_iuv_upload_image', 'iuv_handle_image_upload');
add_action('wp_ajax_nopriv_iuv_upload_image', 'iuv_handle_image_upload');
function iuv_add_uploaded_image_to_cart($cart_item_data, $product_id) {
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['uploaded_image_url'])) {
error_log('Uploaded image URL: ' . $_POST['uploaded_image_url']);
$cart_item_data['custom_image'] = esc_url_raw($_POST['uploaded_image_url']);
}
return $cart_item_data;
}
add_filter('woocommerce_add_cart_item_data', 'iuv_add_uploaded_image_to_cart', 10, 2);
function get_cart_item_from_session($cart_item, $values) {
if (isset($values['custom_image'])) {
error_log('Session custom_image: ' . $values['custom_image']);
$cart_item['custom_image'] = esc_url_raw($values['custom_image']);
}
return $cart_item;
}
add_filter('woocommerce_get_cart_item_from_session', 'get_cart_item_from_session', 10, 2);
function iuv_replace_cart_thumbnail($product_image, $cart_item, $cart_item_key) {
if (!empty($cart_item['custom_image'])) {
error_log('Replacing thumbnail for item ' . $cart_item_key . "old ".$product_image . 'new <img src="' . esc_url($cart_item['custom_image']) . '" alt="Uploaded Image" style="max-width: 60px; height: auto; object-fit: cover;">');
return '<img src="' . esc_url($cart_item['custom_image']) . '" alt="Uploaded Image" style="max-width: 60px; height: auto; object-fit: cover;">';
}
return $product_image;
}
add_filter('woocommerce_cart_item_thumbnail', 'iuv_replace_cart_thumbnail', 99, 3);
function iuv_display_uploaded_image_in_cart($item_data, $cart_item) {
if (!empty($cart_item['custom_image'])) {
error_log('Adding image link to cart item data'); // Логируем добавление
$item_data[] = array(
'key' => __('Uploaded Image', 'image-upload-for-variations'),
'value' => '<a href="' . esc_url($cart_item['custom_image']) . '" target="_blank">' . __('View Image', 'image-upload-for-variations') . '</a>',
'display' => '<a href="' . esc_url($cart_item['custom_image']) . '" target="_blank">' . __('View Image', 'image-upload-for-variations') . '</a>'
);
}
return $item_data;
}
add_filter('woocommerce_get_item_data', 'iuv_display_uploaded_image_in_cart', 5, 2);
// 5. Сохраняем изображение в заказе
function iuv_save_uploaded_image_in_order($item, $cart_item_key, $values, $order) {
if (!empty($values['custom_image'])) {
$item->add_meta_data('Изображение', '<a href="' . esc_url($values['custom_image']) . '" target="_blank">Посмотреть</a>');
}
}
add_action('woocommerce_checkout_create_order_line_item', 'iuv_save_uploaded_image_in_order', 10, 4);
function iuv_display_uploaded_image_in_order($item_id, $item, $order) {
$uploaded_image = $item->get_meta('Uploaded Image');
if (!empty($uploaded_image)) {
echo '<p><strong>Загруженное изображение:</strong><br><img src="' . esc_url($uploaded_image) . '" style="max-width: 60px; height: auto;"></p>';
}
}
add_action('woocommerce_order_item_meta_end', 'iuv_display_uploaded_image_in_order', 10, 3);
Просмотр 2 ответов — с 1 по 2 (всего 2)
Просмотр 2 ответов — с 1 по 2 (всего 2)
- Для ответа на тему необходимо авторизоваться.