在插件中扩展 WooCommerce COD 支付网关

Extending WooCommerce COD payment gateway in a plugin

我想了解各种 classes 在 Wordpress 中的加载顺序。 Wordpress 中有很多插件,那么谁会比另一个更早加载。

考虑一下我想开发一个插件,它将使用一些现有的 class Woocommerce。基本上我的自定义插件将扩展 Woocommerce 的一些 class(例如:WC_Gateway_COD)

如何确保现有的 class ‘WC_Gateway_COD’ 在执行以下语句之前已经定义并加载?

if (class_exists('WC_Gateway_COD')) {
     class WC_my_custom_class extends WC_Gateway_COD {
             …..
             ….
     }
}  

要根据现有的 WooCommerce 支付方式制作自定义网关作为 COD,建议 copy the source code from WC_Gateway_COD Class 在插件中 (根据您的需要调整代码) 喜欢:

defined( 'ABSPATH' ) or exit;
// Make sure WooCommerce is active
if ( ! in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    return;
}

add_filter( 'woocommerce_payment_gateways', 'wc_custom_add_to_gateways' );
function wc_custom_add_to_gateways( $gateways ) {
    $gateways[] = 'WC_Gateway_COD2';
    return $gateways;
}

add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'wc_gateway_custom_plugin_links' );
function wc_gateway_custom_plugin_links( $links ) {
    $plugin_links = array(
        '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=checkout&section=cod2' ) . '">' . __( 'Configure', 'payment_cod2' ) . '</a>'
    );
    return array_merge( $plugin_links, $links );
}

add_action( 'plugins_loaded', 'wc_gateway_cod2_init', 11 );
function wc_gateway_cod2_init() {
    class WC_Gateway_COD2 extends WC_Payment_Gateway {

        public $domain; // The text domain (optional)

        /**
         * Constructor for the gateway.
         */
        public function __construct() {
            $this->domain = 'payment_cod2'; // text domain name (for translations)

            // Setup general properties.
            $this->setup_properties();
    
            // Load the settings.
            $this->init_form_fields();
            $this->init_settings();
    
            // Get settings.
            $this->title              = $this->get_option( 'title' );
            $this->description        = $this->get_option( 'description' );
            $this->instructions       = $this->get_option( 'instructions' );
            $this->enable_for_methods = $this->get_option( 'enable_for_methods', array() );
            $this->enable_for_virtual = $this->get_option( 'enable_for_virtual', 'yes' ) === 'yes';
    
            add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
            add_action( 'woocommerce_thankyou_' . $this->id, array( $this, 'thankyou_page' ) );
            add_filter( 'woocommerce_payment_complete_order_status', array( $this, 'change_payment_complete_order_status' ), 10, 3 );
    
            // Customer Emails.
            add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 );
        }
    
        /**
         * Setup general properties for the gateway.
         */
        protected function setup_properties() {
            $this->id                 = 'cod2';
            $this->icon               = apply_filters( 'woocommerce_cod2_icon', '' );
            $this->method_title       = __( 'Cash on delivery', 'woocommerce' );
            $this->method_description = __( 'Have your customers pay with cash (or by other means) upon delivery.', 'woocommerce' );
            $this->has_fields         = false;
        }

        // and so on (the rest of the code)…
    }
}

您可以取消设置/删除原始 COD 支付网关,更改第一个功能,如:

add_filter( 'woocommerce_payment_gateways', 'wc_custom_add_to_gateways' );
function wc_custom_add_to_gateways( $gateways ) {
    $gateways[] = 'WC_Gateway_COD2';

    unset($gateways['WC_Gateway_COD']; // Remove COD gateway

    return $gateways;
}