/**
 * Get related products based on product category and tags.
 *
 * @since  2.7.0
 * @param  int   $product_id  Product ID.
 * @param  int   $limit       Limit of results.
 * @param  array $exclude_ids Exclude IDs from the results.
 * @return array
 */
function wc_get_related_products($product_id, $limit = 5, $exclude_ids = array())
{
    global $wpdb;
    $product_id = absint($product_id);
    $exclude_ids = array_merge(array(0, $product_id), $exclude_ids);
    $transient_name = 'wc_related_' . $product_id;
    $related_posts = get_transient($transient_name);
    $limit = $limit > 0 ? $limit : 5;
    // 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);
        }
        set_transient($transient_name, $related_posts, DAY_IN_SECONDS);
    }
    shuffle($related_posts);
    return array_slice($related_posts, 0, $limit);
}
 /**
  * Retrieves related product terms.
  * @deprecated 2.7.0 Use wc_get_product_term_ids instead.
  */
 protected function get_related_terms($term)
 {
     wc_deprecated_function('WC_Product::get_related_terms', '2.7', 'wc_get_product_term_ids');
     return array_merge(array(0), wc_get_product_term_ids($this->get_id(), $term));
 }