Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?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);