6

我是编写 WordPress 插件的新手。我正在尝试编写一个小插件来修改 woocommerce 插件在单个产品页面上显示图像的方式。具体来说,如果没有产品图片,则让包含图片的 div 为“display:none”,而不是在那里显示占位符图片。我正在使用的策略是使用 add_action 来呈现我自己版本的 woocommerce 的 product_image.php 模板,然后(尝试)使用 remove_action 来防止呈现原始 product_image.php 文件。add_action 显然可以正常工作,因为我可以在 Firebug 中看到“display:none”div。但是, remove_action 没有成功。

这是我的代码:

$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 挂钩的原始 add_action 的优先级为 20,因此我将 remove_action 的优先级设为 30。

最后的两条调试语句显示 add_action 返回“1”,但 remove_action 的结果为空。任何帮助将不胜感激。

4

2 回答 2

24

我现在已经多次偶然发现这个问题,我希望有人会告诉我我可以做到这一点:

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

这使我不必对优先级进行实际的硬编码,这对于不同的环境可能会有所不同。

于 2013-04-02T17:55:35.203 回答
15

尝试在 plugins_loaded 期间删除该操作,这应确保在您尝试删除它之前肯定已添加它。

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' );
}
于 2012-05-20T14:55:01.250 回答