使用单独的php函数将代码添加到php函数

时间:2015-10-02 19:50:21

标签: php wordpress function woocommerce

我有一个名为wc_print_notices的php函数,它位于woocommerce的核心文件中,如果可以避免,我不想编辑核心文件。

所以我想在我的functions.php文件中写一些东西,它会为这个函数添加更多功能。

我尝试使用过滤器,但是,那些只能用作作为钩子的woocommerce函数,这是一个通过钩子调用的函数,因此do_action()add_filter不起作用与wc_print_notices

我想将相关产品添加到此功能中,并尝试过类似的内容

function popup_products( $popup ){
    $popup = woocommerce_output_related_products();
  return $popup;
}

函数本身运行正常,但是,我想将它添加到函数wc_print_notices

我试过的过滤器是:

add_filter( 'wc_print_notices', 'popup_products', 1, 1);
add_filter( 'wc_print_notices', 'popup_products', 99, 99);
add_filter( 'wc_print_notices', 'popup_products', 1);
add_filter( 'wc_print_notices', 'popup_products', 99);

1 个答案:

答案 0 :(得分:2)

由于add_action( 'woocommerce_before_shop_loop', 'wc_print_notices', 10 );正在调用wc_print_notices,我认为您需要使用remove_action删除该操作,然后add_action( 'woocommerce_before_shop_loop', 'my_custom_wc_print_notices', 10 );

  

https://docs.woothemes.com/wc-apidocs/source-function-wc_print_notices.html#106-129

可能会添加其他通知。

  

https://docs.woothemes.com/wc-apidocs/source-function-wc_print_notices.html#75-91

我认为在您的情况下,如果您想要做的只是添加其他信息,那么您可以将其添加到Woocommerce Loop中。

add_action('woocommerce_before_shop_loop','popup_products');

使用OP澄清

function custom_wc_print_notices() {
if ( ! did_action( 'woocommerce_init' ) ) {
         _doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' );
         return;
     }

     $all_notices  = WC()->session->get( 'wc_notices', array() );
     $notice_types = apply_filters( 'woocommerce_notice_types', array( 'error', 'success', 'notice' ) );

     foreach ( $notice_types as $notice_type ) {
         if ( wc_notice_count( $notice_type ) > 0 ) {
             // Call your function here and make sure it only output once
             woocommerce_output_related_products();
             /********************************************/
             wc_get_template( "notices/{$notice_type}.php", array(
                 'messages' => $all_notices[$notice_type]
             ) );
         }
     }

     wc_clear_notices();
}

我认为最好的选择就像我之前建议的那样删除默认的add_action,并将其修改为wc_print_notices