• 17-03-2024, 14:10:08
    #1
    merhaba arkadaşlar,

    woocommerce bir sitede aşağıdaki kurguyu yapmak istiyorum fakat bir türlü başarılı olamadım, tecrübeli arkadaş varsa yardımcı olabilir mi ?

    1000TL üzeri alışverişlerde Ücretsiz kargo seçeneği + kapıda ödeme seçeneği çıkmalı, standart kargo bedeli çıkmamalı
    1000TL altındaki alışverişlerde standart kargo + kapıda ödeme seçeneği çıkmalı, ücretsiz kargo bedeli çıkmamalı

    WC Hide shipping eklentisi denedim, maalesef istediğim sonucu vermiyor. Aşağıdaki kod bloğunu da code snippet ile ekledim fakat istediğimi başaramadım, ücretsiz kargo olduğunda hepsini gizliyorlar.

    /**
     * EĞER ÜCRETSİZ GÖNDERİ AKTİF İSE DİĞER GÖNDERİ YÖNTEMLERİNİ GİZLE
     */
    function hide_shipping_when_free_is_available( $rates, $package ) {
        $new_rates = array();
        foreach ( $rates as $rate_id => $rate ) {
            // Only modify rates if free_shipping is present.
            if ( 'free_shipping' === $rate->method_id ) {
                $new_rates[ $rate_id ] = $rate;
                break;
            }
        }
        if ( ! empty( $new_rates ) ) {
            //Save local pickup if it's present.
            foreach ( $rates as $rate_id => $rate ) {
                if ('local_pickup' === $rate->method_id ) {
                    $new_rates[ $rate_id ] = $rate;
                    break;
                }
            }
            return $new_rates;
        }
        return $rates;
    }
    add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
    edit : biraz daha oynayarak istediğimi yapabildim, aynı dertten muzdarip olanlar için uyguladığım çözüm şu şekilde;
    Kapıda ödemeyı ayrı bir gönderim biçimi olmaktan çıkartıp standart ve ücretsiz kargoya dahil ettim.
    wp hide shipping eklentisi ile ücretsiz kargo olduğunda diğer methodları devre dışı bıraktım
    ayrıca aşağıdaki kod bloğunu code snippet ile functions.php içerisine kapıda ödemeye ek bedel almak için yerleştirdim. (fee 5 olan yer güncelleniyor)

    // KAPIDA ÖDEMEDE EKSTRA ÜCRET EKLEME
    add_action( 'woocommerce_cart_calculate_fees', 'custom_handling_fee', 10, 1 );
    function custom_handling_fee ( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( 'cod' === WC()->session->get('chosen_payment_method') ) {
            $fee = 5;
            $cart->add_fee( 'Kapıda Ödeme Ekstra Ücret', $fee, true );
        }
    }
    add_action( 'wp_footer', 'custom_checkout_jqscript' );
    function custom_checkout_jqscript() {
        if ( is_checkout() && ! is_wc_endpoint_url() ) :
        ?>
        <script type="text/javascript">
        jQuery( function($){
            $('form.checkout').on('change', 'input[name="payment_method"]', function(){
                $(document.body).trigger('update_checkout');
            });
        });
        </script>
        <?php
        endif;
    }
  • 17-03-2024, 14:22:49
    #2
    function hide_shipping_when_free_is_available( $rates, $package ) {
    $new_rates = array();
    $cart_total = WC()->cart->get_cart_contents_total(); // Sepet toplamını al
    
    // Ücretsiz kargo seçeneği varsa
    if ( isset( $rates['free_shipping'] ) ) {
    // 1000 TL üzeri alımlarda ve ücretsiz kargo mevcutsa
    if ( $cart_total >= 1000 ) {
    $new_rates['free_shipping'] = $rates['free_shipping'];
    
    // Kapıda ödeme seçeneğini ekleyin
    foreach ( $rates as $rate_id => $rate ) {
    if ( 'cod' === $rate->method_id ) {
    $new_rates[ $rate_id ] = $rate;
    break;
    }
    }
    } else {
    // 1000 TL altı alımlarda diğer kargo seçeneklerini göster
    foreach ( $rates as $rate_id => $rate ) {
    if ( 'flat_rate' === $rate->method_id ) { // Varsayılan olarak flat_rate kullanıldı
    $new_rates[ $rate_id ] = $rate;
    break;
    }
    }
    }
    } else {
    // Ücretsiz kargo seçeneği yoksa, tüm kargo seçeneklerini göster
    $new_rates = $rates;
    }
    
    return $new_rates;
    }
    add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
  • 17-03-2024, 14:25:47
    #3
    Merhaba hocam, teşekkür ederim fakat bu kod gizlemeyi kaldırıyor. chatgpt ise kendisiyle baya varyasyon çalıştım ama başarılı olamadık
    sakurt adlı üyeden alıntı: mesajı görüntüle
    function hide_shipping_when_free_is_available( $rates, $package ) {
    $new_rates = array();
    $cart_total = WC()->cart->get_cart_contents_total(); // Sepet toplamını al
    
    // Ücretsiz kargo seçeneği varsa
    if ( isset( $rates['free_shipping'] ) ) {
    // 1000 TL üzeri alımlarda ve ücretsiz kargo mevcutsa
    if ( $cart_total >= 1000 ) {
    $new_rates['free_shipping'] = $rates['free_shipping'];
    
    // Kapıda ödeme seçeneğini ekleyin
    foreach ( $rates as $rate_id => $rate ) {
    if ( 'cod' === $rate->method_id ) {
    $new_rates[ $rate_id ] = $rate;
    break;
    }
    }
    } else {
    // 1000 TL altı alımlarda diğer kargo seçeneklerini göster
    foreach ( $rates as $rate_id => $rate ) {
    if ( 'flat_rate' === $rate->method_id ) { // Varsayılan olarak flat_rate kullanıldı
    $new_rates[ $rate_id ] = $rate;
    break;
    }
    }
    }
    } else {
    // Ücretsiz kargo seçeneği yoksa, tüm kargo seçeneklerini göster
    $new_rates = $rates;
    }
    
    return $new_rates;
    }
    add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );