2012-05-20 26 views
5

WordPress eklentileri yazarken yeni. Ben woocommerce eklentisinin görüntüleri tek ürün sayfasında nasıl görüntülediğini değiştiren küçük bir eklenti yazmaya çalışıyorum. Spesifik olarak, eğer bir ürün görüntüsü yoksa, orada bir yer tutucu görüntüyü göstermek yerine, görüntüyü tutan div "göster: yok" seçeneğini kullanın. Kullandığım strateji, woocommerce'ın product_image.php şablonunun kendi versiyonunu oluşturmak için add_action kullanmak ve orijinal product_image.php dosyasının işlenmesini önlemek için remove_action'ı kullanmak (kullanmaya çalışmak). Add_action açık bir şekilde çalışıyor, çünkü Firebug'da "display: none" divini görebiliyorum. Ancak, kaldırma işlemi başarılı olmaz. İşte remove_action() WordPress eklentisinde çalışma yok

benim kodudur:

$add_result = add_action('woocommerce_before_single_product_summary', 'eba_wc_show_product_images', 10); 

function eba_wc_show_product_images() { 
    include('eba_product-image.php'); 
} 

$remove_result = remove_action('woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 30); 
echo "<hr/>result of add_result = " . $add_result . "<hr/>"; 
echo "<hr/>result of remove_result = " . $remove_result . "<hr/>"; 

woocommerce_before_single_product_summary kanca için orijinal ADD_ACTION öncelikli 20, bu yüzden 30.

iki ayıklama ifadeleri sonunda remove_action üzerinde öncelik haline add_action öğesinin "1" değerini döndürdüğünü, ancak kaldırma işleminin sonucunun boş olduğunu gösterir. Herhangi bir yardım büyük takdir edilecektir.

cevap

12

Bu işlem plugins_loaded sırasında kaldırılmaya çalışılmalı, bu işlem denemeden önce mutlaka eklenmiş olmalıdır.

add_action('plugins_loaded','alter_woo_hooks'); 

function alter_woo_hooks() { 
    $add_result = add_action('woocommerce_before_single_product_summary', 'eba_wc_show_product_images', 10); 
    $remove_result = remove_action('woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 10); 

    echo "<hr/>result of add_result = " . $add_result . "<hr/>"; 
    echo "<hr/>result of remove_result = " . $remove_result . "<hr/>"; 
} 

function eba_wc_show_product_images() { 
    include('eba_product-image.php'); 
} 
+0

Korkarım ki bu hiç farketmedi. Başka fikirlerin var mı? –

+2

Öncelik, eylemin ilk kaydedildiği sırada kullanılanla eşleşmesi gerekiyordu, bu 10'un üstündeydi, (woocommerce-hooks.php satır 23'ü) şu anda çalışması gereken cevabı değiştirdim. –

+0

Teşekkürler, çok fazla! –

11

Şimdi bu soru üzerine birkaç kez tökezledi ettik, sonra da birisinin ettik isterdim sadece bunu yapabilirim söyledi:

$priority = has_action('action_name', 'function_name'); 
remove_action('action_name', 'function_name', $priority); 

Bu aslında önceliği, hardcoding beni kurtarır hangi farklı ortamlar için farklı olabilir.

+0

Önceliği yakalamak için güzel bir numara :) –