我有一个分组产品product-1,其中有许多链接产品:
-product-1(分组产品)
- |__ product-2(简单或可变产品)
- |__ product-3(简单或可变产品)
我想使用 product-2 的 ID 获取 product-1 的 ID
我有一个分组产品product-1,其中有许多链接产品:
-product-1(分组产品)
我想使用 product-2 的 ID 获取 product-1 的 ID
您无法通过其中一个子产品 ID 获取特定分组产品的产品 ID,因为每个子产品都可以位于许多不同的分组产品中。
定义分组产品的子产品 IDS 的唯一数据位于wp_postmeta
表中,meta_key
_children
作为子产品 ID 数组。
现在,如果您要用于检索父分组产品 ID 的子产品 ID 只是一个唯一分组产品的子产品,您可以使用嵌入在函数中的以下 SQL 查询:
function get_parent_grouped_id( $children_id ){
global $wpdb;
$results = $wpdb->get_col("SELECT post_id FROM {$wpdb->prefix}postmeta
WHERE meta_key = '_children' AND meta_value LIKE '%$children_id%'");
// Will only return one product Id or false if there is zero or many
return sizeof($results) == 1 ? reset($results) : false;
}
代码位于您的活动子主题(或活动主题)的 function.php 文件中。测试和工作。
用法
下面738
是其中一个儿童产品 ID。它也可以是通过变量传递的动态值。
$parent_grouped_id = get_parent_grouped_id( 738 );
添加 - 使用以下命令获取所有分组产品WC_Product_Query
:
分组产品对象数组:
$grouped_products = wc_get_products(array('limit' => -1, 'type' => 'grouped'));
仅IDS分组产品数组:
$ids = wc_get_products(array('limit' => -1, 'type' => 'grouped', 'return' => 'ids' ) );
我已经详细说明了@LoicTheAztec先前的正确答案,并为其添加了一些缓存以避免多个数据库请求。为我的项目写了这个,只是和你分享 - 不要对我苛刻,我是这里的新手。感谢@LoicTheAztec 的初步回答。
if ( ! function_exists( 'wc_get_parent_grouped_id' ) ) {
function wc_get_parent_grouped_id( $id ){
global $wpdb;
$cdata = wp_cache_get( __FUNCTION__, 'woocommerce' );
if ( ! is_array($cdata) )
$cdata = array();
if ( ! isset($cdata[$id]) ) {
$cdata[$id] = $parent_id = $children = false;
$qdata = $wpdb->get_row("SELECT post_id, meta_value
FROM $wpdb->postmeta
WHERE meta_key = '_children'
AND meta_value LIKE '%$id%'");
if ( is_object($qdata) ) {
$parent_id = $qdata->post_id;
$children = $qdata->meta_value;
if ( is_string($children) )
$children = unserialize($children);
if ( is_array($children) && count($children) > 0 )
foreach ($children as $child_id)
$cdata[$child_id] = $parent_id;
}
wp_cache_set( __FUNCTION__, apply_filters( __FUNCTION__ . '_filter', $cdata, $id, $parent_id, $children, $qdata ), 'woocommerce' );
}
return $cdata[$id];
}
}