Расширение класса WC_Product в случае ошибки пользовательского плагина (класс WC_Product не найден)

Я пытаюсь расширить класс WC_Product, чтобы добавить «property1» и «property2» в защищенный массив $data, но когда я пытаюсь запустить свой плагин, он выдает следующую ошибку:

WC_Product не найден.

Вот мой код:

class WC_MyClass extends WC_Product {
    function __construct() {
        parent::__construct();
        array_push($data, "property1", "property2");
    }
}

Мне нужно расширить класс WC_Product в моем плагине.

Детали плагина: Мой плагин состоит в том, чтобы рассчитать стоимость доставки в соответствии с тарифом FedEx для моей страны. Для этого я использую плагин Woocommerce Table Rate Shipping. Проблема в том, что FedEx иногда учитывает не реальный вес, а объемный, поэтому я хочу сделать плагин, чтобы определить, какой вес больше, и присвоить его переменной. Идея состоит в том, чтобы установить вес доставки, чтобы использовать его для расчета стоимости доставки, а не изменять спецификацию веса продукта. Вот почему я пытаюсь расширить класс WC_Product, добавив в него свойство веса доставки. Я уже сделал все расчеты, теперь мне просто нужно сохранить вес доставки, чтобы использовать его с плагином Woocommerce Table Rate Shipping.

Документация: класс WC_Product — свойство $data


person Elisabet González    schedule 12.09.2017    source источник
comment
может быть include_once( WC_ABSPATH . 'includes/abstracts/abstract-wc-product.php' ); перед определением класса? Как вы используете свой WC_MyClass?   -  person jeger    schedule 12.09.2017
comment
Вы подключаете это для запуска после WooCommerce? add_action( 'init', 'my_wrapper_function' ); Например, как в этой статье: jeroensormani.com/adding-a-custom -woocommerce-тип продукта   -  person pants    schedule 12.09.2017
comment
@pants Я думаю, что нашел проблему, у меня было add_action('woocommerce_after_shop_loop_item', 'myFunction', 10);, но я написал часть класса из myFunction()   -  person Elisabet González    schedule 12.09.2017
comment
@jeger выдает ошибку Warning: include_once(WC_ABSPATH/includes/abstracts/abstract-wc-product.php): failed to open stream   -  person Elisabet González    schedule 12.09.2017
comment
Возможно, вам придется прочитать перед этой документацией по WooCommerce: Создание подключаемого модуля для WooCommerce и Реализация класса интеграции WC… Вы должны (возможно) объяснить что вы пытаетесь сделать в WooCommerce (обновляя свой вопрос), чтобы получить более точную помощь.   -  person LoicTheAztec    schedule 12.09.2017
comment
Вместо init мне нравится использовать woocommerce_loaded   -  person helgatheviking    schedule 12.09.2017
comment
@LoicTheAztec большое спасибо, я думаю, это поможет мне структурировать мой плагин.   -  person Elisabet González    schedule 12.09.2017
comment
@ElisabetGonzález Добро пожаловать. Вы всегда можете спросить здесь, если вам нужна дополнительная помощь... Эта документация должна помочь вам продвинуться намного дальше в процессе написания кода.   -  person LoicTheAztec    schedule 12.09.2017


Ответы (2)


Если у вас есть функция расширения сама по себе, классы WooCommerce еще не будут созданы. Вы должны добавить расширение класса к хуку init или woocommerce_init следующим образом:

add_action( 'init', 'register_myclass' );
function register_myclass() {
  class WC_MyClass extends WC_Product {
    /*now you can override whatever you like*/
  }
}
person Dave Hilditch    schedule 19.01.2018
comment
пожалуйста, проверьте это stackoverflow.com/questions/61551333/ Не уверен, что это та же проблема, хотя - person svelandiag; 02.05.2020

вы должны сказать php, что хотите сделать это с переменной класса

class WC_MyClass extends WC_Product {
  function __construct() {
    parent::__construct();
    $this->data[] = "property1";
    $this->data[] = "property2";
  }
}
person wodka    schedule 12.09.2017
comment
это не решает мою проблему, проблема в том, что класс WC_Product не найден. Я думаю, что проблема связана с каталогами, но я не хочу изменять файлы Woocommerce, я хочу использовать свой собственный плагин для изменения некоторых вещей Woocommerce, поэтому я не знаю, как получить доступ к классу WC_Product. - person Elisabet González; 12.09.2017
comment
Вы добавили и включили свой плагин в wordpress? - person wodka; 12.09.2017
comment
да, на самом деле у меня раньше не было проблем с моим плагином, потому что я не расширял класс. Я закодировал только логическую часть своего плагина, но теперь я хочу сохранить значение непосредственно в классе Woocommerce, но для этого мне нужно добавить новый элемент в защищенный массив, поэтому я хочу расширить этот класс. - person Elisabet González; 12.09.2017
comment
@ ElisabetGonzález, вы случайно не нашли для этого рабочего решения? В настоящее время я сталкиваюсь с такой же ситуацией. Мне нужно расширить класс WC_Product, чтобы добавить некоторые элементы в защищенный массив $data, а также добавить некоторые новые функции, но я не могу заставить его работать. Не могли бы вы помочь? - person Rob; 05.05.2020