Проблема
Вы получили это предупреждение, потому что метод read_price_data()
(на момент написания) только доступен в классе WC_Product_Variable_Data_Store_CPT
, а неиспользуемый по умолчанию для пользовательского типа продукта, который равен WC_Product_Data_Store_CPT
.
Однако, несмотря на то, что у класса по умолчанию нет метода read_price_data()
, вызов его из экземпляра классане приводит к исключению / ошибке, потому что этот класс создается с помощью класса WC_Data_Store
, который имеет магический метод __call()
.
// Case 1: In WC_Product_Variable::get_variation_prices().
// $this->data_store is an instance of WC_Product_Variable_Data_Store_CPT
$prices = $this->data_store->read_price_data( $this, $for_display ); // array
// Case 2: In WC_Product_Variable_CanopyTour::get_variation_prices().
// $this->data_store is an instance of WC_Product_Data_Store_CPT
$prices = $this->data_store->read_price_data( $this, $for_display ); // null
Но поскольку ожидается, что метод read_price_data()
вернет array
, и все же он не (или что он возвращает null
), поэтому PHP выдает " недопустимый аргумент, предоставленный для foreach () ... "предупреждение:
// The following code throws a warning.
foreach ( null as $key => $value ) {
...
}
Решение
Вам необходимо использовать правильное хранилище данных класс для вашей пользовательской (переменной)Тип продукта.
Т.е. добавить элемент в WC_Data_Store::$stores
array
, где ключом является (переменный) тип продукта предварительно.фиксируется с product-
(поэтому в вашем случае это будет product-variable_canopytour
), а значением является class
, который обрабатывает хранилище данных (например, WC_Product_Variable_Data_Store_CPT
, как в примере ниже).
Это можно сделать с помощью фильтра woocommerce_data_stores
, например, так: (добавить в файл functions.php
активной темы)
add_filter( 'woocommerce_data_stores', function( $stores ){
$stores['product-variable_canopytour'] = 'WC_Product_Variable_Data_Store_CPT';
return $stores;
} );
Дополнительные примечания
Конструктордля WC_Product_Variable_CanopyTour
должно быть определено таким же образом родительский элемент class
определяет его, где $product
является необязательным и по умолчанию он равен нулю (0
), например так:
class WC_Product_Variable_CanopyTour extends WC_Product_Variable {
public function __construct( $product = 0 ) {
$this->product_type = 'variable_canopytour';
parent::__construct( $product );
}
...
}