În acest articol, vom implementa o funcționalitate personalizată pentru WooCommerce, care permite adăugarea lungimii unei role și a prețului pe metru liniar. Calculul prețului total al rolei se va face automat și va fi afișat pe pagina produsului, dar și în coșul de cumpărături.
Funcționalitățile codului
- Adaugă un câmp pentru lungimea rolei (în metri) în pagina de editare a produsului.
- Adaugă un câmp pentru prețul pe metru liniar (lei) în pagina de editare a produsului.
- Salvează valorile acestor câmpuri pentru fiecare produs.
- Calculează automat prețul total al rolei pe baza lungimii și a prețului pe metru liniar.
- Afișează prețul total al rolei pe pagina produsului și în coșul de cumpărături.
- Stilizează afișarea prețului total al rolei pentru a fi mai vizibil.
Codul complet
Adaugă următorul cod în fișierul functions.php
al temei tale active sau într-un plugin personalizat:
// Adaugă câmpul pentru lungimea rolei
add_action('woocommerce_product_options_general_product_data', 'add_custom_length_field');
function add_custom_length_field() {
woocommerce_wp_text_input(
array(
'id' => '_roll_length',
'label' => __('Lungimea rolei (m)', 'woocommerce'),
'desc_tip' => 'true',
'description' => __('Introdu lungimea rolei în metri', 'woocommerce'),
'type' => 'number',
'custom_attributes' => array(
'step' => '0.01',
'min' => '0'
)
)
);
}
// Salvează lungimea rolei
add_action('woocommerce_process_product_meta', 'save_custom_length_field');
function save_custom_length_field($post_id) {
$roll_length = isset($_POST['_roll_length']) ? sanitize_text_field($_POST['_roll_length']) : '';
update_post_meta($post_id, '_roll_length', $roll_length);
}
// Adaugă câmpul pentru prețul pe metru liniar
add_action('woocommerce_product_options_general_product_data', 'add_custom_price_per_ml_field');
function add_custom_price_per_ml_field() {
woocommerce_wp_text_input(
array(
'id' => '_price_per_ml',
'label' => __('Preț pe metru liniar (lei)', 'woocommerce'),
'desc_tip' => 'true',
'description' => __('Introdu prețul pe metru liniar', 'woocommerce'),
'type' => 'number',
'custom_attributes' => array(
'step' => '0.01',
'min' => '0'
)
)
);
}
// Salvează prețul pe metru liniar
add_action('woocommerce_process_product_meta', 'save_custom_price_per_ml_field');
function save_custom_price_per_ml_field($post_id) {
$price_per_ml = isset($_POST['_price_per_ml']) ? sanitize_text_field($_POST['_price_per_ml']) : '';
update_post_meta($post_id, '_price_per_ml', $price_per_ml);
}
// Calculează prețul total al rolei în coș
add_action('woocommerce_before_calculate_totals', 'update_product_price_in_cart');
function update_product_price_in_cart($cart_object) {
foreach ($cart_object->get_cart() as $cart_item) {
$product_id = $cart_item['product_id'];
$roll_length = get_post_meta($product_id, '_roll_length', true);
$price_per_ml = get_post_meta($product_id, '_price_per_ml', true);
if ($roll_length > 0 && $price_per_ml > 0) {
$total_price = $roll_length * $price_per_ml;
$cart_item['data']->set_price($total_price);
}
}
}
// Afișează prețul total al rolei pe pagina produsului
add_action('woocommerce_single_product_summary', 'display_total_price_per_roll', 25);
function display_total_price_per_roll() {
global $product;
$roll_length = get_post_meta($product->get_id(), '_roll_length', true);
$price_per_ml = get_post_meta($product->get_id(), '_price_per_ml', true);
if ($roll_length > 0 && $price_per_ml > 0) {
$total_price = $roll_length * $price_per_ml;
echo '<p class="highlighted-price">' . __('Preț total rolă: ', 'woocommerce') . wc_price($total_price) . '</p>';
}
}
// Stilizează afișarea prețului total al rolei
add_action('wp_head', 'custom_css_for_product_price');
function custom_css_for_product_price() {
?>
<style>
.highlighted-price {
font-size: 18px; /* Mărimea textului */
color: #333; /* Culoarea textului */
font-weight: bold; /* Îngroșarea textului */
padding: 10px; /* Spațiu în jurul textului */
border: 1px dashed #333; /* Linie punctată ca chenar */
border-radius: 5px; /* Colțuri rotunjite */
display: inline-block; /* Afișăm ca bloc pentru a gestiona mai bine spațiul */
}
</style>
<?php
}
Explicația codului
- Adăugarea câmpurilor personalizate
- Lungimea rolei și prețul pe metru liniar sunt definite folosind funcția
woocommerce_wp_text_input
și salvate în meta datele produsului cuupdate_post_meta
.
- Lungimea rolei și prețul pe metru liniar sunt definite folosind funcția
- Calcularea prețului total
- Filtrul
woocommerce_before_calculate_totals
calculează prețul total al rolei pe baza lungimii și a prețului pe metru liniar și actualizează prețul în coșul de cumpărături.
- Filtrul
- Afișarea prețului total
- Prețul total este afișat pe pagina produsului utilizând acțiunea
woocommerce_single_product_summary
.
- Prețul total este afișat pe pagina produsului utilizând acțiunea
- Stilizarea prețului total
- Stilurile CSS personalizate sunt adăugate pentru a evidenția prețul total.
Rezultat
După implementarea acestui cod, utilizatorii vor vedea prețul total al rolei calculat automat, atât pe pagina produsului, cât și în coșul de cumpărături.
Concluzie
Această funcționalitate este ideală pentru magazinele care vând produse la rolă, cum ar fi textile, materiale plastice sau cabluri. Implementarea este simplă și îmbunătățește claritatea informațiilor pentru clienți.