wc_get_related_products()
Get related products based on product category and tags.
Хуки из функции
Возвращает
Массив.
Использование
wc_get_related_products( $product_id, $limit, $exclude_ids, $related_by );
- $product_id(int) (обязательный)
- Product ID.
- $limit(int)
- Limit of results.
По умолчанию:5 - $exclude_ids(массив)
- Exclude IDs from the results.
По умолчанию:array() - $related_by(массив)
- Related by category and tags boolean flags.
По умолчанию:array()
Список изменений
| С версии 3.0.0 | Введена. |
Код wc_get_related_products() wc get related products WC 10.5.0
function wc_get_related_products( $product_id, $limit = 5, $exclude_ids = array(), $related_by = array() ) {
// Log an error if the limit is not an integer since this is what we expect.
// However this is not a problem and we can continue.
if ( ! is_int( $limit ) ) {
wc_get_logger()->error(
sprintf(
'Invalid limit type passed to wc_get_related_products. Expected integer, got %s with value: %s',
gettype( $limit ),
wp_json_encode( $limit )
),
array( 'source' => 'wc_get_related_products' )
);
}
// If the limit is not numeric, set it to null.
$limit = is_numeric( $limit ) ? (int) $limit : null;
if ( null === $limit ) {
return array();
}
$product_id = absint( $product_id );
$limit = $limit >= -1 ? $limit : 5;
$exclude_ids = array_merge( array( 0, $product_id ), $exclude_ids );
$transient_name = 'wc_related_' . $product_id;
$query_args = http_build_query(
array(
'limit' => $limit,
'exclude_ids' => $exclude_ids,
'related_by' => $related_by,
)
);
$transient = get_transient( $transient_name );
$related_posts = $transient && is_array( $transient ) && isset( $transient[ $query_args ] ) ? $transient[ $query_args ] : false;
// We want to query related posts if they are not cached, or we don't have enough.
if ( false === $related_posts || count( $related_posts ) < $limit ) {
$cats_array = apply_filters( 'woocommerce_product_related_posts_relate_by_category', true, $product_id ) ? apply_filters( 'woocommerce_get_related_product_cat_terms', wc_get_product_term_ids( $product_id, 'product_cat' ), $product_id ) : array();
$tags_array = apply_filters( 'woocommerce_product_related_posts_relate_by_tag', true, $product_id ) ? apply_filters( 'woocommerce_get_related_product_tag_terms', wc_get_product_term_ids( $product_id, 'product_tag' ), $product_id ) : array();
// Don't bother if none are set, unless woocommerce_product_related_posts_force_display is set to true in which case all products are related.
if ( empty( $cats_array ) && empty( $tags_array ) && ! apply_filters( 'woocommerce_product_related_posts_force_display', false, $product_id ) ) {
$related_posts = array();
} else {
$data_store = WC_Data_Store::load( 'product' );
$related_posts = $data_store->get_related_products( $cats_array, $tags_array, $exclude_ids, $limit + 10, $product_id );
}
if ( $transient && is_array( $transient ) ) {
$transient[ $query_args ] = $related_posts;
} else {
$transient = array( $query_args => $related_posts );
}
set_transient( $transient_name, $transient, DAY_IN_SECONDS );
}
$related_posts = apply_filters(
'woocommerce_related_products',
$related_posts,
$product_id,
array(
'limit' => $limit,
'excluded_ids' => $exclude_ids,
)
);
$related_posts = is_array( $related_posts ) ? $related_posts : array();
if ( apply_filters( 'woocommerce_product_related_posts_shuffle', true ) ) {
shuffle( $related_posts );
}
return array_slice( $related_posts, 0, $limit );
}