Ten poradnik wytłumaczy Ci, jak za darmo możesz przystosować sklep na Woocommerce pod nową dyrektywę Omnibus bez stosowania dodatkowych wtyczek. Rozwiązanie, które proponujemy jest dedykowane dla osób zaawansowanych. Jeśli nie rozumiesz na czym polega, odezwij się do nas, pomożemy Ci je w bezpieczny sposób wdrożyć.
Dyrektywa Omnibus Woocommerce- Jakie zmiany wprowadza Dyrektywa Omnibus?
Dyrektywa Omnibus (Dyrektywa Parlamentu Europejskiego i Rady (UE) 2019/2161 z dnia 27 listopada 2019 r. uzupełniająca dyrektywę Rady 2005/29/WE w sprawie nieuczciwych praktyk handlowych) wprowadza kilka istotnych zmian w zakresie ochrony konsumentów. Wśród najważniejszych zmian znajdują się:
- rozszerzenie zakresu dyrektywy dotyczącej nieuczciwych praktyk handlowych na przedsiębiorców zajmujących się sprzedażą produktów i usług na odległość oraz sprzedażą w miejscach publicznych,
- wprowadzenie nowych obowiązków dla przedsiębiorców dotyczących przedstawiania informacji o cenach, w tym informowanie konsumentów o kosztach dostawy i płatności oraz uwzględnianie podatków i opłat,
- wprowadzenie nowych zasad dotyczących obniżek cen, w tym wymogu informowania konsumentów o pierwotnej cenie produktu przed obniżką,
- rozszerzenie kompetencji organów odpowiedzialnych za egzekwowanie przepisów dotyczących nieuczciwych praktyk handlowych. Dyrektywa ta wymaga od państw członkowskich wprowadzenia jej postanowień do swojego prawodawstwa krajowego do 28 listopada 2021 r. Jednak w Polsce zaczęła obowiązywać od 1 stycznia 2023 r.
Wszystkie szczegóły związane z dyrektywą znajdziesz pod artykułem PARP Dyrektywa Omnibus – obowiązek informowania o cenach
Kogo dotyczy Omnibus Woocommerce?
Dyrektywa Omnibus dotyczy przedsiębiorców, którzy oferują produkty lub usługi konsumentom w Unii Europejskiej. Oznacza to, że dyrektywa ta dotyczy zarówno przedsiębiorców działających na terenie Unii Europejskiej, jak i tych, którzy oferują swoje produkty lub usługi konsumentom z UE za pośrednictwem Internetu lub innych form sprzedaży na odległość. Dyrektywa ta dotyczy także przedsiębiorców, którzy oferują produkty lub usługi w miejscach publicznych, na przykład na targach lub wystawach.
Jak przystosować mój sklep zbudowany w Woocommerce pod Dyrektywę Omnibus?
Na rynku już pojawiły się firmy oferujące swoim klientom odpłatne wtyczki do WordPress, które mają dostosowywać sklep do powyższej dyrektywy. Jednak doświadczony Web Designer nie powinien mieć problemu z wdrożeniem tego rozwiązania przy użyciu tylko i wyłącznie PHP. W tym wpisie wyjaśnię, jak to osiągnąć przy użyciu wtyczki WPCode oraz kilku linii kodu PHP.
Na początek potrzebna jest nam dedykowana tabela
Dodajmy nowy dedykowany kawałek kodu:
Ten kod ma na celu zainicjować tabelę wp_price_history
zawierającą pola takie jak id
, product_id
, price
, date_created
function create_price_history_table() {
global $wpdb;
// table name with prefix and suffix
$table_name = $wpdb->prefix . 'price_history';
// getting charset and collation for current WordPress installation
$charset_collate = $wpdb->get_charset_collate();
// creating SQL variable with create table query containing table name and charset and collation
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
product_id bigint(20) NOT NULL,
price decimal(10,2) NOT NULL,
date_created datetime NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
// include upgrade.php for dbDelta() function
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
// run SQL query to create the table
dbDelta( $sql );
}
// hook function to WordPress init action
add_action( 'init', 'create_price_history_table' );
Następnie dane do tej tabeli
Utwórzmy teraz Hook, który będzie uzupełniał tabelę za każdym razem jak zmieni się cena:
function update_price_history_table_on_update_product( $product_id ) {
global $wpdb;
// table name with prefix
$table_name = $wpdb->prefix . 'price_history';
// get product object
$product = wc_get_product( $product_id );
// exit the function if product not found
if( ! $product ) return;
// insert new row into price history table with product id, price, and current date and time
$wpdb->insert(
$table_name,
array(
'product_id' => $product_id,
'price' => $product->get_price(),
'date_created' => current_time( 'mysql' ),
)
);
}
// hook function to woocommerce update product action
add_action( 'woocommerce_update_product', 'update_price_history_table_on_update_product', 10, 1 )
Możliwe jest, że funkcja byłaby zablokowana poprzez np. „ModSecurity rule”. W tym przypadku należy dodać odpowiednie reguły do ignorowanych, aby wtyczka mogła bez przeszkód dodawać rekordy do naszej nowej tabeli.
Pokażmy informację użytkownikowi
Ostatnim krokiem dodanie do struktury produktów Woocommerce linijki informującej o najniższej cenie z ostatnich 30 dni, dla produktu na promocji. Tworzymy nowy kawałek kodu i zamieszczamy w nim:
// hook function to woocommerce before add to cart form action
add_action( 'woocommerce_before_add_to_cart_form', 'show_lowest_price_in_last_30_days', 10 );
// function to show the lowest price of product in last 30 days
function show_lowest_price_in_last_30_days() {
global $product;
// Check if the product is on sale
if ( $product->is_on_sale() ) {
// Get the current product ID
$product_id = $product->get_id();
// Get the lowest price for the product in the last 30 days
$lowest_price = get_lowest_price_in_last_30_days( $product_id );
// Display the lowest price on the product page
echo '<div class="lowest-price">Najniższa cena w ciągu ostatnich 30 dni: ' . wc_price( $lowest_price ) . '</div>';
}
}
// function to get the lowest price of product in last 30 days
function get_lowest_price_in_last_30_days( $product_id ) {
global $wpdb;
// table name with prefix
$table_name = $wpdb->prefix . 'price_history';
// Set the date range for the last 30 days
$before_date = date( 'Y-m-d', strtotime( '-30 days' ) );
$after_date = date( 'Y-m-d' );
// Get the lowest price for the product in the last 30 days
$lowest_price = $wpdb->get_var( $wpdb->prepare( "
SELECT MIN(price) FROM $table_name
WHERE product_id = %d AND date_created BETWEEN %s AND %s
", $product_id, $after_date, $before_date ) );
// return the current price if there is no price history in last 30 days
if(empty($lowest_price)){
$product = wc_get_product($product_id);
return $product->get_price();
}
return $lowest_price;
}
Powyższy kod umieści pod ceną informację o najniższej cenie z ostatnich 30 dni, ale nie umieści takiej informacji gdy nie ma promocji na danym produkcie. Dzięki temu rozwiązaniu powinniśmy uniknąć kary za brak stosowania się do dyrektywy. Wykonanie wszystkich powyższych kroków pozwoli Ci za darmo przystosować sklep na Woocommerce pod nową dyrektywę Omnibus
(AKTUALIZACJA 20.03.2023) Czyszczenie tabeli ze zbędnych rekordów
W odpowiedzi na wątpliwości czytelników dotyczących niekontrolowanego rozrostu tabeli wp_price_history
proponuję wykorzystanie poniższego rozwiązania:
Stwórzmy nowy snippet w WP Code o nazwie „Cron job for deleting old records”. Umieszczamy w nim poniższy kod:
// Register custom cron job to delete old records every day
add_action( 'delete_old_records_cron', 'delete_old_records' );
// Function to delete old price history records
function delete_old_records() {
global $wpdb;
// Define query to delete records older than 60 days
$query = "DELETE FROM {$wpdb->prefix}price_history WHERE date_created < NOW() - INTERVAL 60 DAY";
// Execute query and log results
$result = $wpdb->query( $query );
if ( false === $result ) {
error_log( "Error deleting old price history records: {$wpdb->last_error}" );
}
}
// Schedule the cron job to run once a day
add_filter( 'cron_schedules', 'add_daily_cron_interval' );
function add_daily_cron_interval( $schedules ) {
$schedules['daily'] = array(
'interval' => 86400, // 86400 seconds = 1 day
'display' => __( 'Once Daily' )
);
return $schedules;
}
// Schedule the custom cron job if it hasn't already been scheduled
if ( ! wp_next_scheduled( 'delete_old_records_cron' ) ) {
wp_schedule_event( time(), 'daily', 'delete_old_records_cron' );
}
Powyższy kod doda zadanie Cron, które raz dziennie usunie z tabeli wp_price_history
rekordy starsze niż 60 dni. Możecie sobie swobodnie dostosować ilość dni – taką wartość wybrałem w celu zachowania danych gdyby były potrzebne do analiz. Pozostawiam do dyskusji kwestię, czy usuwanie danych nie będzie sprawiało problemów w razie kontroli lub sporów. W takim przypadku myślę, że warto pomyśleć o zastosowaniu mechanizmów tworzenia podsumowań. Można by zachowywać na przykład tylko jedną najniższą cenę starszą niż 30 dni. Jednak w większości przypadków powyższe rozwiązanie powinno być wystarczające i powinno zapewnić porządek w tabelach.
Możemy to zrobić za Ciebie!
Jeśli potrzebujesz pomocy skontaktuj się z nami! Z chęcią wprowadzimy to za Ciebie.