如何在woocommerce中从链接的产品获取分组的产品ID

时间:2018-09-09 22:48:04

标签: php wordpress woocommerce product

我有一个分组的产品 product-1 ,其中有许多链接的产品:

-product-1(分组产品)

  • | __ product-2(简单或可变产品)
  • | __ product-3(简单或 可变产品)

我想使用产品2的ID获取产品1的ID

2 个答案:

答案 0 :(得分:3)

您不能通过其子产品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获取所有分组的产品:

1)分组产品数组对象

$grouped_products = wc_get_products( array( 'limit' => -1, 'type' => 'grouped' ) );

1)仅分组产品 IDS

$ids = wc_get_products( array( 'limit' => -1, 'type' => 'grouped', 'return' => 'ids' ) );

答案 1 :(得分:0)

我已经通过@LoicTheAztec对previous correct answer进行了详细说明,并在其中添加了一些缓存,从而避免了多个数据库请求。为我的项目写了这个,只与您分享-不要对我苛刻,我是新来的。感谢@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];
}

}