2012-05-20 14 views
5

Soy nuevo en la escritura de plugins de WordPress. Intento escribir un pequeño complemento que modifique cómo el plugin de woocommerce muestra imágenes en la página de un solo producto. Específicamente, si no hay una imagen de producto, haga que el div mantenga la imagen "display: none" en lugar de mostrar allí una imagen de marcador de posición. La estrategia que estoy usando es usar add_action para renderizar mi propia versión de la plantilla de woocommerce product_image.php y luego (tratando de) usar remove_action para evitar que se renderice el archivo original product_image.php. El add_action está funcionando claramente, ya que puedo ver el div "display: none" en Firebug. Sin embargo, la acción remove_action no está teniendo éxito.remove_action() no funciona en el complemento de WordPress

Aquí está mi código:

$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/>"; 

La prioridad en la add_action original para el gancho woocommerce_before_single_product_summary fue de 20, lo que hizo que la prioridad en la remove_action 30.

Las dos declaraciones de depuración al final muestre que add_action está regresando "1", pero el resultado de remove_action está vacío. Cualquier ayuda sería muy apreciada.

Respuesta

12

Intenta eliminar la acción durante plugins_loaded, esto debería garantizar que definitivamente se haya agregado antes de intentar eliminarlo.

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

Me temo que no pareció hacer ninguna diferencia. ¿Alguna otra idea? –

+2

La prioridad debe coincidir con lo que se usó al registrar la acción en primer lugar, que fue 10, (línea 23 de woocommerce-hooks.php) he modificado la respuesta anterior que debería funcionar ahora. –

+0

¡Muchas gracias! –

11

He tropezado con esta pregunta varias veces y me gustaría que alguien hubiera simplemente me dijeron que yo puedo hacer esto:

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

Esto me salva de la realidad codificando la prioridad, lo cual puede ser diferente para diferentes ambientes.

+0

Buen truco para obtener la prioridad :) –

Cuestiones relacionadas