在 WooCommerce 中,我們使用產(chǎn)品變體一般是在產(chǎn)品編輯器中設(shè)置,然后在產(chǎn)品頁(yè)面中展示,這對(duì)于熟悉 WooCommerce 操作的人來(lái)說(shuō),都是很容易的操作。但是對(duì)于我們開(kāi)發(fā)者來(lái)說(shuō),怎么以變成的方式獲取產(chǎn)品變體,卻是一個(gè)不常見(jiàn)的操作。在本文中,我將我大家介紹怎么用編程的方式獲取產(chǎn)品變體,以遍進(jìn)一步的處理。
讓我們假設(shè),在下面的示例中,$product 是一個(gè) WC_Product 產(chǎn)品對(duì)象,或者更具體地說(shuō),是一個(gè) WC_Product_Variable 變量,我們可以在使用 WooCommerce 鉤子或借助 wc_get_product() 函數(shù)時(shí)將其作為參數(shù)獲取。
但如果你不確定 $product 對(duì)象是否屬于產(chǎn)品變體,也可以使用 if( $product->is_type( 'variable' ) ) 條件來(lái)判斷。
方法 1. get_available_variations()
$variations = $product->get_available_variations();
if( $variations ) {
foreach( $variations as $variation ) {
// a WC_Product_Variation object
echo $variation->get_id(); // 特定變體的 ID
echo $variation->get_name();
}
}
這種方法看上去正是我們所需要的,但是有一個(gè)小問(wèn)題 —— 它只適用于可見(jiàn)的庫(kù)存變量,也就是說(shuō),勾選了 “已啟用 “復(fù)選框的變體才能通過(guò)這個(gè)函數(shù)獲取到。

我們可以使用 get_available_variations()方法只獲取已啟用的庫(kù)存變體。
如何使用 get_available_variations() 獲取所有變量
正如我之前提到的,get_available_variations()只返回有庫(kù)存且未隱藏的變體。有沒(méi)有辦法繞過(guò)這一點(diǎn)?答案是有的。
如果我們?cè)?WooCommerce 設(shè)置中取消勾選此復(fù)選框,就可以允許此方法返回缺貨變體:

該復(fù)選框可在 WooCommerce > 設(shè)置 > 產(chǎn)品 > 庫(kù)存 中找到。
其次,我們還可以使用過(guò)濾器鉤子 woocommerce_hide_invisible_variations,使 get_available_variations()方法也能返回隱藏(未啟用)的變化:
add_filter( 'woocommerce_hide_invisible_variations', 'wprs_all_variations', 25, 3 );
function wprs_all_variations( $hide_invisible, $variation_id, $variation ) {
// 我們還可以在此處添加一些特定于變體的條件
$hide_invisible = false;
return $hide_invisible;
}
或者簡(jiǎn)化版本
add_filter( 'woocommerce_hide_invisible_variations', '__return_false' );
方法 2. get_children()
我們上面討論的 get_available_variations()方法是就在 get_children() 方法的基礎(chǔ)上工作的。
但是,如果你需要同時(shí)獲取 WooCommerce 產(chǎn)品的隱藏和可見(jiàn)、庫(kù)存和缺貨變體,get_children()方法可能會(huì)更適合你。你只需要記住一點(diǎn)—— 它返回的是一個(gè)變體 ID 數(shù)組,而不是對(duì)象。
$variation_ids = $product->get_children();
if( $variation_ids ) {
foreach( $variation_ids as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( ! $variation || ! $variation->exists() ) {
continue;
}
echo $variation->get_id();
echo $variation->get_name();
}
}
方法 3.在 WooCommerce REST API 中獲取產(chǎn)品變體
除了上面的兩種方式,我們還可以通過(guò)使用 WooCommerce REST API 來(lái)獲取產(chǎn)品變體,只不過(guò)這種方法有點(diǎn)繞,明明可以通過(guò) PHP 從數(shù)據(jù)庫(kù)中直接獲取,這種方法確多了一個(gè) HTTP 請(qǐng)求,對(duì)性能也會(huì)稍有影響,如果不是有特別的需求,不建議使用這種方法。
$url = '';
$username = '';
$pwd = ''; // 應(yīng)用密碼,而不是 WordPress 登錄密碼
// 發(fā)送請(qǐng)求以獲取 WooCommerce 中的產(chǎn)品變體
$response = wp_remote_get(
add_query_arg(
array(
'per_page' => 100, // 默認(rèn)為 10
// 'status' => 'publish', // 只獲取啟用的變體
// 'stock_status' => 'instock', // 只獲取有庫(kù)存的變體
),
"{$url}/wp-json/wc/v3/products/{$product_id}/variations"
),
array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( "{$username}:{$pwd}" )
)
)
);
// 可以在這里檢查服務(wù)器返回代碼和內(nèi)容后再繼續(xù)操作
$variations = json_decode( wp_remote_retrieve_body( $response ), true );
if( $variations ) {
foreach( $variations as $variation ) {
echo $variation[ 'id' ];
echo $variation[ 'sku' ];
}
}
讓我來(lái)解釋一下這段代碼:
- 如你所見(jiàn),我使用的是 WordPress HTTP API 函數(shù)——
wp_remote_get()。 - 要進(jìn)行身份驗(yàn)證,你需要提供用戶名和應(yīng)用程序密碼。
- 請(qǐng)注意
per_page參數(shù),因?yàn)樗哪J(rèn)值是10,這意味著如果你的產(chǎn)品有很多變體,你就無(wú)法在一次 REST API 請(qǐng)求中獲得所有變體。
如果對(duì)本文有任何的問(wèn)題或想法,歡迎在評(píng)論區(qū)中提取,我們一起討論研究。


