Acest articol descrie implementarea unui sistem personalizat pentru gestionarea lungimii totale a unui produs și a lungimii părților componente, util pentru magazinele care vând produse la bară sau la rolă (de exemplu, cabluri, țevi sau textile). Funcționalitatea permite clienților să specifice lungimea dorită pentru prima parte, verificând automat lungimea rămasă și afișând mesaje personalizate.
Funcționalitățile codului
- Adăugarea unui câmp personalizat pentru lungimea totală a produsului în pagina de editare a produsului.
- Afișarea unui câmp personalizat pe pagina produsului pentru introducerea lungimii primei părți.
- Validarea lungimii specificate de client, cu limite maxime și minime, inclusiv limitări specifice firmelor de curierat.
- Afișarea lungimii rămase și a mesajelor de avertizare.
- Salvarea și afișarea valorilor personalizate în coș, comenzi și emailuri.
Codul complet
Adaugă următorul cod în fișierul functions.php
al temei active sau într-un plugin personalizat:
// Adăugarea câmpurilor personalizate în pagina de editare a produsului
add_action('woocommerce_product_options_general_product_data', 'add_custom_general_fields');
function add_custom_general_fields() {
global $woocommerce, $post;
echo '<div class="options_group">';
woocommerce_wp_text_input(
array(
'id' => '_total_length',
'label' => __('Lungime Totală (m)', 'woocommerce'),
'desc_tip' => 'true',
'description' => __('Introduceți lungimea totală a produsului în metri (de exemplu, 4 metri).', 'woocommerce'),
'type' => 'number',
'custom_attributes' => array(
'step' => '0.01',
'min' => '0'
)
)
);
echo '</div>';
}
// Salvarea valorilor câmpurilor personalizate
add_action('woocommerce_process_product_meta', 'save_custom_general_fields');
function save_custom_general_fields($post_id) {
$total_length = isset($_POST['_total_length']) ? sanitize_text_field($_POST['_total_length']) : '';
update_post_meta($post_id, '_total_length', $total_length);
}
// Afișarea câmpurilor personalizate pe pagina produsului
add_action('woocommerce_before_add_to_cart_button', 'display_custom_product_fields');
function display_custom_product_fields() {
global $post;
$total_length = get_post_meta($post->ID, '_total_length', true);
if ($total_length) {
echo '<div class="product_custom_fields">';
echo '<label for="part_length">' . __('Introduceți lungimea primei părți (m):', 'woocommerce') . '</label>';
echo '<input type="number" id="part_length" name="part_length" step="0.01" min="0" max="3" required>';
echo '<p id="remaining_length">' . __('Lungimea rămasă din bară: ', 'woocommerce') . $total_length . ' m</p>';
echo '<p id="curier_limit_message" style="color: red; display: none;">' . __('Limita maximă acceptată de firma de curierat pentru o singură parte este de 3 metri.', 'woocommerce') . '</p>';
echo '</div>';
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
var totalLength = <?php echo esc_js($total_length); ?>;
$('#part_length').on('input', function() {
var partLength = parseFloat($(this).val());
var remainingLength = totalLength - partLength;
if (partLength > 3) {
$('#curier_limit_message').show();
} else {
$('#curier_limit_message').hide();
}
if (!isNaN(remainingLength) && remainingLength >= 0) {
$('#remaining_length').text('<?php echo __('Lungimea rămasă din bară: ', 'woocommerce'); ?>' + remainingLength.toFixed(2) + ' m');
} else {
$('#remaining_length').text('<?php echo __('Lungimea rămasă din bară: ', 'woocommerce'); ?>' + totalLength + ' m');
}
});
});
</script>
<?php
}
}
// Validarea câmpului personalizat înainte de adăugarea în coș
add_filter('woocommerce_add_to_cart_validation', 'validate_custom_product_fields', 10, 3);
function validate_custom_product_fields($passed, $product_id, $quantity) {
if (isset($_POST['part_length'])) {
$part_length = floatval($_POST['part_length']);
$total_length = floatval(get_post_meta($product_id, '_total_length', true));
if ($part_length <= 0 || $part_length > 3) {
wc_add_notice(__('Lungimea primei părți trebuie să fie mai mare decât 0 și nu poate depăși 3 metri.', 'woocommerce'), 'error');
return false;
}
if ($part_length > $total_length) {
wc_add_notice(__('Lungimea primei părți nu poate depăși lungimea totală a produsului.', 'woocommerce'), 'error');
return false;
}
}
return $passed;
}
// Salvarea valorilor personalizate în coș
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 3);
function add_custom_cart_item_data($cart_item_data, $product_id, $variation_id) {
if (isset($_POST['part_length'])) {
$cart_item_data['part_length'] = floatval($_POST['part_length']);
$cart_item_data['remaining_length'] = floatval(get_post_meta($product_id, '_total_length', true)) - $cart_item_data['part_length'];
}
return $cart_item_data;
}
// Afișarea valorilor personalizate în coș și în pagina de comandă
add_filter('woocommerce_get_item_data', 'display_custom_item_data', 10, 2);
function display_custom_item_data($item_data, $cart_item) {
if (isset($cart_item['part_length'])) {
$item_data[] = array(
'key' => __('Lungimea primei părți (m)', 'woocommerce'),
'value' => wc_clean($cart_item['part_length']),
);
$item_data[] = array(
'key' => __('Lungimea rămasă (m)', 'woocommerce'),
'value' => wc_clean($cart_item['remaining_length']),
);
}
return $item_data;
}
Rezultat
După implementarea acestui cod:
- Clienții pot introduce lungimea primei părți a unui produs.
- Lungimea rămasă este calculată și afișată automat.
- Mesajele de eroare și limitările curierului sunt afișate dinamic.
- Datele sunt salvate în coș, comandă și emailuri.
Concluzie
Acest sistem este ideal pentru magazinele care gestionează produse la bară sau la rolă, oferind o experiență personalizată și claritate pentru clienți.