Cureducere woodmart cod



        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;
}

Ați găsit acest articol util?

  • Site-uri useful

    https://websiteseochecker.com/domain-authority-checker/#arearesult - seo check https://www.logoai.co...