我有一个名为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);
答案 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
。