File "abstract-wc-product.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/abstracts/abstract-wc-product.php
File size: 34.05 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

if (!defined('ABSPATH')) {
    exit;
}
use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore as ProductAttributesLookupDataStore;
require_once WC_ABSPATH . 'includes/legacy/abstract-wc-legacy-product.php';
class WC_Product extends WC_Abstract_Legacy_Product
{
    protected $object_type = 'product';
    protected $post_type = 'product';
    protected $cache_group = 'products';
    protected $data = array('name' => '', 'slug' => '', 'date_created' => null, 'date_modified' => null, 'status' => false, 'featured' => false, 'catalog_visibility' => 'visible', 'description' => '', 'short_description' => '', 'sku' => '', 'price' => '', 'regular_price' => '', 'sale_price' => '', 'date_on_sale_from' => null, 'date_on_sale_to' => null, 'total_sales' => '0', 'tax_status' => 'taxable', 'tax_class' => '', 'manage_stock' => false, 'stock_quantity' => null, 'stock_status' => 'instock', 'backorders' => 'no', 'low_stock_amount' => '', 'sold_individually' => false, 'weight' => '', 'length' => '', 'width' => '', 'height' => '', 'upsell_ids' => array(), 'cross_sell_ids' => array(), 'parent_id' => 0, 'reviews_allowed' => true, 'purchase_note' => '', 'attributes' => array(), 'default_attributes' => array(), 'menu_order' => 0, 'post_password' => '', 'virtual' => false, 'downloadable' => false, 'category_ids' => array(), 'tag_ids' => array(), 'shipping_class_id' => 0, 'downloads' => array(), 'image_id' => '', 'gallery_image_ids' => array(), 'download_limit' => -1, 'download_expiry' => -1, 'rating_counts' => array(), 'average_rating' => 0, 'review_count' => 0);
    protected $supports = array();
    public function __construct($product = 0)
    {
        parent::__construct($product);
        if (is_numeric($product) && $product > 0) {
            $this->set_id($product);
        } elseif ($product instanceof self) {
            $this->set_id(absint($product->get_id()));
        } elseif (!empty($product->ID)) {
            $this->set_id(absint($product->ID));
        } else {
            $this->set_object_read(true);
        }
        $this->data_store = WC_Data_Store::load('product-' . $this->get_type());
        if ($this->get_id() > 0) {
            $this->data_store->read($this);
        }
    }
    public function get_type()
    {
        return isset($this->product_type) ? $this->product_type : 'simple';
    }
    public function get_name($context = 'view')
    {
        return $this->get_prop('name', $context);
    }
    public function get_slug($context = 'view')
    {
        return $this->get_prop('slug', $context);
    }
    public function get_date_created($context = 'view')
    {
        return $this->get_prop('date_created', $context);
    }
    public function get_date_modified($context = 'view')
    {
        return $this->get_prop('date_modified', $context);
    }
    public function get_status($context = 'view')
    {
        return $this->get_prop('status', $context);
    }
    public function get_featured($context = 'view')
    {
        return $this->get_prop('featured', $context);
    }
    public function get_catalog_visibility($context = 'view')
    {
        return $this->get_prop('catalog_visibility', $context);
    }
    public function get_description($context = 'view')
    {
        return $this->get_prop('description', $context);
    }
    public function get_short_description($context = 'view')
    {
        return $this->get_prop('short_description', $context);
    }
    public function get_sku($context = 'view')
    {
        return $this->get_prop('sku', $context);
    }
    public function get_price($context = 'view')
    {
        return $this->get_prop('price', $context);
    }
    public function get_regular_price($context = 'view')
    {
        return $this->get_prop('regular_price', $context);
    }
    public function get_sale_price($context = 'view')
    {
        return $this->get_prop('sale_price', $context);
    }
    public function get_date_on_sale_from($context = 'view')
    {
        return $this->get_prop('date_on_sale_from', $context);
    }
    public function get_date_on_sale_to($context = 'view')
    {
        return $this->get_prop('date_on_sale_to', $context);
    }
    public function get_total_sales($context = 'view')
    {
        return $this->get_prop('total_sales', $context);
    }
    public function get_tax_status($context = 'view')
    {
        return $this->get_prop('tax_status', $context);
    }
    public function get_tax_class($context = 'view')
    {
        return $this->get_prop('tax_class', $context);
    }
    public function get_manage_stock($context = 'view')
    {
        return $this->get_prop('manage_stock', $context);
    }
    public function get_stock_quantity($context = 'view')
    {
        return $this->get_prop('stock_quantity', $context);
    }
    public function get_stock_status($context = 'view')
    {
        return $this->get_prop('stock_status', $context);
    }
    public function get_backorders($context = 'view')
    {
        return $this->get_prop('backorders', $context);
    }
    public function get_low_stock_amount($context = 'view')
    {
        return $this->get_prop('low_stock_amount', $context);
    }
    public function get_sold_individually($context = 'view')
    {
        return $this->get_prop('sold_individually', $context);
    }
    public function get_weight($context = 'view')
    {
        return $this->get_prop('weight', $context);
    }
    public function get_length($context = 'view')
    {
        return $this->get_prop('length', $context);
    }
    public function get_width($context = 'view')
    {
        return $this->get_prop('width', $context);
    }
    public function get_height($context = 'view')
    {
        return $this->get_prop('height', $context);
    }
    public function get_dimensions($formatted = true)
    {
        if ($formatted) {
            wc_deprecated_argument('WC_Product::get_dimensions', '3.0', 'By default, get_dimensions has an argument set to true so that HTML is returned. This is to support the legacy version of the method. To get HTML dimensions, instead use wc_format_dimensions() function. Pass false to this method to return an array of dimensions. This will be the new default behavior in future versions.');
            return apply_filters('woocommerce_product_dimensions', wc_format_dimensions($this->get_dimensions(false)), $this);
        }
        return array('length' => $this->get_length(), 'width' => $this->get_width(), 'height' => $this->get_height());
    }
    public function get_upsell_ids($context = 'view')
    {
        return $this->get_prop('upsell_ids', $context);
    }
    public function get_cross_sell_ids($context = 'view')
    {
        return $this->get_prop('cross_sell_ids', $context);
    }
    public function get_parent_id($context = 'view')
    {
        return $this->get_prop('parent_id', $context);
    }
    public function get_reviews_allowed($context = 'view')
    {
        return $this->get_prop('reviews_allowed', $context);
    }
    public function get_purchase_note($context = 'view')
    {
        return $this->get_prop('purchase_note', $context);
    }
    public function get_attributes($context = 'view')
    {
        return $this->get_prop('attributes', $context);
    }
    public function get_default_attributes($context = 'view')
    {
        return $this->get_prop('default_attributes', $context);
    }
    public function get_menu_order($context = 'view')
    {
        return $this->get_prop('menu_order', $context);
    }
    public function get_post_password($context = 'view')
    {
        return $this->get_prop('post_password', $context);
    }
    public function get_category_ids($context = 'view')
    {
        return $this->get_prop('category_ids', $context);
    }
    public function get_tag_ids($context = 'view')
    {
        return $this->get_prop('tag_ids', $context);
    }
    public function get_virtual($context = 'view')
    {
        return $this->get_prop('virtual', $context);
    }
    public function get_gallery_image_ids($context = 'view')
    {
        return $this->get_prop('gallery_image_ids', $context);
    }
    public function get_shipping_class_id($context = 'view')
    {
        return $this->get_prop('shipping_class_id', $context);
    }
    public function get_downloads($context = 'view')
    {
        return $this->get_prop('downloads', $context);
    }
    public function get_download_expiry($context = 'view')
    {
        return $this->get_prop('download_expiry', $context);
    }
    public function get_downloadable($context = 'view')
    {
        return $this->get_prop('downloadable', $context);
    }
    public function get_download_limit($context = 'view')
    {
        return $this->get_prop('download_limit', $context);
    }
    public function get_image_id($context = 'view')
    {
        return $this->get_prop('image_id', $context);
    }
    public function get_rating_counts($context = 'view')
    {
        return $this->get_prop('rating_counts', $context);
    }
    public function get_average_rating($context = 'view')
    {
        return $this->get_prop('average_rating', $context);
    }
    public function get_review_count($context = 'view')
    {
        return $this->get_prop('review_count', $context);
    }
    public function set_name($name)
    {
        $this->set_prop('name', $name);
    }
    public function set_slug($slug)
    {
        $this->set_prop('slug', $slug);
    }
    public function set_date_created($date = null)
    {
        $this->set_date_prop('date_created', $date);
    }
    public function set_date_modified($date = null)
    {
        $this->set_date_prop('date_modified', $date);
    }
    public function set_status($status)
    {
        $this->set_prop('status', $status);
    }
    public function set_featured($featured)
    {
        $this->set_prop('featured', wc_string_to_bool($featured));
    }
    public function set_catalog_visibility($visibility)
    {
        $options = array_keys(wc_get_product_visibility_options());
        if (!in_array($visibility, $options, true)) {
            $this->error('product_invalid_catalog_visibility', __('Invalid catalog visibility option.', 'woocommerce'));
        }
        $this->set_prop('catalog_visibility', $visibility);
    }
    public function set_description($description)
    {
        $this->set_prop('description', $description);
    }
    public function set_short_description($short_description)
    {
        $this->set_prop('short_description', $short_description);
    }
    public function set_sku($sku)
    {
        $sku = (string) $sku;
        if ($this->get_object_read() && !empty($sku) && !wc_product_has_unique_sku($this->get_id(), $sku)) {
            $sku_found = wc_get_product_id_by_sku($sku);
            $this->error('product_invalid_sku', __('Invalid or duplicated SKU.', 'woocommerce'), 400, array('resource_id' => $sku_found));
        }
        $this->set_prop('sku', $sku);
    }
    public function set_price($price)
    {
        $this->set_prop('price', wc_format_decimal($price));
    }
    public function set_regular_price($price)
    {
        $this->set_prop('regular_price', wc_format_decimal($price));
    }
    public function set_sale_price($price)
    {
        $this->set_prop('sale_price', wc_format_decimal($price));
    }
    public function set_date_on_sale_from($date = null)
    {
        $this->set_date_prop('date_on_sale_from', $date);
    }
    public function set_date_on_sale_to($date = null)
    {
        $this->set_date_prop('date_on_sale_to', $date);
    }
    public function set_total_sales($total)
    {
        $this->set_prop('total_sales', absint($total));
    }
    public function set_tax_status($status)
    {
        $options = array('taxable', 'shipping', 'none');
        if (empty($status)) {
            $status = 'taxable';
        }
        if (!in_array($status, $options, true)) {
            $this->error('product_invalid_tax_status', __('Invalid product tax status.', 'woocommerce'));
        }
        $this->set_prop('tax_status', $status);
    }
    public function set_tax_class($class)
    {
        $class = sanitize_title($class);
        $class = 'standard' === $class ? '' : $class;
        $valid_classes = $this->get_valid_tax_classes();
        if (!in_array($class, $valid_classes, true)) {
            $class = '';
        }
        $this->set_prop('tax_class', $class);
    }
    protected function get_valid_tax_classes()
    {
        return WC_Tax::get_tax_class_slugs();
    }
    public function set_manage_stock($manage_stock)
    {
        $this->set_prop('manage_stock', wc_string_to_bool($manage_stock));
    }
    public function set_stock_quantity($quantity)
    {
        $this->set_prop('stock_quantity', '' !== $quantity ? wc_stock_amount($quantity) : null);
    }
    public function set_stock_status($status = 'instock')
    {
        $valid_statuses = wc_get_product_stock_status_options();
        if (isset($valid_statuses[$status])) {
            $this->set_prop('stock_status', $status);
        } else {
            $this->set_prop('stock_status', 'instock');
        }
    }
    public function set_backorders($backorders)
    {
        $this->set_prop('backorders', $backorders);
    }
    public function set_low_stock_amount($amount)
    {
        $this->set_prop('low_stock_amount', '' === $amount ? '' : absint($amount));
    }
    public function set_sold_individually($sold_individually)
    {
        $this->set_prop('sold_individually', wc_string_to_bool($sold_individually));
    }
    public function set_weight($weight)
    {
        $this->set_prop('weight', '' === $weight ? '' : wc_format_decimal($weight));
    }
    public function set_length($length)
    {
        $this->set_prop('length', '' === $length ? '' : wc_format_decimal($length));
    }
    public function set_width($width)
    {
        $this->set_prop('width', '' === $width ? '' : wc_format_decimal($width));
    }
    public function set_height($height)
    {
        $this->set_prop('height', '' === $height ? '' : wc_format_decimal($height));
    }
    public function set_upsell_ids($upsell_ids)
    {
        $this->set_prop('upsell_ids', array_filter((array) $upsell_ids));
    }
    public function set_cross_sell_ids($cross_sell_ids)
    {
        $this->set_prop('cross_sell_ids', array_filter((array) $cross_sell_ids));
    }
    public function set_parent_id($parent_id)
    {
        $this->set_prop('parent_id', absint($parent_id));
    }
    public function set_reviews_allowed($reviews_allowed)
    {
        $this->set_prop('reviews_allowed', wc_string_to_bool($reviews_allowed));
    }
    public function set_purchase_note($purchase_note)
    {
        $this->set_prop('purchase_note', $purchase_note);
    }
    public function set_attributes($raw_attributes)
    {
        $attributes = array_fill_keys(array_keys($this->get_attributes('edit')), null);
        foreach ($raw_attributes as $attribute) {
            if (is_a($attribute, 'WC_Product_Attribute')) {
                $attributes[sanitize_title($attribute->get_name())] = $attribute;
            }
        }
        uasort($attributes, 'wc_product_attribute_uasort_comparison');
        $this->set_prop('attributes', $attributes);
    }
    public function set_default_attributes($default_attributes)
    {
        $this->set_prop('default_attributes', array_map('strval', array_filter((array) $default_attributes, 'wc_array_filter_default_attributes')));
    }
    public function set_menu_order($menu_order)
    {
        $this->set_prop('menu_order', intval($menu_order));
    }
    public function set_post_password($post_password)
    {
        $this->set_prop('post_password', $post_password);
    }
    public function set_category_ids($term_ids)
    {
        $this->set_prop('category_ids', array_unique(array_map('intval', $term_ids)));
    }
    public function set_tag_ids($term_ids)
    {
        $this->set_prop('tag_ids', array_unique(array_map('intval', $term_ids)));
    }
    public function set_virtual($virtual)
    {
        $this->set_prop('virtual', wc_string_to_bool($virtual));
    }
    public function set_shipping_class_id($id)
    {
        $this->set_prop('shipping_class_id', absint($id));
    }
    public function set_downloadable($downloadable)
    {
        $this->set_prop('downloadable', wc_string_to_bool($downloadable));
    }
    public function set_downloads($downloads_array)
    {
        $downloads = array();
        $errors = array();
        foreach ($downloads_array as $download) {
            if (is_a($download, 'WC_Product_Download')) {
                $download_object = $download;
            } else {
                $download_object = new WC_Product_Download();
                if (empty($download['download_id'])) {
                    $download['download_id'] = wp_generate_uuid4();
                }
                $download_object->set_id($download['download_id']);
                $download_object->set_name($download['name']);
                $download_object->set_file($download['file']);
            }
            if (!$download_object->is_allowed_filetype()) {
                if ($this->get_object_read()) {
                    $errors[] = sprintf(__('The downloadable file %1$s cannot be used as it does not have an allowed file type. Allowed types include: %2$s', 'woocommerce'), '<code>' . basename($download_object->get_file()) . '</code>', '<code>' . implode(', ', array_keys($download_object->get_allowed_mime_types())) . '</code>');
                }
                continue;
            }
            if (!$download_object->file_exists()) {
                if ($this->get_object_read()) {
                    $errors[] = sprintf(__('The downloadable file %s cannot be used as it does not exist on the server.', 'woocommerce'), '<code>' . $download_object->get_file() . '</code>');
                }
                continue;
            }
            $downloads[$download_object->get_id()] = $download_object;
        }
        if ($errors) {
            $this->error('product_invalid_download', $errors[0]);
        }
        $this->set_prop('downloads', $downloads);
    }
    public function set_download_limit($download_limit)
    {
        $this->set_prop('download_limit', -1 === (int) $download_limit || '' === $download_limit ? -1 : absint($download_limit));
    }
    public function set_download_expiry($download_expiry)
    {
        $this->set_prop('download_expiry', -1 === (int) $download_expiry || '' === $download_expiry ? -1 : absint($download_expiry));
    }
    public function set_gallery_image_ids($image_ids)
    {
        $image_ids = wp_parse_id_list($image_ids);
        $this->set_prop('gallery_image_ids', $image_ids);
    }
    public function set_image_id($image_id = '')
    {
        $this->set_prop('image_id', $image_id);
    }
    public function set_rating_counts($counts)
    {
        $this->set_prop('rating_counts', array_filter(array_map('absint', (array) $counts)));
    }
    public function set_average_rating($average)
    {
        $this->set_prop('average_rating', wc_format_decimal($average));
    }
    public function set_review_count($count)
    {
        $this->set_prop('review_count', absint($count));
    }
    public function validate_props()
    {
        if (!$this->get_manage_stock()) {
            $this->set_stock_quantity('');
            $this->set_backorders('no');
            $this->set_low_stock_amount('');
            return;
        }
        $stock_is_above_notification_threshold = $this->get_stock_quantity() > get_option('woocommerce_notify_no_stock_amount', 0);
        $backorders_are_allowed = 'no' !== $this->get_backorders();
        if ($stock_is_above_notification_threshold) {
            $new_stock_status = 'instock';
        } elseif ($backorders_are_allowed) {
            $new_stock_status = 'onbackorder';
        } else {
            $new_stock_status = 'outofstock';
        }
        $this->set_stock_status($new_stock_status);
    }
    public function save()
    {
        $this->validate_props();
        if (!$this->data_store) {
            return $this->get_id();
        }
        do_action('woocommerce_before_' . $this->object_type . '_object_save', $this, $this->data_store);
        $state = $this->before_data_store_save_or_update();
        if ($this->get_id()) {
            $changeset = $this->get_changes();
            $this->data_store->update($this);
        } else {
            $changeset = null;
            $this->data_store->create($this);
        }
        $this->after_data_store_save_or_update($state);
        if (is_null($changeset) || !empty($changeset)) {
            wc_get_container()->get(ProductAttributesLookupDataStore::class)->on_product_changed($this, $changeset);
        }
        do_action('woocommerce_after_' . $this->object_type . '_object_save', $this, $this->data_store);
        return $this->get_id();
    }
    protected function before_data_store_save_or_update()
    {
    }
    protected function after_data_store_save_or_update($state)
    {
        $this->maybe_defer_product_sync();
    }
    public function delete($force_delete = false)
    {
        $product_id = $this->get_id();
        $deleted = parent::delete($force_delete);
        if ($deleted) {
            $this->maybe_defer_product_sync();
            wc_get_container()->get(ProductAttributesLookupDataStore::class)->on_product_deleted($product_id);
        }
        return $deleted;
    }
    protected function maybe_defer_product_sync()
    {
        $parent_id = $this->get_parent_id();
        if ($parent_id) {
            wc_deferred_product_sync($parent_id);
        }
    }
    public function supports($feature)
    {
        return apply_filters('woocommerce_product_supports', in_array($feature, $this->supports, true), $feature, $this);
    }
    public function exists()
    {
        return false !== $this->get_status();
    }
    public function is_type($type)
    {
        return $this->get_type() === $type || is_array($type) && in_array($this->get_type(), $type, true);
    }
    public function is_downloadable()
    {
        return apply_filters('woocommerce_is_downloadable', true === $this->get_downloadable(), $this);
    }
    public function is_virtual()
    {
        return apply_filters('woocommerce_is_virtual', true === $this->get_virtual(), $this);
    }
    public function is_featured()
    {
        return true === $this->get_featured();
    }
    public function is_sold_individually()
    {
        return apply_filters('woocommerce_is_sold_individually', true === $this->get_sold_individually(), $this);
    }
    public function is_visible()
    {
        $visible = $this->is_visible_core();
        return apply_filters('woocommerce_product_is_visible', $visible, $this->get_id());
    }
    protected function is_visible_core()
    {
        $visible = 'visible' === $this->get_catalog_visibility() || is_search() && 'search' === $this->get_catalog_visibility() || !is_search() && 'catalog' === $this->get_catalog_visibility();
        if ('trash' === $this->get_status()) {
            $visible = false;
        } elseif ('publish' !== $this->get_status() && !current_user_can('edit_post', $this->get_id())) {
            $visible = false;
        }
        if ($this->get_parent_id()) {
            $parent_product = wc_get_product($this->get_parent_id());
            if ($parent_product && 'publish' !== $parent_product->get_status()) {
                $visible = false;
            }
        }
        if ('yes' === get_option('woocommerce_hide_out_of_stock_items') && !$this->is_in_stock()) {
            $visible = false;
        }
        return $visible;
    }
    public function is_purchasable()
    {
        return apply_filters('woocommerce_is_purchasable', $this->exists() && ('publish' === $this->get_status() || current_user_can('edit_post', $this->get_id())) && '' !== $this->get_price(), $this);
    }
    public function is_on_sale($context = 'view')
    {
        if ('' !== (string) $this->get_sale_price($context) && $this->get_regular_price($context) > $this->get_sale_price($context)) {
            $on_sale = true;
            if ($this->get_date_on_sale_from($context) && $this->get_date_on_sale_from($context)->getTimestamp() > time()) {
                $on_sale = false;
            }
            if ($this->get_date_on_sale_to($context) && $this->get_date_on_sale_to($context)->getTimestamp() < time()) {
                $on_sale = false;
            }
        } else {
            $on_sale = false;
        }
        return 'view' === $context ? apply_filters('woocommerce_product_is_on_sale', $on_sale, $this) : $on_sale;
    }
    public function has_dimensions()
    {
        return ($this->get_length() || $this->get_height() || $this->get_width()) && !$this->get_virtual();
    }
    public function has_weight()
    {
        return $this->get_weight() && !$this->get_virtual();
    }
    public function is_in_stock()
    {
        return apply_filters('woocommerce_product_is_in_stock', 'outofstock' !== $this->get_stock_status(), $this);
    }
    public function needs_shipping()
    {
        return apply_filters('woocommerce_product_needs_shipping', !$this->is_virtual(), $this);
    }
    public function is_taxable()
    {
        return apply_filters('woocommerce_product_is_taxable', $this->get_tax_status() === 'taxable' && wc_tax_enabled(), $this);
    }
    public function is_shipping_taxable()
    {
        return $this->needs_shipping() && ($this->get_tax_status() === 'taxable' || $this->get_tax_status() === 'shipping');
    }
    public function managing_stock()
    {
        if ('yes' === get_option('woocommerce_manage_stock')) {
            return $this->get_manage_stock();
        }
        return false;
    }
    public function backorders_allowed()
    {
        return apply_filters('woocommerce_product_backorders_allowed', 'yes' === $this->get_backorders() || 'notify' === $this->get_backorders(), $this->get_id(), $this);
    }
    public function backorders_require_notification()
    {
        return apply_filters('woocommerce_product_backorders_require_notification', $this->managing_stock() && 'notify' === $this->get_backorders(), $this);
    }
    public function is_on_backorder($qty_in_cart = 0)
    {
        if ('onbackorder' === $this->get_stock_status()) {
            return true;
        }
        return $this->managing_stock() && $this->backorders_allowed() && $this->get_stock_quantity() - $qty_in_cart < 0;
    }
    public function has_enough_stock($quantity)
    {
        return !$this->managing_stock() || $this->backorders_allowed() || $this->get_stock_quantity() >= $quantity;
    }
    public function has_attributes()
    {
        foreach ($this->get_attributes() as $attribute) {
            if ($attribute->get_visible()) {
                return true;
            }
        }
        return false;
    }
    public function has_child()
    {
        return 0 < count($this->get_children());
    }
    public function child_has_dimensions()
    {
        return false;
    }
    public function child_has_weight()
    {
        return false;
    }
    public function has_file($download_id = '')
    {
        return $this->is_downloadable() && $this->get_file($download_id);
    }
    public function has_options()
    {
        return apply_filters('woocommerce_product_has_options', false, $this);
    }
    public function get_title()
    {
        return apply_filters('woocommerce_product_title', $this->get_name(), $this);
    }
    public function get_permalink()
    {
        return get_permalink($this->get_id());
    }
    public function get_children()
    {
        return array();
    }
    public function get_stock_managed_by_id()
    {
        return $this->get_id();
    }
    public function get_price_html($deprecated = '')
    {
        if ('' === $this->get_price()) {
            $price = apply_filters('woocommerce_empty_price_html', '', $this);
        } elseif ($this->is_on_sale()) {
            $price = wc_format_sale_price(wc_get_price_to_display($this, array('price' => $this->get_regular_price())), wc_get_price_to_display($this)) . $this->get_price_suffix();
        } else {
            $price = wc_price(wc_get_price_to_display($this)) . $this->get_price_suffix();
        }
        return apply_filters('woocommerce_get_price_html', $price, $this);
    }
    public function get_formatted_name()
    {
        if ($this->get_sku()) {
            $identifier = $this->get_sku();
        } else {
            $identifier = '#' . $this->get_id();
        }
        return sprintf('%2$s (%1$s)', $identifier, $this->get_name());
    }
    public function get_min_purchase_quantity()
    {
        return 1;
    }
    public function get_max_purchase_quantity()
    {
        return $this->is_sold_individually() ? 1 : ($this->backorders_allowed() || !$this->managing_stock() ? -1 : $this->get_stock_quantity());
    }
    public function add_to_cart_url()
    {
        return apply_filters('woocommerce_product_add_to_cart_url', $this->get_permalink(), $this);
    }
    public function single_add_to_cart_text()
    {
        return apply_filters('woocommerce_product_single_add_to_cart_text', __('Add to cart', 'woocommerce'), $this);
    }
    public function add_to_cart_text()
    {
        return apply_filters('woocommerce_product_add_to_cart_text', __('Read more', 'woocommerce'), $this);
    }
    public function add_to_cart_description()
    {
        return apply_filters('woocommerce_product_add_to_cart_description', sprintf(__('Read more about &ldquo;%s&rdquo;', 'woocommerce'), $this->get_name()), $this);
    }
    public function get_image($size = 'woocommerce_thumbnail', $attr = array(), $placeholder = true)
    {
        $image = '';
        if ($this->get_image_id()) {
            $image = wp_get_attachment_image($this->get_image_id(), $size, false, $attr);
        } elseif ($this->get_parent_id()) {
            $parent_product = wc_get_product($this->get_parent_id());
            if ($parent_product) {
                $image = $parent_product->get_image($size, $attr, $placeholder);
            }
        }
        if (!$image && $placeholder) {
            $image = wc_placeholder_img($size, $attr);
        }
        return apply_filters('woocommerce_product_get_image', $image, $this, $size, $attr, $placeholder, $image);
    }
    public function get_shipping_class()
    {
        $class_id = $this->get_shipping_class_id();
        if ($class_id) {
            $term = get_term_by('id', $class_id, 'product_shipping_class');
            if ($term && !is_wp_error($term)) {
                return $term->slug;
            }
        }
        return '';
    }
    public function get_attribute($attribute)
    {
        $attributes = $this->get_attributes();
        $attribute = sanitize_title($attribute);
        if (isset($attributes[$attribute])) {
            $attribute_object = $attributes[$attribute];
        } elseif (isset($attributes['pa_' . $attribute])) {
            $attribute_object = $attributes['pa_' . $attribute];
        } else {
            return '';
        }
        return $attribute_object->is_taxonomy() ? implode(', ', wc_get_product_terms($this->get_id(), $attribute_object->get_name(), array('fields' => 'names'))) : wc_implode_text_attributes($attribute_object->get_options());
    }
    public function get_rating_count($value = null)
    {
        $counts = $this->get_rating_counts();
        if (is_null($value)) {
            return array_sum($counts);
        } elseif (isset($counts[$value])) {
            return absint($counts[$value]);
        } else {
            return 0;
        }
    }
    public function get_file($download_id = '')
    {
        $files = $this->get_downloads();
        if ('' === $download_id) {
            $file = count($files) ? current($files) : false;
        } elseif (isset($files[$download_id])) {
            $file = $files[$download_id];
        } else {
            $file = false;
        }
        return apply_filters('woocommerce_product_file', $file, $this, $download_id);
    }
    public function get_file_download_path($download_id)
    {
        $files = $this->get_downloads();
        $file_path = isset($files[$download_id]) ? $files[$download_id]->get_file() : '';
        return apply_filters('woocommerce_product_file_download_path', $file_path, $this, $download_id);
    }
    public function get_price_suffix($price = '', $qty = 1)
    {
        $html = '';
        $suffix = get_option('woocommerce_price_display_suffix');
        if ($suffix && wc_tax_enabled() && 'taxable' === $this->get_tax_status()) {
            if ('' === $price) {
                $price = $this->get_price();
            }
            $replacements = array('{price_including_tax}' => wc_price(wc_get_price_including_tax($this, array('qty' => $qty, 'price' => $price))), '{price_excluding_tax}' => wc_price(wc_get_price_excluding_tax($this, array('qty' => $qty, 'price' => $price))));
            $html = str_replace(array_keys($replacements), array_values($replacements), ' <small class="woocommerce-price-suffix">' . wp_kses_post($suffix) . '</small>');
        }
        return apply_filters('woocommerce_get_price_suffix', $html, $this, $price, $qty);
    }
    public function get_availability()
    {
        return apply_filters('woocommerce_get_availability', array('availability' => $this->get_availability_text(), 'class' => $this->get_availability_class()), $this);
    }
    protected function get_availability_text()
    {
        if (!$this->is_in_stock()) {
            $availability = __('Out of stock', 'woocommerce');
        } elseif ($this->managing_stock() && $this->is_on_backorder(1)) {
            $availability = $this->backorders_require_notification() ? __('Available on backorder', 'woocommerce') : '';
        } elseif (!$this->managing_stock() && $this->is_on_backorder(1)) {
            $availability = __('Available on backorder', 'woocommerce');
        } elseif ($this->managing_stock()) {
            $availability = wc_format_stock_for_display($this);
        } else {
            $availability = '';
        }
        return apply_filters('woocommerce_get_availability_text', $availability, $this);
    }
    protected function get_availability_class()
    {
        if (!$this->is_in_stock()) {
            $class = 'out-of-stock';
        } elseif ($this->managing_stock() && $this->is_on_backorder(1) || !$this->managing_stock() && $this->is_on_backorder(1)) {
            $class = 'available-on-backorder';
        } else {
            $class = 'in-stock';
        }
        return apply_filters('woocommerce_get_availability_class', $class, $this);
    }
}