У меня есть сгруппированный продукт товар-1, который имеет много связанных продуктов:
-продукт-1 (сгруппированный товар)
Я хочу получить идентификатор продукта-1, используя идентификатор продукта-2
Вы не можете получить идентификатор продукта определенного сгруппированного продукта через один из его идентификаторов дочерних продуктов, поскольку каждый дочерний элемент может входить во множество разных сгруппированных продуктов.
Единственные данные, которые определяют IDS дочерних продуктов для сгруппированного продукта, находятся в таблице wp_postmeta
вокруг meta_key
_children
в виде массива идентификаторов дочерних продуктов.
Теперь, если дочерний идентификатор продукта, который вы хотите использовать для получения идентификатора родительского сгруппированного продукта, является дочерним элементом только одного уникального сгруппированного продукта, вы можете использовать следующий 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
- это один из продуктов для детей, ид. Это также может быть динамическое значение, передаваемое через переменную.
$parent_grouped_id = get_parent_grouped_id( 738 );
ДОПОЛНЕНИЕ - Получите все сгруппированные продукты, используя WC_Product_Query
:
Массив сгруппированных товаров Объекты:
$ grouped_products = wc_get_products (массив ('limit' => -1, 'type' => 'grouped'));
Только массив сгруппированных товаров IDS:
$ ids = wc_get_products (array ('limit' => -1, 'type' => 'grouped', 'return' => 'ids'));
Ты потрясающий, это то, что я искал.
@alitaha Хорошо, я добавил дополнение, чтобы получить все сгруппированные продукты в WC_Product_Query
Я немного проработал предыдущий правильный ответ @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];
}
}
Спасибо за ответ, как мне получить список сгруппированных продуктов с помощью wp_query, я новичок в wordpress.