WooCommerce 问题:class WC_Product_Variation 的对象无法转换为 int
WooCommerce issue: Object of class WC_Product_Variation could not be converted to int
我构建了一个插件来使用 Woocommerce 的快速编辑来访问和修改一些产品字段。在商店里,我有 Simple
和 Variable
产品。每个 Variable
产品有两个属性:Kg
和 Pièce
。
有哪些不同的字段?
有两个字段获取每个 Variable
产品的两个变体的 regular price
。
我还需要一个称为 _number_field
的 custom field
,它与其中一个变体的信息完全相同。此自定义字段获取其中一种变体(具有属性“Kg”)的正常价格。
我需要什么?
对于 custom field
,我需要访问每个 Variable
产品的两个可用版本之一的 regular_price
。
为了访问此变体的正常价格,我使用正确的(已创建的)变体 ID 创建了一个新的 WC_Product_Variation
class。
我还需要获取每个变体的 regular_price
。
获取自定义字段的代码
以下代码(只是完整代码的一部分)是通过动作woocommerce_product_options_general_product_data
发送的。
// Getting both variations IDs of the product
$children = $product->get_children();
// I'm setting the default variation to the first variation ID
$default_variation_id = $children[0];
// I'm creating a first variation with the first variation ID in order to get it's attribute
$product_variation = new WC_Product_Variation($default_variation_id);
// I can now compare it's attribute with the string "Kg".
// If it is true that means that the first variation ID has Kg has an attribute
// Otherwise I want the second variation, with has the string "Pièce" has an attribute
$product_variation->get_attribute("unite-de-commande") === "Kg" ? $default_variation_id = $children[0] : $default_variation_id = $children[1];
// Then I can get the right variation this way
$product_variation = new WC_Product_Variation($default_variation_id);
// I can finally get the regular price of this product variation
$product_default_kg = $product_variation->get_regular_price();
我遇到的问题
问题是快速编辑字段中的值不保存,除了第一个值,这是我使用 new WC_Product_Variation
class.
访问的唯一值
在日志中,我可以看到当前错误:Object of class WC_Product_Variation could not be converted to int
。
其他两个值无法使用此特定 class 访问。
这是我用来保存其他两个字段的代码的摘录。
这仅包括其中一种变体。
获取变体之一的正常价格的代码
$variations = $product->get_children();
$product_var_0_id = wc_get_product( $variations[0] );
$product_0 = wc_get_product( $product_var_0_id );
$product_0_def_attr = $product_0->get_attribute( 'unite-de-commande' );
if ( isset( $_REQUEST['_prix_variable_'. $product_0_def_attr] ) && $product_0_def_attr === "Kg") {
$prix_variable_0 = $_REQUEST['_prix_variable_'. $product_0_def_attr];
// Updating active price and regular price
update_post_meta( $product_var_0_id, '_regular_price', $prix_variable_0 );
update_post_meta( $product_var_0_id, '_price', $prix_variable_0 );
wc_delete_product_transients( $product_var_0_id ); // Clear/refresh the variation cache
}
你能帮我理解为什么会出现这个错误吗?
谢谢。
在您的第一个代码中,您无法从以下位置获得正确的产品变体 ID:
// I can now compare it's attribute with the string "Kg".
// If it is true that means that the first variation ID has Kg has an attribute
// Otherwise I want the second variation, with has the string "Pièce" has an attribute
$product_variation->get_attribute("unite-de-commande") === "Kg" ? $default_variation_id = $children[0] : $default_variation_id = $children[1];
因为这没有提供您可以在以下中使用的变体 ID:
// Then I can get the right variation this way $prod
$product_variation = new WC_Product_Variation($default_variation_id);
改为使用以下 (因为父变量产品只有两个变体):
// Getting all variations IDs of the variable product
$children_ids = $product->get_children();
// Get first WC_Product_Variation instance Object
$variation = wc_get_product(reset($children_ids));
// Check if specific product attribute value is set on the first variation
if( $variation->get_attribute("unite-de-commande") !== "Kg" ) {
// If not we get the 2nd WC_Product_Variation instance Object
$variation = wc_get_product($children[1]);
}
// I can finally get the regular price of the right product variation
$regular_price = $variation->get_regular_price();
现在应该可以更好地工作了。
在您的第二个代码片段中,这一行有问题:
$product_0 = wc_get_product( $product_var_0_id );
因为 $product_var_0_id
不是预期的产品 变体 ID ,而是 WC_Product_Variation()
对象实例。
也可以用WC_Product
方法代替,正确的代码应该是:
$children_ids = $product->get_children();
$fist_variation = wc_get_product( reset($children_ids) );
$fist_attr_udc_value = $fist_variation->get_attribute( 'unite-de-commande' );
if ( isset( $_REQUEST['_prix_variable_'. $fist_attr_udc_value] ) && $fist_attr_udc_value === "Kg") {
$first_variable_price = esc_attr($_REQUEST['_prix_variable_'. $fist_attr_udc_value]);
// Updating active price and regular price
$fist_variation->set_regular_price( $first_variable_price );
$fist_variation->set_price( $first_variable_price );
$fist_variation->save() // Save data and Clear/refresh caches and transients
}
第二个代码片段应该可以工作。
我构建了一个插件来使用 Woocommerce 的快速编辑来访问和修改一些产品字段。在商店里,我有 Simple
和 Variable
产品。每个 Variable
产品有两个属性:Kg
和 Pièce
。
有哪些不同的字段?
有两个字段获取每个 Variable
产品的两个变体的 regular price
。
我还需要一个称为 _number_field
的 custom field
,它与其中一个变体的信息完全相同。此自定义字段获取其中一种变体(具有属性“Kg”)的正常价格。
我需要什么?
对于 custom field
,我需要访问每个 Variable
产品的两个可用版本之一的 regular_price
。
为了访问此变体的正常价格,我使用正确的(已创建的)变体 ID 创建了一个新的 WC_Product_Variation
class。
我还需要获取每个变体的 regular_price
。
获取自定义字段的代码
以下代码(只是完整代码的一部分)是通过动作woocommerce_product_options_general_product_data
发送的。
// Getting both variations IDs of the product
$children = $product->get_children();
// I'm setting the default variation to the first variation ID
$default_variation_id = $children[0];
// I'm creating a first variation with the first variation ID in order to get it's attribute
$product_variation = new WC_Product_Variation($default_variation_id);
// I can now compare it's attribute with the string "Kg".
// If it is true that means that the first variation ID has Kg has an attribute
// Otherwise I want the second variation, with has the string "Pièce" has an attribute
$product_variation->get_attribute("unite-de-commande") === "Kg" ? $default_variation_id = $children[0] : $default_variation_id = $children[1];
// Then I can get the right variation this way
$product_variation = new WC_Product_Variation($default_variation_id);
// I can finally get the regular price of this product variation
$product_default_kg = $product_variation->get_regular_price();
我遇到的问题
问题是快速编辑字段中的值不保存,除了第一个值,这是我使用 new WC_Product_Variation
class.
在日志中,我可以看到当前错误:Object of class WC_Product_Variation could not be converted to int
。
其他两个值无法使用此特定 class 访问。 这是我用来保存其他两个字段的代码的摘录。 这仅包括其中一种变体。
获取变体之一的正常价格的代码
$variations = $product->get_children();
$product_var_0_id = wc_get_product( $variations[0] );
$product_0 = wc_get_product( $product_var_0_id );
$product_0_def_attr = $product_0->get_attribute( 'unite-de-commande' );
if ( isset( $_REQUEST['_prix_variable_'. $product_0_def_attr] ) && $product_0_def_attr === "Kg") {
$prix_variable_0 = $_REQUEST['_prix_variable_'. $product_0_def_attr];
// Updating active price and regular price
update_post_meta( $product_var_0_id, '_regular_price', $prix_variable_0 );
update_post_meta( $product_var_0_id, '_price', $prix_variable_0 );
wc_delete_product_transients( $product_var_0_id ); // Clear/refresh the variation cache
}
你能帮我理解为什么会出现这个错误吗?
谢谢。
在您的第一个代码中,您无法从以下位置获得正确的产品变体 ID:
// I can now compare it's attribute with the string "Kg".
// If it is true that means that the first variation ID has Kg has an attribute
// Otherwise I want the second variation, with has the string "Pièce" has an attribute
$product_variation->get_attribute("unite-de-commande") === "Kg" ? $default_variation_id = $children[0] : $default_variation_id = $children[1];
因为这没有提供您可以在以下中使用的变体 ID:
// Then I can get the right variation this way $prod
$product_variation = new WC_Product_Variation($default_variation_id);
改为使用以下 (因为父变量产品只有两个变体):
// Getting all variations IDs of the variable product
$children_ids = $product->get_children();
// Get first WC_Product_Variation instance Object
$variation = wc_get_product(reset($children_ids));
// Check if specific product attribute value is set on the first variation
if( $variation->get_attribute("unite-de-commande") !== "Kg" ) {
// If not we get the 2nd WC_Product_Variation instance Object
$variation = wc_get_product($children[1]);
}
// I can finally get the regular price of the right product variation
$regular_price = $variation->get_regular_price();
现在应该可以更好地工作了。
在您的第二个代码片段中,这一行有问题:
$product_0 = wc_get_product( $product_var_0_id );
因为 $product_var_0_id
不是预期的产品 变体 ID ,而是 WC_Product_Variation()
对象实例。
也可以用WC_Product
方法代替,正确的代码应该是:
$children_ids = $product->get_children();
$fist_variation = wc_get_product( reset($children_ids) );
$fist_attr_udc_value = $fist_variation->get_attribute( 'unite-de-commande' );
if ( isset( $_REQUEST['_prix_variable_'. $fist_attr_udc_value] ) && $fist_attr_udc_value === "Kg") {
$first_variable_price = esc_attr($_REQUEST['_prix_variable_'. $fist_attr_udc_value]);
// Updating active price and regular price
$fist_variation->set_regular_price( $first_variable_price );
$fist_variation->set_price( $first_variable_price );
$fist_variation->save() // Save data and Clear/refresh caches and transients
}
第二个代码片段应该可以工作。