如何覆盖核心 Woocommerce 插件功能?
Posted
技术标签:
【中文标题】如何覆盖核心 Woocommerce 插件功能?【英文标题】:How can I override core Woocommerce plugin function? 【发布时间】:2015-01-06 04:45:11 【问题描述】:我正在尝试覆盖 Woocommerce Stripe 插件的输出 html。我该怎么做呢?我已经阅读了一些关于动作钩子和过滤器的文章和文档,但我相信这些仅适用于 Woocommerce 插件,而不适用于 Woo/Stripe 扩展插件。如果钩子或过滤器是解决方案,那会是什么样子?我可以修改核心文件或使用 JS,但这些都不是真正可行的解决方案......
我要修改的文件位于:
plugins/woocommerce-gateway-stripe/includes/class-wc-gateway-stripe.php
这是我要在该文件中修改的标记块:
/**
* Payment form on checkout page
*/
public function payment_fields()
$checked = 1;
?>
<fieldset>
<?php
if ( $this->description )
echo wpautop( esc_html( $this->description ) );
if ( $this->saved_cards && is_user_logged_in() && ( $customer_id = get_user_meta( get_current_user_id(), '_stripe_customer_id', true ) ) && is_string( $customer_id ) && ( $cards = $this->get_saved_cards( $customer_id ) ) )
?>
<p class="form-row form-row-wide">
<a class="button" style="float:right;" href="<?php echo apply_filters( 'wc_stripe_manage_saved_cards_url', get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ) ); ?>#saved-cards"><?php _e( 'Manage cards', 'woocommerce-gateway-stripe' ); ?></a>
<?php if ( $cards ) : ?>
<?php foreach ( (array) $cards as $card ) : ?>
<label for="stripe_card_<?php echo $card->id; ?>">
<input type="radio" id="stripe_card_<?php echo $card->id; ?>" name="stripe_card_id" value="<?php echo $card->id; ?>" <?php checked( $checked, 1 ) ?> />
<?php printf( __( '%s card ending in %s (Expires %s/%s)', 'woocommerce-gateway-stripe' ), (isset( $card->type ) ? $card->type : $card->brand ), $card->last4, $card->exp_month, $card->exp_year ); ?>
</label>
<?php $checked = 0; endforeach; ?>
<?php endif; ?>
<label for="new">
<input type="radio" id="new" name="stripe_card_id" <?php checked( $checked, 1 ) ?> value="new" />
<?php _e( 'Use a new credit card', 'woocommerce-gateway-stripe' ); ?>
</label>
</p>
<?php
?>
<div class="stripe_new_card" <?php if ( $checked === 0 ) : ?>style="display:none;"<?php endif; ?>
data-description=""
data-amount="<?php echo $this->get_stripe_amount( WC()->cart->total ); ?>"
data-name="<?php echo sprintf( __( '%s', 'woocommerce-gateway-stripe' ), get_bloginfo( 'name' ) ); ?>"
data-label="<?php _e( 'Confirm and Pay', 'woocommerce-gateway-stripe' ); ?>"
data-currency="<?php echo strtolower( get_woocommerce_currency() ); ?>"
data-image="<?php echo $this->stripe_checkout_image; ?>"
>
<?php if ( ! $this->stripe_checkout ) : ?>
<?php $this->credit_card_form( array( 'fields_have_names' => false ) ); ?>
<?php endif; ?>
</div>
</fieldset>
<?php
【问题讨论】:
【参考方案1】:您是正确的,在这种情况下,由于缺少操作/过滤器挂钩,您无法修改输出。 WooCommerce 的所有附加组件(或其他插件)不一定都是这种情况,这里恰好是这种情况。
我建议编写一个插件来扩展 Stripe 网关插件提供的类。仅覆盖 payment_fields()
函数以提供您自己的输出 - 请记住,您仍然需要确保基本插件所需的一切仍然存在。启用您的插件并在 WooCommerce 配置中选择它作为付款类型。
插件,my-stripe-gateway.php
require_once ABSPATH . '/wp-content/plugins/woocommerce-gateway-stripe/includes/class-wc-gateway-stripe.php';
if ( ! class_exists( 'WC_Gateway_Stripe' ) )
return;
require_once 'my-stripe-gateway-class.php';
/**
* Add the Gateway to WooCommerce
**/
function add_my_stripe_gateway( $methods )
$methods[] = 'My_Stripe_Gateway';
return $methods;
add_filter( 'woocommerce_payment_gateways', 'add_my_stripe_gateway' );
add_action( 'plugins_loaded', 'my_stripe_gateway_init', 0 );
自定义支付网关,my-stripe-gateway-class.php
<?php
class My_Stripe_Gateway extends WC_Gateway_Stripe // or whatever the class name is
// call the parent constructor, doesn't happen by default
public function __construct()
parent::__construct();
$this->id = 'my_stripe_gateway';
$this->method_title = 'My Stripe Gateway';
$this->method_description = 'Customized Stripe payment gateway.';
// override the payment_fields() function
public function payment_fields()
// reproduce/modify this function in your class
echo "whatever";
【讨论】:
谢谢!我相信我已经接近了。我已经激活了插件,但是当我到达运行该功能的页面(结帐页面,使用条纹插件的地方)时,我得到一个空白页面。我认为问题出在“my-stripe-gateway-class”文件中。我可以从该文件中回显文本,但是一旦我尝试扩展该类,它就会中断。这是回购 -> Github Repo 你需要扩展WC_Stripe
,我回答的时候不知道这个类叫什么。您的错误日志可能说明了这一点。 github.com/coreybruyere/shay-designs/blob/master/_production/…
啊,好吧,我以为我们正在扩展该函数所在的类。我将其更改为 WC_Stripe,我不再看到空白页,但现在我在该部分中看不到任何内容在前端。它正在删除核心功能但没有覆盖它?再次感谢!
我在测试后更新了代码中的一些内容。在它真正发挥作用之前,还需要做很多工作。
我想知道这些hooks 是否可以工作。我回家后一定要试试。但同样,我认为这些是 Woocommerce 特有的..以上是关于如何覆盖核心 Woocommerce 插件功能?的主要内容,如果未能解决你的问题,请参考以下文章