【问题标题】:Can't remove function from wordpress WooCommerce hook using remove_action()无法使用 remove_action() 从 wordpress WooCommerce 挂钩中删除功能
【发布时间】:2015-01-06 08:08:00
【问题描述】:

使用 WooCommerce 构建电子商务网站。我正在尝试通过从默认钩子中删除函数并将它们插入另一个函数来修改主题布局(因此它们出现在页面的不同部分。

我已成功移除一个函数并将其插入另一个钩子...

remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40); 
add_action('woocommerce_below_single_product_display', 'woocommerce_template_single_meta', 40);

找到了,除了我不明白的是我必须使用优先级标签40,更高的它不起作用,更少的它不起作用?我认为删除操作优先级必须是一个更高的数字,以便在创建操作后调用它。

现在页面上的一个元素我无法弄清楚它是如何插入到主题中的,使用另一个绅士的函数列出了我能够隔离它的所有钩子和函数...

function list_hooked_functions($tag='woocommerce_single_product_summary'){
     global $wp_filter;
     if ($tag) {
      $hook[$tag]=$wp_filter[$tag];
      if (!is_array($hook[$tag])) {
      trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
      return;
      }
     }
     else {
      $hook=$wp_filter;
      ksort($hook);
     }
     echo '<pre>';
     foreach($hook as $tag => $priority){
      echo "<br />&gt;&gt;&gt;&gt;&gt;\t<strong>$tag</strong><br />";
      ksort($priority);
      foreach($priority as $priority => $function){
      echo $priority;
      foreach($function as $name => $properties) echo "\t$name<br />";
      }
     }
     echo '</pre>';
     return;
}

这个函数返回的是……

我隔离了需要从钩子中删除的功能。所以我的functions.php中有这个

add_action('init', function(){

    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40); 
    remove_action('woocommerce_single_product_summary', 'venedor_single_product_links', 3135);

    add_action('woocommerce_below_single_product_display', 'woocommerce_template_single_meta', 40); 
    add_action('woocommerce_below_single_product_display', 'venedor_single_product_links', 40);
}, 9000);   

我只是无法删除 venedor_single_product_links 功能。我试过提高优先级,降低它,没有它。改为使用“wp_head”操作。

任何人都可以建议为什么这可能不起作用以及我可以尝试的其他任何东西...

感谢您的宝贵时间。

【问题讨论】:

    标签: wordpress wordpress-theming woocommerce


    【解决方案1】:

    在您运行 remove_action 后,将添加“venedor_single_product_links”操作。

    我的建议是找出添加此操作的位置。

    删除操作时使用的优​​先级必须与添加时相同。如果操作是用 40 添加的,正如您已经发现的那样,它必须用 40 删除。

    动作和过滤器存储在一个数组中。数组的格式为['hook']['priority']['function']。这允许在具有不同优先级的单个挂钩上多次使用相同的操作。这是来自remove_filter 的相关sn-p(与remove_action 相同):

    unset( $GLOBALS['wp_filter'][ $tag ][ $priority ][ $function_to_remove ]
    

    当您运行remove_action 时,您正在从全局过滤器数组中取消设置该函数。如果您没有指定正确的优先级,您将尝试取消设置不存在的数组元素。

    这并不意味着您替换它的任何操作的优先级必须为 40。add_action 上的优先级可以是您喜欢的任何操作。

    【讨论】:

    • wordpress 是否在输出 html 以创建页面之前完全生成 wp_filter 数组?所有的钩子都会设置在“init”上吗?
    • 不,wp_filter 数组在页面输出期间仍然可以更改。同样不,您只是使用 init 操作来添加自己的钩子,以便在您执行此操作时已经加载了 WP 和您的主题。可以从任何地方添加挂钩。
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多