以送货方式init - Woocommerce获取所有送货课程

时间:2018-04-17 04:46:36

标签: php wordpress woocommerce

我在Woocommerce Shipping Method API之后创建了一种自定义送货方式。在我的送货方法类的init方法中,我正在尝试使用WC()->shipping->get_shipping_classes()获取所有送货类。

此调用因PHP致命错误而失败:
致命错误:未捕获错误:在null上调用成员函数get_shipping_classes()...
这表明WC()->shippingnull,它基本上是WC_Shipping类的实例。

我的做法类似于Woocommerce核心的统一运费方式。类似的代码在Woocommerce中工作,如here所示 这是我的送货方法类:

class WCS_City_Shipping_Method extends WC_Shipping_Flat_Rate {

    /**
     * Cities applicable on
     * 
     * @var array
     */
    public $cities = array();

    /**
     * Constructor.
     *
     * @since 1.0.0
     */
    public function __construct( $instance_id = 0 ) {

        $this->id                 = 'city_shipping';
        $this->instance_id        = absint( $instance_id );
        $this->method_title       = __( 'Flat Rate City Shipping', 'woocommerce-city-shipping' );
        $this->method_description = __( 'Applies only when shipping city matches one of provided.', 'woocommerce-city-shipping' );
        $this->supports           = array( 'shipping-zones', 'instance-settings', );

        $this->init();

        // Save settings
        add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
    }


    /**
     * Init.
     *
     * Initialize user set variables.
     *
     * @since 1.0.0
     */
    public function init() {
        $this->instance_form_fields = include( 'settings-city-shipping.php' );
        $this->title                = $this->get_option( 'title' );
        $this->tax_status           = $this->get_option( 'tax_status' );
        $this->cities               = $this->get_option( 'cities' );
        $this->cost                 = $this->get_option( 'cost' );
        $this->type                 = $this->get_option( 'type', 'class' );
    }

    /**
     * ... Rest of code
     * 
     */
}

这里settings-city-shipping.php包含在init方法中。

<?php

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

$shipping_classes = WC()->shipping->get_shipping_classes(); // Fatal error here 

使用过滤器添加送货方式:

// Add shipping method
add_filter( 'woocommerce_shipping_methods', array( $this, 'add_shipping_method_class' ) );
public function add_shipping_method_class( $methods ) {

    if ( class_exists( 'WCS_City_Shipping_Method' ) ) {
        $methods['city_shipping'] = 'WCS_City_Shipping_Method';
    }
    return $methods;

}

请帮助查找导致致命错误的原因以及如何获取所有送货课程。

1 个答案:

答案 0 :(得分:0)

这是一个愚蠢的错误。我已经在这个自定义送货方法的插件类的初始化代码中初始化了WCS_City_Shipping_Method类。代码在Woocommerce准备好之前运行,因此导致致命错误。

我错过了Woocommerce Shipping API documentation中的这一重要内容:

  

为了确保你需要扩展的类存在,你应该包装你的   在加载所有插件后调用的函数中的类。

无论如何,我通过不初始化类并将其包装到一个在plugins_loaded动作钩子上运行的方法来解决问题。以下是更改:

public function plugins_loaded_action() {
    // Load shipping method class
    add_action( 'woocommerce_shipping_init', array( $this, 'wcs_shipping_method' ) );
}

// Placed in plugin class init method
add_action( 'plugins_loaded', array( $this, 'plugins_loaded_action' ) );

public function wcs_shipping_method() {
    require_once plugin_dir_path( __FILE__ ) . 'includes/class-wcs-method.php';
}