Я пытаюсь переопределить вывод HTML из плагина Woocommerce Stripe. Как бы я поступил так? Я читал некоторые статьи и документы о хуках и фильтрах действий, но я считаю, что они предназначены только для плагина Woocommerce, а не для расширения Woo / Stripe. Если бы крюк или фильтр был решением, как бы это выглядело? Я мог бы изменить основные файлы или использовать JS, но это не совсем реальные решения …
Файл, который я пытаюсь изменить, находится в:
плагинов / WooCommerce-шлюз-полоса / включает / класс-WC-шлюз-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
}
Вы правы, что в этом случае вы не можете изменить вывод из-за отсутствия хуков действия / фильтра. Это не обязательно относится ко всем дополнениям к WooCommerce (или другим плагинам в этом отношении), просто так и происходит.
Я бы порекомендовал написать плагин, расширяющий класс, предоставляемый плагином Stripe gateway. Переопределить только 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";
}
}
Других решений пока нет …