add_filter( 'woocommerce_product_add_to_cart_text', 'dfi_change_add_to_cart_text' );
add_filter( 'woocommerce_product_single_add_to_cart_text', 'dfi_change_add_to_cart_text_dingle', 10, 2 );
add_action('woocommerce_single_product_summary','dfi_change_add_to_cart_button', 31);
add_filter('woocommerce_loop_add_to_cart_link', 'dfi_change_add_to_cart_shop_button', 10, 2);
function dfi_change_add_to_cart_text() {
return 'Vezi oferta';
}
function dfi_change_add_to_cart_text_dingle( $text, $product ) {
if ( is_product() ) {
return 'Vezi oferta';
}
return $text;
}
function dfi_change_add_to_cart_button() {
global $product;
$product_id = $product ? $product->get_id() : get_the_ID();
// Preluare valoare din atributul personalizat 'aff_code'
$product_attributes = get_post_meta($product_id, '_product_attributes', true);
$aff_code = isset($product_attributes['aff_code']['value']) ? $product_attributes['aff_code']['value'] : '';
if (!empty($aff_code)) {
// Eliminare buton standard "Adaugă în coș"
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
echo "<style>.summary form.cart{display: none;}</style>";
// Afișare buton personalizat
echo '<a href="' . esc_url($aff_code) . '" class="dfi-add-to-cart single_add_to_cart_button button alt">Vezi oferta</a><br/>';
}
}
function dfi_change_add_to_cart_shop_button($button, $product) {
$product_id = $product->get_id();
// Preluare valoare din atributul personalizat 'aff_code'
$product_attributes = get_post_meta($product_id, '_product_attributes', true);
$aff_code = isset($product_attributes['aff_code']['value']) ? $product_attributes['aff_code']['value'] : '';
if (!empty($aff_code)) {
// Generare buton personalizat pentru pagina de magazin
$button = '<a href="' . esc_url($aff_code) . '" class="button product_type_simple add_to_cart_button ajax_add_to_cart add-to-cart-loop">Vezi oferta</a><br/>';
}
return $button;
}
// Adaugă tipul de sortare personalizat
function custom_woocommerce_catalog_orderby($sortby) {
$sortby['reducere'] = __('Reducere: de la mare la mic', 'woocommerce');
return $sortby;
}
add_filter('woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby');
add_filter('woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby');
// Adaugă opțiunea de sortare personalizată în selectul de sortare
function custom_pre_get_posts_query($query) {
if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category() || is_product_tag())) {
$orderby = isset($_GET['orderby']) ? wc_clean(wp_unslash($_GET['orderby'])) : get_option('woocommerce_default_catalog_orderby');
if ('reducere' === $orderby) {
// Adaugă clauzele personalizate pentru sortare
add_filter('posts_clauses', 'custom_posts_clauses', 10, 2);
}
}
}
add_action('pre_get_posts', 'custom_pre_get_posts_query');
// Modifică clauzele interogării pentru sortarea după reducerea cea mai mare
function custom_posts_clauses($clauses, $query) {
global $wpdb;
if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category() || is_product_tag())) {
// Alătură tabelul postmeta pentru prețurile produselor
$clauses['join'] .= "
LEFT JOIN {$wpdb->postmeta} AS pm_regular ON ({$wpdb->posts}.ID = pm_regular.post_id AND pm_regular.meta_key = '_regular_price')
LEFT JOIN {$wpdb->postmeta} AS pm_sale ON ({$wpdb->posts}.ID = pm_sale.post_id AND pm_sale.meta_key = '_sale_price')
";
// Calculează reducerea și sortează descrescător, produsele fără reducere fiind la final
$clauses['orderby'] = "
CASE
WHEN pm_regular.meta_value > 0 AND pm_sale.meta_value > 0 THEN
(CAST(pm_regular.meta_value AS SIGNED) - CAST(pm_sale.meta_value AS SIGNED)) / CAST(pm_regular.meta_value AS SIGNED)
ELSE 0
END DESC,
{$wpdb->posts}.post_date DESC
";
}
return $clauses;
}
function produse_cu_reducere_peste_40_shortcode($atts) {
$atts = shortcode_atts(
array(
'per_page' => 32, // numărul de produse pe pagină
),
$atts,
'produse_discount_40'
);
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
// Prima interogare: Obținem toate produsele cu preț normal și preț redus.
$all_args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => '_regular_price',
'compare' => 'EXISTS'
),
array(
'key' => '_price',
'compare' => 'EXISTS'
)
)
);
$all_query = new WP_Query($all_args);
$filtered_ids = array();
if ( $all_query->have_posts() ) {
while ( $all_query->have_posts() ) {
$all_query->the_post();
$product = wc_get_product( get_the_ID() );
$regular_price = $product->get_regular_price();
$sale_price = $product->get_sale_price();
if ( !empty($sale_price) && !empty($regular_price) && floatval($regular_price) > 0 ) {
$discount = ( ( $regular_price - $sale_price ) / $regular_price ) * 100;
if ( $discount > 40 ) {
$filtered_ids[] = get_the_ID();
}
}
}
wp_reset_postdata();
}
// Dacă nu există produse cu reducere peste 40%
if ( empty($filtered_ids) ) {
return '<p>'.__( 'Niciun produs găsit cu reducere peste 40%.', 'text-domain' ).'</p>';
}
// A doua interogare: doar produsele filtrate, cu paginare normală
$args = array(
'post_type' => 'product',
'post__in' => $filtered_ids,
'posts_per_page' => $atts['per_page'],
'paged' => $paged,
'orderby' => 'post__in'
);
$query = new WP_Query($args);
ob_start();
global $woocommerce_loop;
$woocommerce_loop['columns'] = 4; // Forțăm 4 coloane
if ( $query->have_posts() ) {
woocommerce_product_loop_start(); // <ul class="products ...">
while ( $query->have_posts() ) {
$query->the_post();
wc_get_template_part( 'content', 'product' );
}
woocommerce_product_loop_end(); // </ul>
// Afișăm paginarea normală WooCommerce
woocommerce_pagination();
} else {
echo '<p>' . __( 'Niciun produs găsit cu reducere peste 40%.', 'text-domain' ) . '</p>';
}
wp_reset_postdata();
return ob_get_clean();
}
add_shortcode('produse_discount_40', 'produse_cu_reducere_peste_40_shortcode');
function hide_non_discounted_and_out_of_stock_products( $q ) {
// Nu aplicăm filtrul în admin
if ( is_admin() ) {
return;
}
// Obținem meta_query curent sau creăm unul nou dacă nu există
$meta_query = $q->get( 'meta_query' );
if ( ! is_array( $meta_query ) ) {
$meta_query = array();
}
// Setăm relația între condiții la "AND"
$meta_query['relation'] = 'AND';
// Condiție: produsul are un preț de reducere setat
$meta_query[] = array(
'key' => '_sale_price',
'value' => '',
'compare' => '!='
);
// Condiție: produsul este în stoc
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'instock',
'compare' => '='
);
$q->set( 'meta_query', $meta_query );
}
add_action( 'woocommerce_product_query', 'hide_non_discounted_and_out_of_stock_products', 10 );
// Adaugă o nouă coloană pentru reducerea procentuală
add_filter( 'manage_edit-product_columns', 'adauga_coloana_reducere_procentuala', 20 );
function adauga_coloana_reducere_procentuala( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $value ) {
$new_columns[$key] = $value;
if ( 'price' === $key ) {
$new_columns['reducere_procentuala'] = __( 'Reducere (%)', 'textdomain' );
}
}
return $new_columns;
}
// Populează coloana cu datele privind reducerea procentuală
add_action( 'manage_product_posts_custom_column', 'afiseaza_reducere_procentuala', 10, 2 );
function afiseaza_reducere_procentuala( $column, $post_id ) {
if ( 'reducere_procentuala' === $column ) {
$product = wc_get_product( $post_id );
$regular_price = (float) $product->get_regular_price();
$sale_price = (float) $product->get_sale_price();
if ( $regular_price > 0 && $sale_price > 0 && $sale_price < $regular_price ) {
$discount = round( ( ( $regular_price - $sale_price ) / $regular_price ) * 100 );
echo $discount . '%';
} else {
echo '-';
}
}
}
// CSS pentru a fixa lățimea coloanei în admin
add_action( 'admin_head', 'setare_latime_coloana_reducere' );
function setare_latime_coloana_reducere() {
echo '<style type="text/css">
.wp-list-table th.column-reducere_procentuala,
.wp-list-table td.column-reducere_procentuala {
width: 80px;
text-align: center;
}
</style>';
}
// Face coloana "Reducere (%)" sortabilă
add_filter( 'manage_edit-product_sortable_columns', 'reducere_sortable_column' );
function reducere_sortable_column( $sortable_columns ) {
$sortable_columns['reducere_procentuala'] = 'reducere_procentuala';
return $sortable_columns;
}
// Interceptăm cererea de sortare
add_filter( 'request', 'reducere_sort_request' );
function reducere_sort_request( $vars ) {
if ( isset( $vars['orderby'] ) && 'reducere_procentuala' === $vars['orderby'] ) {
add_filter( 'posts_clauses', 'order_by_reducere_clauses', 10, 2 );
}
return $vars;
}
// Modificăm direct interogarea pentru a sorta după reducerea procentuală
function order_by_reducere_clauses( $clauses, $query ) {
global $wpdb;
if ( 'product' === $query->get( 'post_type' ) && $query->get( 'orderby' ) === 'reducere_procentuala' ) {
// Adăugăm JOIN pentru regular_price și sale_price
$clauses['join'] .= "
LEFT JOIN {$wpdb->postmeta} AS regular_price_meta ON ({$wpdb->posts}.ID = regular_price_meta.post_id AND regular_price_meta.meta_key = '_regular_price')
LEFT JOIN {$wpdb->postmeta} AS sale_price_meta ON ({$wpdb->posts}.ID = sale_price_meta.post_id AND sale_price_meta.meta_key = '_sale_price')
";
// Folosim COALESCE pentru a evita probleme cu valori null
$order = ( strtoupper( $query->get('order') ) === 'ASC' ) ? 'ASC' : 'DESC';
$clauses['orderby'] = " ORDER BY CASE
WHEN CAST(COALESCE(regular_price_meta.meta_value, '0') AS DECIMAL(10,2)) > 0
THEN ((CAST(COALESCE(regular_price_meta.meta_value, '0') AS DECIMAL(10,2)) - CAST(COALESCE(sale_price_meta.meta_value, '0') AS DECIMAL(10,2))) / CAST(COALESCE(regular_price_meta.meta_value, '0') AS DECIMAL(10,2)))
ELSE 0 END $order";
}
return $clauses;
}