1 回答
TA贡献1860条经验 获得超8个赞
注意:从 WooCommerce 3 和 4 开始,最好使用
WC_Product
可用的方法,因为有新的自定义表和缓存数据需要更新。
有一种方法可以显示或隐藏产品目录中的可变产品(有点复杂)。
1)。一个轻量级条件函数,用于检查可变产品的所有产品变体是否“缺货”:
// Conditional function to check if a variable product has at least a variation in stock
function is_wc_variable_product_in_stock( $product_id ){
global $wpdb;
$count = $wpdb->get_var( $wpdb->prepare( "
SELECT COUNT(ID)
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm
ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND p.post_status = 'publish'
AND p.post_parent = %d
AND pm.meta_key = '_stock_status'
AND pm.meta_value != 'outofstock'
", $product_id ) );
return $count > 0 ? true : false;
}
代码位于活动子主题(或活动主题)的 function.php 文件中。下面需要这个函数,所以保留它。
2)。一个自定义函数,将检查所有可变产品(及其所有变体库存),添加自定义元数据(此函数将仅使用一次,然后删除)。
// Function that will check the variations stock for each variable products adding custom meta data
function check_and_update_all_variable_products(){
// Only for admins
if( ! current_user_can('edit_products')) return;
// get all variable product Ids
$variable_products_ids = wc_get_products( array(
'limit' => -1,
'status' => 'publish',
'type' => 'variable',
'return' => 'ids',
));
// Loop through variable products
foreach( $variable_products_ids as $variable_id ) {
// Check if all the product variations are "out of stock" or not
$value = is_wc_variable_product_in_stock( $variable_id ) ? '0' : '1';
$meta_value = (string) get_post_meta( $variable_id, '_all_variations_outofstock', true );
if ( $value !== $meta_value ) {
// Create/Udpate custom meta data
update_post_meta( $variable_id, '_all_variations_outofstock', $value );
}
}
}
// Run the function: browse any page of your web site
check_and_update_all_variable_products();
代码位于活动子主题(或活动主题)的 function.php 文件中。保存后,浏览您网站的任何页面即可运行此功能。然后将其删除。
3)。现在,一个钩子函数将隐藏您的变量产品,这些产品的变体都是“缺货”,来自 WooCommerce 目录和单个产品页面:
// Hide product variations which variations are all "out of stock"
add_action( 'woocommerce_product_query', 'hide_variable_products_with_all_outofstock_variations', 10, 2 );
function hide_variable_products_with_all_outofstock_variations( $q, $query ) {
// Get any existing meta query
$meta_query = $q->get( 'meta_query');
// Define an additional meta query
$meta_query['relation'] = 'OR';
$meta_query[] = array(
'key' => '_all_variations_outofstock',
'value' => '1',
'compare' => '!=',
);
$meta_query[] = array(
'key' => '_all_variations_outofstock',
'compare' => 'NOT EXISTS',
);
// Set the new merged meta query
$q->set( 'meta_query', $meta_query );
}
// Hide "Out of stock" variable product single pages
add_action( 'template_redirect', 'hide_out_of_stock_variable_product_single_pages' );
function hide_out_of_stock_variable_product_single_pages(){
if( get_post_meta( get_the_id(), '_all_variations_outofstock', true ) ) {
// Redirect to Shop page
wp_redirect( wc_get_page_permalink( 'shop' ) );
exit();
}
}
代码位于活动子主题(或活动主题)的 function.php 文件中。经过测试并有效。
4). 添加/更新产品变体库存自定义元:在管理单一产品页面上,检查可变产品库存状态并更新自定义元数据(以及当付款订单更新产品库存时):
// Custom function that update the parent variable product stock custom meta data
function update_parent_variable_product_stock_custom_meta( $product_var ) {
if( ! is_a($product_var, 'WC_Product') ) {
$product = wc_get_product( $product_var );
} else { $product = $product_var; }
if ( $product->is_type('variation') ) {
// Get the parent product id from product variation
$product_id = (int) $product->get_parent_id();
} elseif ( $product->is_type('variable') ) {
$product_id = (int) $product->get_id();
} else {
return; // Exit
}
// Check if all the product variations are "out of stock" or not
$value = is_wc_variable_product_in_stock( $product_id ) ? '0' : '1';
// add/Udpate custom meta data
update_post_meta( $variable_id, '_all_variations_outofstock', $value );
}
// Update variable product stock custom meta data on admin single product pages
add_action( 'woocommerce_process_product_meta_variable', 'update_variable_product_stock_custom_meta_data' );
function update_product_variable_stock_custom_meta_data ( $product_id ) {
update_parent_variable_product_stock_custom_meta( $product_id );
}
// On processed update product stock event (Like on orders)
add_action( 'woocommerce_updated_product_stock', 'wc_updated_product_stock_callback' );
function wc_updated_product_stock_callback ( $product_id ) {
update_parent_variable_product_stock_custom_meta( $product_id );
}
代码位于活动子主题(或活动主题)的 function.php 文件中。经过测试并有效。
5)。以编程方式更改产品库存状态并添加/更新产品变体库存自定义元(您重新访问的代码,但适用于产品变体甚至简单的产品):
$stock_status = 'outofstock';
// Get an instance of WC_Product Object from the product ID (product variation)
$product = wc_get_product( $product_id );
// 1. Updating the stock quantity
$product->set_stock_quantity(0);
// 2. Updating the stock status (and "product_visibility" related term )
$product->set_stock_status($stock_status);
// 3. Save product data and refresh cached data
$product->save();
// Update parent variable product stock custom meta data
update_parent_variable_product_stock_custom_meta( $product );
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报