0

是否可以从插件覆盖主题中的功能?我一直在努力寻找如何实现上述目标的示例。

如果有人能提供任何启示,那将非常有帮助。

编辑:添加一些代码

所以这是我的功能,它允许 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;

}
4

1 回答 1

1

除非该函数打算被覆盖,否则不会。这是基本的 PHP。你不能重新定义一个函数。如果你尝试,你会得到一个致命的错误。

WordPress的部分内容被写入被覆盖。看/wp-includes/pluggable.php。那里的每个函数都包含在if( !function_exists(...) )条件中。除非您的主题做同样的事情,并且某些功能也做同样的事情,否则您无法覆盖。

寻找可能对您有所帮助的过滤器。

查看您的代码,您应该能够解开它。只要确保足够晚地钩解钩即可。这不是一个好的解决方案,因为您正在破坏主题功能并且还必须知道主题正在使用的所有挂钩函数的名称。

有没有什么东西$fragments可以用来有条件地运行你的代码,剩下的就不用管了。$_POST$_GET

于 2012-12-23T15:50:01.313 回答