File "wc-product-functions.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/wc-product-functions.php
File
size: 36.1 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
use Automattic\Jetpack\Constants;
use Automattic\WooCommerce\Utilities\NumberUtil;
defined('ABSPATH') || exit;
function wc_get_products($args)
{
$map_legacy = array('numberposts' => 'limit', 'post_status' => 'status', 'post_parent' => 'parent', 'posts_per_page' => 'limit', 'paged' => 'page');
foreach ($map_legacy as $from => $to) {
if (isset($args[$from])) {
$args[$to] = $args[$from];
}
}
$query = new WC_Product_Query($args);
return $query->get_products();
}
function wc_get_product($the_product = false, $deprecated = array())
{
if (!did_action('woocommerce_init') || !did_action('woocommerce_after_register_taxonomy') || !did_action('woocommerce_after_register_post_type')) {
wc_doing_it_wrong(__FUNCTION__, sprintf(__('%1$s should not be called before the %2$s, %3$s and %4$s actions have finished.', 'woocommerce'), 'wc_get_product', 'woocommerce_init', 'woocommerce_after_register_taxonomy', 'woocommerce_after_register_post_type'), '3.9');
return false;
}
if (!empty($deprecated)) {
wc_deprecated_argument('args', '3.0', 'Passing args to wc_get_product is deprecated. If you need to force a type, construct the product class directly.');
}
return WC()->product_factory->get_product($the_product, $deprecated);
}
function wc_get_product_object($product_type, $product_id = 0)
{
$classname = WC_Product_Factory::get_product_classname($product_id, $product_type);
return new $classname($product_id);
}
function wc_product_sku_enabled()
{
return apply_filters('wc_product_sku_enabled', true);
}
function wc_product_weight_enabled()
{
return apply_filters('wc_product_weight_enabled', true);
}
function wc_product_dimensions_enabled()
{
return apply_filters('wc_product_dimensions_enabled', true);
}
function wc_delete_product_transients($post_id = 0)
{
$transients_to_clear = array('wc_products_onsale', 'wc_featured_products', 'wc_outofstock_count', 'wc_low_stock_count');
foreach ($transients_to_clear as $transient) {
delete_transient($transient);
}
if ($post_id > 0) {
$post_transient_names = array('wc_product_children_', 'wc_var_prices_', 'wc_related_', 'wc_child_has_weight_', 'wc_child_has_dimensions_');
foreach ($post_transient_names as $transient) {
delete_transient($transient . $post_id);
}
}
WC_Cache_Helper::get_transient_version('product', true);
do_action('woocommerce_delete_product_transients', $post_id);
}
function wc_get_product_ids_on_sale()
{
$product_ids_on_sale = get_transient('wc_products_onsale');
if (false !== $product_ids_on_sale) {
return $product_ids_on_sale;
}
$data_store = WC_Data_Store::load('product');
$on_sale_products = $data_store->get_on_sale_products();
$product_ids_on_sale = wp_parse_id_list(array_merge(wp_list_pluck($on_sale_products, 'id'), array_diff(wp_list_pluck($on_sale_products, 'parent_id'), array(0))));
set_transient('wc_products_onsale', $product_ids_on_sale, DAY_IN_SECONDS * 30);
return $product_ids_on_sale;
}
function wc_get_featured_product_ids()
{
$featured_product_ids = get_transient('wc_featured_products');
if (false !== $featured_product_ids) {
return $featured_product_ids;
}
$data_store = WC_Data_Store::load('product');
$featured = $data_store->get_featured_product_ids();
$product_ids = array_keys($featured);
$parent_ids = array_values(array_filter($featured));
$featured_product_ids = array_unique(array_merge($product_ids, $parent_ids));
set_transient('wc_featured_products', $featured_product_ids, DAY_IN_SECONDS * 30);
return $featured_product_ids;
}
function wc_product_post_type_link($permalink, $post)
{
if ('product' !== $post->post_type) {
return $permalink;
}
if (false === strpos($permalink, '%')) {
return $permalink;
}
$terms = get_the_terms($post->ID, 'product_cat');
if (!empty($terms)) {
$terms = wp_list_sort($terms, array('parent' => 'DESC', 'term_id' => 'ASC'));
$category_object = apply_filters('wc_product_post_type_link_product_cat', $terms[0], $terms, $post);
$product_cat = $category_object->slug;
if ($category_object->parent) {
$ancestors = get_ancestors($category_object->term_id, 'product_cat');
foreach ($ancestors as $ancestor) {
$ancestor_object = get_term($ancestor, 'product_cat');
if (apply_filters('woocommerce_product_post_type_link_parent_category_only', false)) {
$product_cat = $ancestor_object->slug;
} else {
$product_cat = $ancestor_object->slug . '/' . $product_cat;
}
}
}
} else {
$product_cat = _x('uncategorized', 'slug', 'woocommerce');
}
$find = array('%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%', '%post_id%', '%category%', '%product_cat%');
$replace = array(date_i18n('Y', strtotime($post->post_date)), date_i18n('m', strtotime($post->post_date)), date_i18n('d', strtotime($post->post_date)), date_i18n('H', strtotime($post->post_date)), date_i18n('i', strtotime($post->post_date)), date_i18n('s', strtotime($post->post_date)), $post->ID, $product_cat, $product_cat);
$permalink = str_replace($find, $replace, $permalink);
return $permalink;
}
add_filter('post_type_link', 'wc_product_post_type_link', 10, 2);
function wc_placeholder_img_src($size = 'woocommerce_thumbnail')
{
$src = WC()->plugin_url() . '/assets/images/placeholder.png';
$placeholder_image = get_option('woocommerce_placeholder_image', 0);
if (!empty($placeholder_image)) {
if (is_numeric($placeholder_image)) {
$image = wp_get_attachment_image_src($placeholder_image, $size);
if (!empty($image[0])) {
$src = $image[0];
}
} else {
$src = $placeholder_image;
}
}
return apply_filters('woocommerce_placeholder_img_src', $src);
}
function wc_placeholder_img($size = 'woocommerce_thumbnail', $attr = '')
{
$dimensions = wc_get_image_size($size);
$placeholder_image = get_option('woocommerce_placeholder_image', 0);
$default_attr = array('class' => 'woocommerce-placeholder wp-post-image', 'alt' => __('Placeholder', 'woocommerce'));
$attr = wp_parse_args($attr, $default_attr);
if (wp_attachment_is_image($placeholder_image)) {
$image_html = wp_get_attachment_image($placeholder_image, $size, false, $attr);
} else {
$image = wc_placeholder_img_src($size);
$hwstring = image_hwstring($dimensions['width'], $dimensions['height']);
$attributes = array();
foreach ($attr as $name => $value) {
$attribute[] = esc_attr($name) . '="' . esc_attr($value) . '"';
}
$image_html = '<img src="' . esc_url($image) . '" ' . $hwstring . implode(' ', $attribute) . '/>';
}
return apply_filters('woocommerce_placeholder_img', $image_html, $size, $dimensions);
}
function wc_get_formatted_variation($variation, $flat = false, $include_names = true, $skip_attributes_in_name = false)
{
$return = '';
if (is_a($variation, 'WC_Product_Variation')) {
$variation_attributes = $variation->get_attributes();
$product = $variation;
$variation_name = $variation->get_name();
} else {
$product = false;
$variation_name = '';
$variation_attributes = array();
if (is_array($variation)) {
foreach ($variation as $key => $value) {
$variation_attributes[str_replace('attribute_', '', $key)] = $value;
}
}
}
$list_type = $include_names ? 'dl' : 'ul';
if (is_array($variation_attributes)) {
if (!$flat) {
$return = '<' . $list_type . ' class="variation">';
}
$variation_list = array();
foreach ($variation_attributes as $name => $value) {
if (taxonomy_exists($name)) {
$term = get_term_by('slug', $value, $name);
if (!is_wp_error($term) && !empty($term->name)) {
$value = $term->name;
}
}
if ('' === $value || $skip_attributes_in_name && wc_is_attribute_in_product_name($value, $variation_name)) {
continue;
}
if ($include_names) {
if ($flat) {
$variation_list[] = wc_attribute_label($name, $product) . ': ' . rawurldecode($value);
} else {
$variation_list[] = '<dt>' . wc_attribute_label($name, $product) . ':</dt><dd>' . rawurldecode($value) . '</dd>';
}
} else {
if ($flat) {
$variation_list[] = rawurldecode($value);
} else {
$variation_list[] = '<li>' . rawurldecode($value) . '</li>';
}
}
}
if ($flat) {
$return .= implode(', ', $variation_list);
} else {
$return .= implode('', $variation_list);
}
if (!$flat) {
$return .= '</' . $list_type . '>';
}
}
return $return;
}
function wc_scheduled_sales()
{
$data_store = WC_Data_Store::load('product');
$product_ids = $data_store->get_starting_sales();
if ($product_ids) {
do_action('wc_before_products_starting_sales', $product_ids);
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if ($product) {
$sale_price = $product->get_sale_price();
if ($sale_price) {
$product->set_price($sale_price);
$product->set_date_on_sale_from('');
} else {
$product->set_date_on_sale_to('');
$product->set_date_on_sale_from('');
}
$product->save();
}
}
do_action('wc_after_products_starting_sales', $product_ids);
WC_Cache_Helper::get_transient_version('product', true);
delete_transient('wc_products_onsale');
}
$product_ids = $data_store->get_ending_sales();
if ($product_ids) {
do_action('wc_before_products_ending_sales', $product_ids);
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if ($product) {
$regular_price = $product->get_regular_price();
$product->set_price($regular_price);
$product->set_sale_price('');
$product->set_date_on_sale_to('');
$product->set_date_on_sale_from('');
$product->save();
}
}
do_action('wc_after_products_ending_sales', $product_ids);
WC_Cache_Helper::get_transient_version('product', true);
delete_transient('wc_products_onsale');
}
}
add_action('woocommerce_scheduled_sales', 'wc_scheduled_sales');
function wc_get_attachment_image_attributes($attr)
{
if (current_user_can('manage_woocommerce')) {
return $attr;
}
if (isset($attr['src']) && strstr($attr['src'], 'woocommerce_uploads/')) {
$attr['src'] = wc_placeholder_img_src();
if (isset($attr['srcset'])) {
$attr['srcset'] = '';
}
}
return $attr;
}
add_filter('wp_get_attachment_image_attributes', 'wc_get_attachment_image_attributes');
function wc_prepare_attachment_for_js($response)
{
if (current_user_can('manage_woocommerce')) {
return $response;
}
if (isset($response['url']) && strstr($response['url'], 'woocommerce_uploads/')) {
$response['full']['url'] = wc_placeholder_img_src();
if (isset($response['sizes'])) {
foreach ($response['sizes'] as $size => $value) {
$response['sizes'][$size]['url'] = wc_placeholder_img_src();
}
}
}
return $response;
}
add_filter('wp_prepare_attachment_for_js', 'wc_prepare_attachment_for_js');
function wc_track_product_view()
{
if (!is_singular('product') || !is_active_widget(false, false, 'woocommerce_recently_viewed_products', true)) {
return;
}
global $post;
if (empty($_COOKIE['woocommerce_recently_viewed'])) {
$viewed_products = array();
} else {
$viewed_products = wp_parse_id_list((array) explode('|', wp_unslash($_COOKIE['woocommerce_recently_viewed'])));
}
$keys = array_flip($viewed_products);
if (isset($keys[$post->ID])) {
unset($viewed_products[$keys[$post->ID]]);
}
$viewed_products[] = $post->ID;
if (count($viewed_products) > 15) {
array_shift($viewed_products);
}
wc_setcookie('woocommerce_recently_viewed', implode('|', $viewed_products));
}
add_action('template_redirect', 'wc_track_product_view', 20);
function wc_get_product_types()
{
return (array) apply_filters('product_type_selector', array('simple' => __('Simple product', 'woocommerce'), 'grouped' => __('Grouped product', 'woocommerce'), 'external' => __('External/Affiliate product', 'woocommerce'), 'variable' => __('Variable product', 'woocommerce')));
}
function wc_product_has_unique_sku($product_id, $sku)
{
$data_store = WC_Data_Store::load('product');
$sku_found = $data_store->is_existing_sku($product_id, $sku);
if (apply_filters('wc_product_has_unique_sku', $sku_found, $product_id, $sku)) {
return false;
}
return true;
}
function wc_product_force_unique_sku($product_id)
{
$product = wc_get_product($product_id);
$current_sku = $product ? $product->get_sku('edit') : '';
if ($current_sku) {
try {
$new_sku = wc_product_generate_unique_sku($product_id, $current_sku);
if ($current_sku !== $new_sku) {
$product->set_sku($new_sku);
$product->save();
}
} catch (Exception $e) {
}
}
}
function wc_product_generate_unique_sku($product_id, $sku, $index = 0)
{
$generated_sku = 0 < $index ? $sku . '-' . $index : $sku;
if (!wc_product_has_unique_sku($product_id, $generated_sku)) {
$generated_sku = wc_product_generate_unique_sku($product_id, $sku, $index + 1);
}
return $generated_sku;
}
function wc_get_product_id_by_sku($sku)
{
$data_store = WC_Data_Store::load('product');
return $data_store->get_product_id_by_sku($sku);
}
function wc_get_product_variation_attributes($variation_id)
{
$all_meta = get_post_meta($variation_id);
$parent_id = wp_get_post_parent_id($variation_id);
$parent_attributes = array_filter((array) get_post_meta($parent_id, '_product_attributes', true));
$found_parent_attributes = array();
$variation_attributes = array();
foreach ($parent_attributes as $attribute_name => $options) {
if (!empty($options['is_variation'])) {
$attribute = 'attribute_' . sanitize_title($attribute_name);
$found_parent_attributes[] = $attribute;
if (!array_key_exists($attribute, $variation_attributes)) {
$variation_attributes[$attribute] = '';
}
}
}
foreach ($all_meta as $name => $value) {
if (0 !== strpos($name, 'attribute_') || !in_array($name, $found_parent_attributes, true)) {
unset($variation_attributes[$name]);
continue;
}
if (sanitize_title($value[0]) === $value[0] && version_compare(get_post_meta($parent_id, '_product_version', true), '2.4.0', '<')) {
foreach ($parent_attributes as $attribute) {
if ('attribute_' . sanitize_title($attribute['name']) !== $name) {
continue;
}
$text_attributes = wc_get_text_attributes($attribute['value']);
foreach ($text_attributes as $text_attribute) {
if (sanitize_title($text_attribute) === $value[0]) {
$value[0] = $text_attribute;
break;
}
}
}
}
$variation_attributes[$name] = $value[0];
}
return $variation_attributes;
}
function wc_get_product_cat_ids($product_id)
{
$product_cats = wc_get_product_term_ids($product_id, 'product_cat');
foreach ($product_cats as $product_cat) {
$product_cats = array_merge($product_cats, get_ancestors($product_cat, 'product_cat'));
}
return $product_cats;
}
function wc_get_product_attachment_props($attachment_id = null, $product = false)
{
$props = array('title' => '', 'caption' => '', 'url' => '', 'alt' => '', 'src' => '', 'srcset' => false, 'sizes' => false);
$attachment = get_post($attachment_id);
if ($attachment && 'attachment' === $attachment->post_type) {
$props['title'] = wp_strip_all_tags($attachment->post_title);
$props['caption'] = wp_strip_all_tags($attachment->post_excerpt);
$props['url'] = wp_get_attachment_url($attachment_id);
$alt_text = array(wp_strip_all_tags(get_post_meta($attachment_id, '_wp_attachment_image_alt', true)), $props['caption'], wp_strip_all_tags($attachment->post_title));
if ($product && $product instanceof WC_Product) {
$alt_text[] = wp_strip_all_tags(get_the_title($product->get_id()));
}
$alt_text = array_filter($alt_text);
$props['alt'] = isset($alt_text[0]) ? $alt_text[0] : '';
$full_size = apply_filters('woocommerce_gallery_full_size', apply_filters('woocommerce_product_thumbnails_large_size', 'full'));
$src = wp_get_attachment_image_src($attachment_id, $full_size);
$props['full_src'] = $src[0];
$props['full_src_w'] = $src[1];
$props['full_src_h'] = $src[2];
$gallery_thumbnail = wc_get_image_size('gallery_thumbnail');
$gallery_thumbnail_size = apply_filters('woocommerce_gallery_thumbnail_size', array($gallery_thumbnail['width'], $gallery_thumbnail['height']));
$src = wp_get_attachment_image_src($attachment_id, $gallery_thumbnail_size);
$props['gallery_thumbnail_src'] = $src[0];
$props['gallery_thumbnail_src_w'] = $src[1];
$props['gallery_thumbnail_src_h'] = $src[2];
$thumbnail_size = apply_filters('woocommerce_thumbnail_size', 'woocommerce_thumbnail');
$src = wp_get_attachment_image_src($attachment_id, $thumbnail_size);
$props['thumb_src'] = $src[0];
$props['thumb_src_w'] = $src[1];
$props['thumb_src_h'] = $src[2];
$image_size = apply_filters('woocommerce_gallery_image_size', 'woocommerce_single');
$src = wp_get_attachment_image_src($attachment_id, $image_size);
$props['src'] = $src[0];
$props['src_w'] = $src[1];
$props['src_h'] = $src[2];
$props['srcset'] = function_exists('wp_get_attachment_image_srcset') ? wp_get_attachment_image_srcset($attachment_id, $image_size) : false;
$props['sizes'] = function_exists('wp_get_attachment_image_sizes') ? wp_get_attachment_image_sizes($attachment_id, $image_size) : false;
}
return $props;
}
function wc_get_product_visibility_options()
{
return apply_filters('woocommerce_product_visibility_options', array('visible' => __('Shop and search results', 'woocommerce'), 'catalog' => __('Shop only', 'woocommerce'), 'search' => __('Search results only', 'woocommerce'), 'hidden' => __('Hidden', 'woocommerce')));
}
function wc_get_product_tax_class_options()
{
$tax_classes = WC_Tax::get_tax_classes();
$tax_class_options = array();
$tax_class_options[''] = __('Standard', 'woocommerce');
if (!empty($tax_classes)) {
foreach ($tax_classes as $class) {
$tax_class_options[sanitize_title($class)] = $class;
}
}
return $tax_class_options;
}
function wc_get_product_stock_status_options()
{
return apply_filters('woocommerce_product_stock_status_options', array('instock' => __('In stock', 'woocommerce'), 'outofstock' => __('Out of stock', 'woocommerce'), 'onbackorder' => __('On backorder', 'woocommerce')));
}
function wc_get_product_backorder_options()
{
return array('no' => __('Do not allow', 'woocommerce'), 'notify' => __('Allow, but notify customer', 'woocommerce'), 'yes' => __('Allow', 'woocommerce'));
}
function wc_get_related_products($product_id, $limit = 5, $exclude_ids = 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));
$transient = get_transient($transient_name);
$related_posts = $transient && isset($transient[$query_args]) ? $transient[$query_args] : false;
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();
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) {
$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));
if (apply_filters('woocommerce_product_related_posts_shuffle', true)) {
shuffle($related_posts);
}
return array_slice($related_posts, 0, $limit);
}
function wc_get_product_term_ids($product_id, $taxonomy)
{
$terms = get_the_terms($product_id, $taxonomy);
return empty($terms) || is_wp_error($terms) ? array() : wp_list_pluck($terms, 'term_id');
}
function wc_get_price_including_tax($product, $args = array())
{
$args = wp_parse_args($args, array('qty' => '', 'price' => ''));
$price = '' !== $args['price'] ? max(0.0, (float) $args['price']) : $product->get_price();
$qty = '' !== $args['qty'] ? max(0.0, (float) $args['qty']) : 1;
if ('' === $price) {
return '';
} elseif (empty($qty)) {
return 0.0;
}
$line_price = $price * $qty;
$return_price = $line_price;
if ($product->is_taxable()) {
if (!wc_prices_include_tax()) {
$tax_rates = WC_Tax::get_rates($product->get_tax_class());
$taxes = WC_Tax::calc_tax($line_price, $tax_rates, false);
if ('yes' === get_option('woocommerce_tax_round_at_subtotal')) {
$taxes_total = array_sum($taxes);
} else {
$taxes_total = array_sum(array_map('wc_round_tax_total', $taxes));
}
$return_price = NumberUtil::round($line_price + $taxes_total, wc_get_price_decimals());
} else {
$tax_rates = WC_Tax::get_rates($product->get_tax_class());
$base_tax_rates = WC_Tax::get_base_tax_rates($product->get_tax_class('unfiltered'));
if (!empty(WC()->customer) && WC()->customer->get_is_vat_exempt()) {
$remove_taxes = apply_filters('woocommerce_adjust_non_base_location_prices', true) ? WC_Tax::calc_tax($line_price, $base_tax_rates, true) : WC_Tax::calc_tax($line_price, $tax_rates, true);
if ('yes' === get_option('woocommerce_tax_round_at_subtotal')) {
$remove_taxes_total = array_sum($remove_taxes);
} else {
$remove_taxes_total = array_sum(array_map('wc_round_tax_total', $remove_taxes));
}
$return_price = NumberUtil::round($line_price - $remove_taxes_total, wc_get_price_decimals());
} elseif ($tax_rates !== $base_tax_rates && apply_filters('woocommerce_adjust_non_base_location_prices', true)) {
$base_taxes = WC_Tax::calc_tax($line_price, $base_tax_rates, true);
$modded_taxes = WC_Tax::calc_tax($line_price - array_sum($base_taxes), $tax_rates, false);
if ('yes' === get_option('woocommerce_tax_round_at_subtotal')) {
$base_taxes_total = array_sum($base_taxes);
$modded_taxes_total = array_sum($modded_taxes);
} else {
$base_taxes_total = array_sum(array_map('wc_round_tax_total', $base_taxes));
$modded_taxes_total = array_sum(array_map('wc_round_tax_total', $modded_taxes));
}
$return_price = NumberUtil::round($line_price - $base_taxes_total + $modded_taxes_total, wc_get_price_decimals());
}
}
}
return apply_filters('woocommerce_get_price_including_tax', $return_price, $qty, $product);
}
function wc_get_price_excluding_tax($product, $args = array())
{
$args = wp_parse_args($args, array('qty' => '', 'price' => ''));
$price = '' !== $args['price'] ? max(0.0, (float) $args['price']) : $product->get_price();
$qty = '' !== $args['qty'] ? max(0.0, (float) $args['qty']) : 1;
if ('' === $price) {
return '';
} elseif (empty($qty)) {
return 0.0;
}
$line_price = $price * $qty;
if ($product->is_taxable() && wc_prices_include_tax()) {
$tax_rates = WC_Tax::get_rates($product->get_tax_class());
$base_tax_rates = WC_Tax::get_base_tax_rates($product->get_tax_class('unfiltered'));
$remove_taxes = apply_filters('woocommerce_adjust_non_base_location_prices', true) ? WC_Tax::calc_tax($line_price, $base_tax_rates, true) : WC_Tax::calc_tax($line_price, $tax_rates, true);
$return_price = $line_price - array_sum($remove_taxes);
} else {
$return_price = $line_price;
}
return apply_filters('woocommerce_get_price_excluding_tax', $return_price, $qty, $product);
}
function wc_get_price_to_display($product, $args = array())
{
$args = wp_parse_args($args, array('qty' => 1, 'price' => $product->get_price()));
$price = $args['price'];
$qty = $args['qty'];
return 'incl' === get_option('woocommerce_tax_display_shop') ? wc_get_price_including_tax($product, array('qty' => $qty, 'price' => $price)) : wc_get_price_excluding_tax($product, array('qty' => $qty, 'price' => $price));
}
function wc_get_product_category_list($product_id, $sep = ', ', $before = '', $after = '')
{
return get_the_term_list($product_id, 'product_cat', $before, $sep, $after);
}
function wc_get_product_tag_list($product_id, $sep = ', ', $before = '', $after = '')
{
return get_the_term_list($product_id, 'product_tag', $before, $sep, $after);
}
function wc_products_array_filter_visible($product)
{
return $product && is_a($product, 'WC_Product') && $product->is_visible();
}
function wc_products_array_filter_visible_grouped($product)
{
return $product && is_a($product, 'WC_Product') && ('publish' === $product->get_status() || current_user_can('edit_product', $product->get_id()));
}
function wc_products_array_filter_editable($product)
{
return $product && is_a($product, 'WC_Product') && current_user_can('edit_product', $product->get_id());
}
function wc_products_array_filter_readable($product)
{
return $product && is_a($product, 'WC_Product') && current_user_can('read_product', $product->get_id());
}
function wc_products_array_orderby($products, $orderby = 'date', $order = 'desc')
{
$orderby = strtolower($orderby);
$order = strtolower($order);
switch ($orderby) {
case 'title':
case 'id':
case 'date':
case 'modified':
case 'menu_order':
case 'price':
usort($products, 'wc_products_array_orderby_' . $orderby);
break;
case 'none':
break;
default:
shuffle($products);
break;
}
if ('desc' === $order) {
$products = array_reverse($products);
}
return $products;
}
function wc_products_array_orderby_title($a, $b)
{
return strcasecmp($a->get_name(), $b->get_name());
}
function wc_products_array_orderby_id($a, $b)
{
if ($a->get_id() === $b->get_id()) {
return 0;
}
return $a->get_id() < $b->get_id() ? -1 : 1;
}
function wc_products_array_orderby_date($a, $b)
{
if ($a->get_date_created() === $b->get_date_created()) {
return 0;
}
return $a->get_date_created() < $b->get_date_created() ? -1 : 1;
}
function wc_products_array_orderby_modified($a, $b)
{
if ($a->get_date_modified() === $b->get_date_modified()) {
return 0;
}
return $a->get_date_modified() < $b->get_date_modified() ? -1 : 1;
}
function wc_products_array_orderby_menu_order($a, $b)
{
if ($a->get_menu_order() === $b->get_menu_order()) {
return 0;
}
return $a->get_menu_order() < $b->get_menu_order() ? -1 : 1;
}
function wc_products_array_orderby_price($a, $b)
{
if ($a->get_price() === $b->get_price()) {
return 0;
}
return $a->get_price() < $b->get_price() ? -1 : 1;
}
function wc_deferred_product_sync($product_id)
{
global $wc_deferred_product_sync;
if (empty($wc_deferred_product_sync)) {
$wc_deferred_product_sync = array();
}
$wc_deferred_product_sync[] = $product_id;
}
function wc_update_product_lookup_tables_is_running()
{
$table_updates_pending = WC()->queue()->search(array('status' => 'pending', 'group' => 'wc_update_product_lookup_tables', 'per_page' => 1));
return (bool) count($table_updates_pending);
}
function wc_update_product_lookup_tables()
{
global $wpdb;
$is_cli = Constants::is_true('WP_CLI');
if (!$is_cli) {
WC_Admin_Notices::add_notice('regenerating_lookup_table');
}
update_option('woocommerce_product_lookup_table_is_generating', true);
$wpdb->query("\n\t\tINSERT IGNORE INTO {$wpdb->wc_product_meta_lookup} (`product_id`)\n\t\tSELECT\n\t\t\tposts.ID\n\t\tFROM {$wpdb->posts} posts\n\t\tWHERE\n\t\t\tposts.post_type IN ('product', 'product_variation')\n\t\t");
$columns = array('min_max_price', 'stock_quantity', 'sku', 'stock_status', 'average_rating', 'total_sales', 'downloadable', 'virtual', 'onsale', 'tax_class', 'tax_status');
foreach ($columns as $index => $column) {
if ($is_cli) {
wc_update_product_lookup_tables_column($column);
} else {
WC()->queue()->schedule_single(time() + $index, 'wc_update_product_lookup_tables_column', array('column' => $column), 'wc_update_product_lookup_tables');
}
}
if ($is_cli) {
$rating_count_rows = $wpdb->get_results("\n\t\t\tSELECT post_id, meta_value FROM {$wpdb->postmeta}\n\t\t\tWHERE meta_key = '_wc_rating_count'\n\t\t\tAND meta_value != ''\n\t\t\tAND meta_value != 'a:0:{}'\n\t\t\t", ARRAY_A);
wc_update_product_lookup_tables_rating_count($rating_count_rows);
} else {
WC()->queue()->schedule_single(time() + 10, 'wc_update_product_lookup_tables_rating_count_batch', array('offset' => 0, 'limit' => 50), 'wc_update_product_lookup_tables');
}
}
function wc_update_product_lookup_tables_column($column)
{
if (empty($column)) {
return;
}
global $wpdb;
switch ($column) {
case 'min_max_price':
$wpdb->query("\n\t\t\t\tUPDATE\n\t\t\t\t\t{$wpdb->wc_product_meta_lookup} lookup_table\n\t\t\t\t\tINNER JOIN (\n\t\t\t\t\t\tSELECT lookup_table.product_id, MIN( meta_value+0 ) as min_price, MAX( meta_value+0 ) as max_price\n\t\t\t\t\t\tFROM {$wpdb->wc_product_meta_lookup} lookup_table\n\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta1 ON lookup_table.product_id = meta1.post_id AND meta1.meta_key = '_price'\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\tmeta1.meta_value <> ''\n\t\t\t\t\t\tGROUP BY lookup_table.product_id\n\t\t\t\t\t) as source on source.product_id = lookup_table.product_id\n\t\t\t\tSET\n\t\t\t\t\tlookup_table.min_price = source.min_price,\n\t\t\t\t\tlookup_table.max_price = source.max_price\n\t\t\t\t");
break;
case 'stock_quantity':
$wpdb->query("\n\t\t\t\tUPDATE\n\t\t\t\t\t{$wpdb->wc_product_meta_lookup} lookup_table\n\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta1 ON lookup_table.product_id = meta1.post_id AND meta1.meta_key = '_manage_stock'\n\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta2 ON lookup_table.product_id = meta2.post_id AND meta2.meta_key = '_stock'\n\t\t\t\tSET\n\t\t\t\t\tlookup_table.stock_quantity = meta2.meta_value\n\t\t\t\tWHERE\n\t\t\t\t\tmeta1.meta_value = 'yes'\n\t\t\t\t");
break;
case 'sku':
case 'stock_status':
case 'average_rating':
case 'total_sales':
case 'tax_class':
case 'tax_status':
if ('total_sales' === $column) {
$meta_key = 'total_sales';
} elseif ('average_rating' === $column) {
$meta_key = '_wc_average_rating';
} else {
$meta_key = '_' . $column;
}
$column = esc_sql($column);
$wpdb->query($wpdb->prepare("\n\t\t\t\t\tUPDATE\n\t\t\t\t\t\t{$wpdb->wc_product_meta_lookup} lookup_table\n\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta ON lookup_table.product_id = meta.post_id AND meta.meta_key = %s\n\t\t\t\t\tSET\n\t\t\t\t\t\tlookup_table.`{$column}` = meta.meta_value\n\t\t\t\t\t", $meta_key));
break;
case 'downloadable':
case 'virtual':
$column = esc_sql($column);
$meta_key = '_' . $column;
$wpdb->query($wpdb->prepare("\n\t\t\t\t\tUPDATE\n\t\t\t\t\t\t{$wpdb->wc_product_meta_lookup} lookup_table\n\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta1 ON lookup_table.product_id = meta1.post_id AND meta1.meta_key = %s\n\t\t\t\t\tSET\n\t\t\t\t\t\tlookup_table.`{$column}` = IF ( meta1.meta_value = 'yes', 1, 0 )\n\t\t\t\t\t", $meta_key));
break;
case 'onsale':
$column = esc_sql($column);
$decimals = absint(wc_get_price_decimals());
$wpdb->query($wpdb->prepare("\n\t\t\t\t\tUPDATE\n\t\t\t\t\t\t{$wpdb->wc_product_meta_lookup} lookup_table\n\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta1 ON lookup_table.product_id = meta1.post_id AND meta1.meta_key = '_price'\n\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} meta2 ON lookup_table.product_id = meta2.post_id AND meta2.meta_key = '_sale_price'\n\t\t\t\t\tSET\n\t\t\t\t\t\tlookup_table.`{$column}` = IF (\n\t\t\t\t\t\t\tCAST( meta1.meta_value AS DECIMAL ) >= 0\n\t\t\t\t\t\t\tAND CAST( meta2.meta_value AS CHAR ) != ''\n\t\t\t\t\t\t\tAND CAST( meta1.meta_value AS DECIMAL( 10, %d ) ) = CAST( meta2.meta_value AS DECIMAL( 10, %d ) )\n\t\t\t\t\t\t, 1, 0 )\n\t\t\t\t\t", $decimals, $decimals));
break;
}
if ('tax_status' === $column) {
delete_option('woocommerce_product_lookup_table_is_generating');
}
}
add_action('wc_update_product_lookup_tables_column', 'wc_update_product_lookup_tables_column');
function wc_update_product_lookup_tables_rating_count($rows)
{
if (!$rows || !is_array($rows)) {
return;
}
global $wpdb;
foreach ($rows as $row) {
$count = array_sum((array) maybe_unserialize($row['meta_value']));
$wpdb->update($wpdb->wc_product_meta_lookup, array('rating_count' => absint($count)), array('product_id' => absint($row['post_id'])));
}
}
function wc_update_product_lookup_tables_rating_count_batch($offset = 0, $limit = 0)
{
global $wpdb;
if (!$limit) {
return;
}
$rating_count_rows = $wpdb->get_results($wpdb->prepare("\n\t\t\tSELECT post_id, meta_value FROM {$wpdb->postmeta}\n\t\t\tWHERE meta_key = '_wc_rating_count'\n\t\t\tAND meta_value != ''\n\t\t\tAND meta_value != 'a:0:{}'\n\t\t\tORDER BY post_id ASC\n\t\t\tLIMIT %d, %d\n\t\t\t", $offset, $limit), ARRAY_A);
if ($rating_count_rows) {
wc_update_product_lookup_tables_rating_count($rating_count_rows);
WC()->queue()->schedule_single(time() + 1, 'wc_update_product_lookup_tables_rating_count_batch', array('offset' => $offset + $limit, 'limit' => $limit), 'wc_update_product_lookup_tables');
}
}
add_action('wc_update_product_lookup_tables_rating_count_batch', 'wc_update_product_lookup_tables_rating_count_batch', 10, 2);