如何为 WooCommerce 创建简单的离线支付网关?

How to create simple Offline payment gateway for WooCommerce?

下午好,我想在我的商店中简单复制一个货到付款 (COD) 付款方式,并将其重命名为 Coupon on Delivery。 如何实现?

向上 我试过这段代码,但它在 WC 设置页面上显示错误 500:

<?php
/**
 * Plugin Name: My New WooCommerce Gateway
 * Plugin URI:
 * Description: WooCommerce gateway to ....
 * Author: .....
 * Version: 1.0
 * Author URI: https://example.org/
 * Text Domain: woocommerce-my-gateway
 * Domain Path: /languages/
 */

add_action( 'plugins_loaded', 'init_my_gateway_class' );

function init_my_gateway_class() {
    if ( !class_exists( 'WooCommerce' ) ) return;
    class WC_Gateway_COD_Renamed extends WC_Payment_Gateway {
    }
}

function add_my_gateway_class( $methods ) {
    $methods[] = 'WC_Gateway_my_gateway';
    return $methods;
}
add_filter( 'woocommerce_payment_gateways', 'add_my_gateway_class' );

function my_load_textdomain(){
    load_plugin_textdomain( 'woocommerce-my-gateway', false, dirname( plugin_dir_path( __FILE__ ) . '/languages/' ) );
}
add_action('plugins_loaded', 'my_load_textdomain');

Source of code

在 WooCommerce 插件中,您可以从管理部分启用支付网关 COD:

管理员 >> WooCommerce >> 设置 >> 结帐 >> 货到付款。

选中启用 COD 的选项。

请参考下面link创建离线支付网关。

How to Create A WooCommerce Payment gateway

在您的主插件文件中,您可以包含 class 并同时过滤网关:

function add_my_gateway_class( $methods ) {
    include( 'class-wc-gateway-cod-renamed.php');
    $methods[] = 'WC_Gateway_COD_Renamed';
    return $methods;
}
add_filter( 'woocommerce_payment_gateways', 'add_my_gateway_class' );

没有必要以这种方式检查 WooCommerce 是否处于活动状态,因为 woocommerce_payment_gateways 仅在 WooCommerce 为 运行 时才存在。

然后在另一个名为 class-wc-gateway-cod-renamed.php 的文件中,您可以定义 class:

class WC_Gateway_COD_Renamed extends WC_Gateway_COD {

    /**
     * Setup general properties for the gateway.
     */
    protected function setup_properties() {
        $this->id                 = 'coupon-on-delivery';
        $this->icon               = apply_filters( 'woocommerce_coupon-on-deliver_icon', '' );
        $this->method_title       = __( 'Coupon on delivery', 'your-plugin' );
        $this->method_description = __( 'Have your customers pay with a coupon upon delivery.', 'your-plugin' );
        $this->has_fields         = false;
    }

    /**
     * Initialise Gateway Settings Form Fields.
     */
    public function init_form_fields() {
        $shipping_methods = array();

        foreach ( WC()->shipping()->load_shipping_methods() as $method ) {
            $shipping_methods[ $method->id ] = $method->get_method_title();
        }

        $this->form_fields = array(
            'enabled' => array(
                'title'       => __( 'Enable/Disable', 'your-plugin' ),
                'label'       => __( 'Enable coupon on delivery', 'your-plugin' ),
                'type'        => 'checkbox',
                'description' => '',
                'default'     => 'no',
            ),
            'title' => array(
                'title'       => __( 'Title', 'your-plugin' ),
                'type'        => 'text',
                'description' => __( 'Payment method description that the customer will see on your checkout.', 'your-plugin' ),
                'default'     => __( 'coupon on delivery', 'your-plugin' ),
                'desc_tip'    => true,
            ),
            'description' => array(
                'title'       => __( 'Description', 'your-plugin' ),
                'type'        => 'textarea',
                'description' => __( 'Payment method description that the customer will see on your website.', 'your-plugin' ),
                'default'     => __( 'Pay with coupon upon delivery.', 'your-plugin' ),
                'desc_tip'    => true,
            ),
            'instructions' => array(
                'title'       => __( 'Instructions', 'your-plugin' ),
                'type'        => 'textarea',
                'description' => __( 'Instructions that will be added to the thank you page.', 'your-plugin' ),
                'default'     => __( 'Pay with coupon upon delivery.', 'your-plugin' ),
                'desc_tip'    => true,
            ),
            'enable_for_methods' => array(
                'title'             => __( 'Enable for shipping methods', 'your-plugin' ),
                'type'              => 'multiselect',
                'class'             => 'wc-enhanced-select',
                'css'               => 'width: 400px;',
                'default'           => '',
                'description'       => __( 'If coupon upon delivery is only available for certain methods, set it up here. Leave blank to enable for all methods.', 'your-plugin' ),
                'options'           => $shipping_methods,
                'desc_tip'          => true,
                'custom_attributes' => array(
                    'data-placeholder' => __( 'Select shipping methods', 'your-plugin' ),
                ),
            ),
            'enable_for_virtual' => array(
                'title'             => __( 'Accept for virtual orders', 'your-plugin' ),
                'label'             => __( 'Accept coupon if the order is virtual', 'your-plugin' ),
                'type'              => 'checkbox',
                'default'           => 'yes',
            ),
       );
    }
}

扩展 WC_Gateway_COD class 以便您可以从中继承方法,并且只覆盖与事物命名有关的方法。