【问题标题】:wordpress plugin function firing twicewordpress 插件函数触发两次
【发布时间】:2018-02-04 11:49:07
【问题描述】:

this 帖子中操作woocommerce 菜单。
本插件代码:

function product_subcategories( $args = array() ) {
    $parentid = get_queried_object_id();

    $args = array(
        'parent' => $parentid
    );

    $terms = get_terms( 'product_cat', $args );

    if ( $terms ) {

        echo '<ul class="product-cats">';

            foreach ( $terms as $term ) {

                echo '<li class="category">';                 

                    woocommerce_subcategory_thumbnail( $term );

                    echo '<h2>';
                        echo '<a href="' .  esc_url( get_term_link( $term ) ) . '" class="' . $term->slug . '">';
                            echo $term->name;
                        echo '</a>';
                    echo '</h2>';

                echo '</li>';


        }

        echo '</ul>';

    }     
}
add_action( 'woocommerce_before_shop_loop', 'product_subcategories', 50 );

触发两次。

为什么会这样?? 谢谢

编辑 原帖链接:Display WooCommerce Categories, Subcategories, and Products in Separate Lists

【问题讨论】:

  • 您是否尝试使用查询监视器插件进行调试? wordpress.org/plugins/query-monitor
  • AFA Query Monitor 插件请参阅 EDIT of original question with screenshot ... tutsplus_product_subcategories()的单个查询

标签: php wordpress plugins woocommerce hook-woocommerce


【解决方案1】:

Woocommerce 确实允许您使用相同的标签 source 注册两个事件。因此,如果文件被加载两次(例如,如果您使用 include/require 而不是 include_once/require_once),则可能会导致此问题:无论如何都要检查它(!)。

钩子本身在woocommerce 中被调用了两次,所以从技术上讲,钩子可能被调用了两次。但是我不知道这两个模板是否在同一个调用中加载...但是您可能已经注册了两次调用而不知道:因此检查您的代码是否有对该函数的另一个调用,可能使用不同的标记(@ 除外) 987654323@)。

【讨论】:

  • 这是对该插件操作的唯一调用,因为这是唯一的 php 代码...除了 css
【解决方案2】:

更新:

使用您的代码,您只是在做 WooCommerce 已经在做的事情,这就是为什么您会看到重复的类别/子类别菜单项,并且您说它“被解雇了两次”。

无论如何,如果你保留你的代码,然后你想删除 WooCommerce 生成的类别/子类别项目,你可以使用这个钩子函数:

add_filter('woocommerce_product_subcategories_args', function( $args ){
    $args['taxonomy']= '';
    return $args;
});

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

这将删除 WooCommerce 重复项...


原答案:

woocommerce_before_shop_loop 钩子:

  • 没有参数(无需添加$args = array()
  • 被多次调用,但只被触发一次。检查它用这个替换你的代码:
add_action( 'woocommerce_before_shop_loop', function(){
    wc_print_notice('test message', 'notice');
}, 50 );

请注意,由于您的问题不是很明确和详细,我们真的不知道您的问题是什么,因此无法为您提供更多帮助……

【讨论】:

  • 注意到...删除了$args....notice 函数只出现了一次...尝试了has_actiondid_action 但一无所获...至于问题,我不想超载代码,但链接说明了一切......如果你能看一下会有所帮助......谢谢你的时间
  • 附言。 if (has_action('woocommerce_before_shop_loop', 'tutsplus_product_subcategories')) { add_action( 'woocommerce_before_shop_loop', 'tutsplus_product_subcategories', 50 ); } 根本不会触发该功能,但如果我否定它的条件....我哪里出错了?
  • @Jadeye 我已经更新了我的答案……请看一下。谢谢
  • 我把它放在add_action 之前的plugin code 中,在functions.php...没有用...对不起
  • @jadeye ...此代码经过测试并且完美运行...您只需将其放在活动主题 function.php 的末尾(但只有我更新中的新过滤器)。
猜你喜欢
  • 2021-10-27
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2018-01-08
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多