WooCommerce mağazasında bazı ürünleri kampanya dışında tutmak normal bir ihtiyaç. Özellikle sabit marjlı ürünler, tedarikçi fiyatı hassas ürünler, paket ürünler veya zaten özel fiyatla satılan ürünlerde Flycart / Discount Rules PRO’nun otomatik indirimi istenmeyen sonuç çıkarabiliyor.
Bu çözüm, ürün düzenleme ekranındaki Yayınla / Güncelle alanına tek bir kutu ekler: “Flycart indirimlerinden muaf”. İşaretlenen ürün, Flycart’ın hesapladığı indirim sonucundan çıkarılır. Basit ürünlerde doğrudan; değişken ürünlerde ise ana üründe işaretlendiğinde tüm varyasyonlarda çalışır.
Bu snippet neyi çözüyor?
- Ürün sayfası: Flycart indirim fiyatı, oranı ve detayları muaf ürün için gösterilmez.
- Sepete ekleme, sepet ve ödeme: Hesaplanan indirim sonucu muaf ürün için boşaltılır; ürün kendi normal/satış fiyatında kalır.
- Exclusive kurallar: En ucuz ürüne indirim, set indirim ve öncelikli kural gibi senaryolarda muaf ürün için hesaplama erken aşamada kesilir.
- Variable ürünler: Ana ürün üzerindeki ayar tüm varyasyonlara miras kalır. İsterseniz yalnız bir varyasyonu da ayrı meta ile muaf tutabilirsiniz.
- Kupon davranışı: Flycart’ın indirim motorunun yönettiği kupon/dinamik indirim sonucu muaf ürüne düşmez. WooCommerce’in kendi kuponları ayrıca yönetiliyorsa, kuponun “ürünleri hariç tut” alanına bu ürünleri de ekleyin.
Kurulumdan önce kısa not
Canlı sitenin functions.php dosyasına doğrudan ekleme yapmak yerine Code Snippets, child theme veya küçük bir site eklentisi kullanın. Böylece tema güncellemesinde kod kaybolmaz. Önce staging ortamında test edin; sonra canlıda korumalı bir test ürünüyle doğrulayın.
Çalışan PHP kodu
<?php
/**
* Flycart PRO / Discount Rules: ürün bazlı indirim muafiyeti.
* functions.php yerine Code Snippets veya küçük bir eklentide çalıştırın.
*/
defined( 'ABSPATH' ) || exit;
const CAGRI_FLYCART_EXEMPT_META = '_flycart_discount_exempt';
/** Meta değeri bu üründe ya da varyasyonun ana ürününde aktif mi? */
function cagri_flycart_product_is_exempt( $product ): bool {
if ( ! $product instanceof WC_Product ) {
$product = wc_get_product( $product );
}
if ( ! $product ) {
return false;
}
if ( 'yes' === $product->get_meta( CAGRI_FLYCART_EXEMPT_META, true ) ) {
return true;
}
// Ana variable üründe kutu işaretlenirse tüm varyasyonlar da muaf olur.
$parent_id = $product->get_parent_id();
return $parent_id && 'yes' === get_post_meta( $parent_id, CAGRI_FLYCART_EXEMPT_META, true );
}
/** Ürün düzenleme ekranındaki Yayınla / Güncelle kutusuna checkbox ekle. */
add_action( 'post_submitbox_misc_actions', function () {
global $post;
if ( ! $post || 'product' !== $post->post_type || ! current_user_can( 'edit_post', $post->ID ) ) {
return;
}
$checked = 'yes' === get_post_meta( $post->ID, CAGRI_FLYCART_EXEMPT_META, true );
wp_nonce_field( 'cagri_flycart_exempt_save', 'cagri_flycart_exempt_nonce' );
?>
<div class="misc-pub-section cagri-flycart-exempt-field">
<label>
<input type="checkbox" name="cagri_flycart_discount_exempt" value="yes" <?php checked( $checked ); ?> />
<strong><?php esc_html_e( 'Flycart indirimlerinden muaf', 'cagribolcal' ); ?></strong>
</label>
<span class="description" style="display:block;margin-top:4px;">
<?php esc_html_e( 'Bu ürün için Flycart kuralı, kupon ve dinamik fiyat indirimi uygulanmaz.', 'cagribolcal' ); ?>
</span>
</div>
<?php
} );
/** Checkbox değerini ürün meta alanına güvenli biçimde kaydet. */
add_action( 'save_post_product', function ( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! isset( $_POST['cagri_flycart_exempt_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['cagri_flycart_exempt_nonce'] ) ), 'cagri_flycart_exempt_save' ) ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
update_post_meta( $post_id, CAGRI_FLYCART_EXEMPT_META, isset( $_POST['cagri_flycart_discount_exempt'] ) ? 'yes' : 'no' );
} );
/**
* Flycart'ın hesapladığı indirim sonucunu muaf üründe tamamen kaldır.
* Bu kanca ürün sayfası, sepete ekleme, sepet ve ödeme hesaplamalarında
* kullanılan indirim sonuç dizisinin son çıkışıdır.
*/
add_filter( 'advanced_woo_discount_rules_discount_prices_of_product', function ( $discount_prices, $product, $quantity, $cart_item ) {
return cagri_flycart_product_is_exempt( $product ) ? array() : $discount_prices;
}, PHP_INT_MAX, 4 );
/**
* Exclusive (özel öncelikli) kurallar için hesaplamayı daha erken aşamada da kes.
* Böylece "en ucuz ürün", set indirim ve benzeri exclusive kurallar muaf ürüne düşmez.
*/
add_filter( 'advanced_woo_discount_rules_calculate_discount_for_cart_item', function ( $calculate, $cart_item ) {
if ( empty( $cart_item['data'] ) ) {
return $calculate;
}
return cagri_flycart_product_is_exempt( $cart_item['data'] ) ? false : $calculate;
}, PHP_INT_MAX, 2 );
/** Flycart'ın ürün sayfası/özel tema API'lerinde muafiyeti de yansıt. */
add_filter( 'advanced_woo_discount_rules_get_product_discount_details', function ( $details, $product ) {
return cagri_flycart_product_is_exempt( $product ) ? false : $details;
}, PHP_INT_MAX, 2 );
add_filter( 'advanced_woo_discount_rules_get_product_discount_percentage', function ( $percentage, $product ) {
return cagri_flycart_product_is_exempt( $product ) ? 0 : $percentage;
}, PHP_INT_MAX, 2 );
Kullanım
- Yukarıdaki kodu tek parça olarak ekleyin ve etkinleştirin.
- WooCommerce → Ürünler’den korumak istediğiniz ürünü açın.
- Sağdaki Yayınla / Güncelle kutusunda Flycart indirimlerinden muaf seçeneğini işaretleyin ve ürünü güncelleyin.
- Değişken üründe bu kutuyu ana üründe işaretlemek, mevcut ve sonraki tüm varyasyonları korur.
Doğrulama senaryosu
İki test ürünü hazırlayın: A ürününü muaf işaretleyin, B ürününü normal bırakın. Flycart’ta yüzde indirim, sabit indirim ve “en ucuz ürün” senaryolarını ayrı ayrı çalıştırın. A’nın fiyatı değişmemeli; B’nin indirimi normal biçimde görünmelidir. Ardından A’yı muafiyetten çıkarıp aynı sepeti yenileyin: Flycart kuralı yeniden uygulanmalıdır.
Önemli: Bu kod Flycart’ın public filtrelerini kullanır. Birden fazla fiyatlandırma eklentisi aynı anda aktifse, fiyatı en son değiştiren eklentinin önceliğini ayrıca kontrol edin. WooCommerce çekirdek kuponlarını tamamen yasaklamak için ise kupon ayarındaki ürün hariç tutma alanı kullanılmalıdır.
Neden ürün meta alanı kullanıyoruz?
Muafiyet durumu ürünün kendi verisidir; kampanya kuralının içine tek tek ürün listesi yazmak yönetimi zorlaştırır. _flycart_discount_exempt meta anahtarı sayesinde koruma ürün üzerinde kalır. Kampanya değişse, yeni kural eklense veya bir ürün değişken ürüne dönüşse bile yöneticinin kontrol noktası aynı yerde olur.
Flycart’ın güncel geliştirici dokümantasyonu, ürün ve sepet indirim sonuçlarını filtrelerle okuma/genişletme imkânı sunduğunu; bu snippet de hesaplanan ürün indirim listesinin son çıkış filtresini ve exclusive kural hesaplamasını kullanır.