remove_action()在WordPress插件中不起作用

Eri*_*man 5 wordpress

我是编写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/>";
Run Code Online (Sandbox Code Playgroud)

woocommerce_before_single_product_summary钩子的原始add_action的优先级是20,所以我在remove_action 30上做了优先级.

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

pet*_*ter 15

我现在几次偶然发现了这个问题,我希望有人会告诉我,我可以这样做:

$priority = has_action('action_name', 'function_name');
remove_action('action_name', 'function_name', $priority);
Run Code Online (Sandbox Code Playgroud)

这使我免于实际硬编码优先级,这对于不同的环境可能是不同的.


Rob*_*mes 12

尝试在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' );
}
Run Code Online (Sandbox Code Playgroud)

  • 优先级需要匹配首先注册动作时使用的内容,即10,(woocommerce-hooks.php的第23行)我已经修改了上面的答案,现在应该可以使用了. (3认同)
  • 为了删除 WooCommerce 操作,我必须在 after_setup_theme 挂钩中调用remove_action。挂钩plugins_loaded 对我不起作用。 (3认同)