Woocommerce: указан неверный аргумент для foreach () в файле class-wc-product-variable.php - PullRequest
0 голосов
/ 04 октября 2018

Я создаю тип переменного продукта, настроенного для моей темы, мне удалось отобразить его в раскрывающемся списке данных продукта, и его можно сохранить, не вызывая конфликтов.Проблема в том, что при просмотре продукта во внешнем интерфейсе возникает следующая ошибка:

Предупреждение: неверный аргумент указан для foreach () в / Applications / MAMP / htdocs / canopy / wp-content /плагины / Woocommerce / includes / class-wc-product-variable.php в строке 83

Я отследил проблему до файла Wordpress/includes/data-stores/class-wc-product-variable-data-store-cpt.php но правдаявляется то, что я не знаю, что еще делать.

Я оставляю код, который я написал для этого:

WC_Product_variable_canopytour.php

class WC_Product_Variable_CanopyTour extends WC_Product_Variable {
    public function __construct( $product ) {
        $this->product_type = 'variable_canopytour';
        parent::__construct( $product );
    }

    public function get_type() {
        return 'variable_canopytour';
    }
}

class-woocommerce-custom-product.php

class WCB_Woocommerce_CanopyTour_Product_Type {
    private $wcb;
    private $version;

    public function __construct( $wcb, $version ) {
        $this->wcb = $wcb;
        $this->version = $version;
    }

    public function register_canopytour_product_type() {
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );

        include_once(get_template_directory() . 'woocommerce/WC_Product_variable_canopytour.php');
    }

    public function add_canopytour_product( $types ) {
        $types[ 'variable_canopytour' ] = __( 'Variable Canopy Tour', $this->wcb );
        return $types;
    }

    public function get_tour_product_class($classname, $product_type) {
        if ( $product_type === "variable_canopytour" ) {
            $classname = 'WC_Product_Variable_CanopyTour';
        }
        return $classname;
    }

    public function wcb_admin_footer() {
        if ( 'product' != get_post_type() ) :
            return;
        endif;

        ?><script type='text/javascript'>
            jQuery( document ).ready( function() {
                jQuery( '.options_group.pricing' ).addClass( 'show_if_variable_canopytour show_if_simple show_if_external' ).show();
                jQuery( 'li.general_options.general_tab' ).addClass( 'show_if_variable_canopytour show_if_simple show_if_external' ).show();
                jQuery( '.variations_options.variations_tab' ).addClass( 'show_if_variable_canopytour' ).show();
                jQuery( '.enable_variation' ).addClass( 'show_if_variable_canopytour' ).show();
            });
        </script><?php
    }

    function hide_wcb_data_panel( $tabs) {
        // Other default values for 'attribute' are; general, inventory, shipping, linked_product, variations, advanced
        $tabs['shipping']['class'][] = 'hide_if_variable_canopytour';
        return $tabs;
    }
}

functions.php

include_once get_template_directory() . 'includes/woocommerce/class-woocommerce-custom-product.php';
$woo_ct = new WCB_Woocommerce_CanopyTour_Product_Type( "wcb", "1.0" );

add_action( 'init', array($woo_ct, 'register_canopytour_product_type') );
add_filter( 'product_type_selector', array($woo_ct, 'add_canopytour_product') );
add_filter( 'woocommerce_product_class', array($woo_ct, 'get_tour_product_class'), 10, 2 ); 
add_action( 'admin_head', array($woo_ct, 'wcb_admin_head') );
add_filter( 'woocommerce_product_data_tabs', array($woo_ct, 'hide_wcb_data_panel') );

Я надеюсь, что кто-то может помочь мне понятьчто происходит: (

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Проблема

Вы получили это предупреждение, потому что метод 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 );
    }

    ...
}
0 голосов
/ 09 октября 2018

Ошибка происходит от здесь .Он просто говорит вам, что переменная $prices, используемая в цикле foreach, не относится к типу, который вы можете перебирать.Цены выбираются с использованием

$prices = $this->data_store->read_price_data( $this, $for_display );

Так что все, что возвращается из этого вызова read_price_data, не соответствует ожиданиям остальных кодов.Я не уверен, как именно эта система работает и что нужно, когда вы расширяете WC_Product_Variable и т. Д., И я не могу настроить систему для ее отладки.Но если вы проследите стек вызовов назад от этой точки назад, вы, вероятно, узнаете, почему эти неожиданные данные возвращаются из этой функции.

Чутье говорит, что это может быть важной частью, которую вы забыли добавить, когда расширяликласс или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...