是否可以从插件覆盖主题中的函数?我一直在努力寻找一个如何实现上述目标的例子。
如果有人能说出任何消息,那将会非常有帮助。
编辑:添加一些代码
所以这是我的功能,它允许woocommerce中的购物车使用ajax进行更新:
add_filter('add_to_cart_fragments', 'woocommerce_header_add_to_cartplus_fragment', '1');
function woocommerce_header_add_to_cartplus_fragment( $fragments ) {
global $woocommerce;
$basket_icon = esc_attr($instance['basket_icon']);
ob_start();
?>
<a class="cartplus-contents" href="<?php echo $woocommerce->cart->get_cart_url(); ?>" onclick="javscript: return false;" title="<?php _e('View your shopping cart', 'woothemes'); ?>"><?php echo sprintf(_n('%d item', '%d items', $woocommerce->cart->cart_contents_count, 'woothemes'), $woocommerce->cart->cart_contents_count);?> - <?php echo $woocommerce->cart->get_cart_total(); ?></a>
<?php
$fragments['a.cartplus-contents'] = ob_get_clean();
return $fragments;
}
然而,一些主题也有内置的类似功能 - 在这些主题中我的代码停止工作,这似乎很奇怪,因为我在我的插件中使用上面的代码两次(一个是上面的变体)并且它们可以很好地协同工作。这是主题内置的代码:
add_filter('add_to_cart_fragments', 'woocommerce_cart_link');
function woocommerce_cart_link() {
global $woocommerce;
ob_start();
?>
<a href="<?php echo $woocommerce->cart->get_cart_url(); ?>" title="<?php echo sprintf(_n('%d item', '%d items', $woocommerce->cart->cart_contents_count, 'woothemes'), $woocommerce->cart->cart_contents_count);?> <?php _e('in your shopping cart', 'woothemes'); ?>" class="cart-button ">
<span class="label"><?php _e('My Basket:', 'woothemes'); ?></span>
<?php echo $woocommerce->cart->get_cart_total(); ?>
<span class="items"><?php echo sprintf(_n('%d item', '%d items', $woocommerce->cart->cart_contents_count, 'woothemes'), $woocommerce->cart->cart_contents_count); ?></span>
</a>
<?php
$fragments['a.cart-button'] = ob_get_clean();
return $fragments;
}
答案 0 :(得分:0)
除非该函数被覆盖,否则不行。这是基本的PHP。您无法重新定义函数。如果你尝试,你会得到一个致命的错误。
写入部分WordPress被覆盖。看/wp-includes/pluggable.php
。其中的每个函数都包含在if( !function_exists(...) )
条件中。除非你的主题做同样的事情,有些功能也是如此,否则你无法覆盖。
查找可能对您有所帮助的过滤器。
查看您的代码,您应该可以解开它。只要确保将钩子钩得足够晚。这不是一个好的解决方案,但是因为你破坏了主题功能,而且还必须知道主题正在使用的所有钩子函数的名称。
$fragments
或$_POST
或$_GET
或其他任何内容中是否存在可用于有条件地运行代码的内容,其余内容则单独使用。