#php #wordpress #woocommerce #product #product-variations
#php #wordpress #woocommerce #продукт #вариации продукта
Вопрос:
Я разработал пользовательскую информацию о времени доставки для вариантов. Но по какой-то причине я не могу получить идентификатор родительского продукта вариации, чтобы использовать его в своей функции. Я попробовал следующее — если я установлю $id прямо в 51237, мой код будет работать, но при использовании $post для получения идентификатора это не так. Любая помощь приветствуется!
// here I am loading special infos for each variation
add_filter( 'woocommerce_available_variation', 'load_variation_products_fields', 1 );
function load_variation_products_fields( $variations ) {
$variations['variation_cmpzDeliveryTime'] = get_delivery_time( $variations[ 'variation_id' ] ) ;
return $variations;
}
function get_delivery_time ( $product_id) {
$product_obj = wc_get_product( $product_id );
// here I want the post ID (so the parent product ID if the product type is variation)
global $post;
$id = $post->ID;
var_dump ($id); // this outputs "int(51237)" for each variation - that seems to be right!
switch($product_obj->get_type()) {
case 'variation':
if (Helpers::get_product_multi_inventory_status($product_id) == 'no' ) {
$_pf = new WC_Product_Factory();
$_product = $_pf->get_product($product_id);
$stock_status = $_product->get_stock_status();
if ( wc_gzd_get_product( $product_id )->get_delivery_time_html() == '' ) {
if ( ($stock_status == 'instock') ) {
// $id is ignored - if I put here 51237, it works!
return set_delivery_text('instock', $id);
} else {
return set_delivery_text('outofstock');
}
}
}
elseif (Helpers::get_product_multi_inventory_status($product_id) == 'yes' ) {
return get_delivery_time_multi_inventory($product_id);
}
break;
}
}
Ответ №1:
В вашей функции, подключенной к woocommerce_available_variation
… Вам нужно заменить его на:
// here I am loading special infos for each variation
add_filter( 'woocommerce_available_variation', 'load_variation_products_fields', 10, 3 );
function load_variation_products_fields( $variation_data, $product, $variation ) {
$variation_data['variation_cmpzDeliveryTime'] = get_delivery_time( $variation_data, $product, $variation ) ;
return $variation_data;
}
Теперь, как вы можете видеть, есть 3 аргумента, где $product
родительская переменная product object и $variation
объект product variation .
Таким образом, вы измените, вам также придется изменить get_delivery_time()
код функции примерно так:
function get_delivery_time ( $variation_data, $product, $variation ) {
$variation_id = $variations['variation_id']; // or $variation->get_id();
$is_in_stock = $variation['is_in_stock']; // is variation "in stock"
$parent_product_id = $product->get_id(); // The parent variable product Id
// var_dump($parent_product_id);
if ( Helpers::get_product_multi_inventory_status($variation_id) == 'no' ) {
if ( wc_gzd_get_product( $variation_id )->get_delivery_time_html() == '' ) {
if ( $is_in_stock ) {
return set_delivery_text('instock', $parent_product_id);
} else {
return set_delivery_text('outofstock');
}
}
} else {
return get_delivery_time_multi_inventory($variation_id);
}
}
это должно работать лучше.
Комментарии:
1. Хорошо, ваш код работает лучше, чем мой код, спасибо. Итак, очевидно, что невозможно получить доступ к $post внутри woocommerce_available_variation хук?
2. @m3rlin Да, вы можете попробовать получить к нему доступ с помощью
global $post;
или наверняка с помощью$post = get_post( $product->get_id() );
… вы получите объект родительской переменной product WP_Post. Мне любопытно, зачем вам нужен объект post?3. просто спрашиваю… Я потратил так много времени, пытаясь выяснить, почему это не работает, поэтому я хотел знать 🙂 но ваше решение лучше
4. @m3rlin При использовании хуков всегда проверяйте, какие аргументы доступны в подключенной функции, вы потеряете гораздо меньше времени: github.com/woocommerce/woocommerce/blob/4.5.2/includes /…