Merge pull request #12465 from woocommerce/crud-ajax-class
AJAX Class and other fixes
This commit is contained in:
commit
f67ffe4d89
|
@ -125,10 +125,9 @@ jQuery( function ( $ ) {
|
|||
}
|
||||
|
||||
var data = {
|
||||
user_id: user_id,
|
||||
type_to_load: 'billing',
|
||||
action: 'woocommerce_get_customer_details',
|
||||
security: woocommerce_admin_meta_boxes.get_customer_details_nonce
|
||||
user_id : user_id,
|
||||
action : 'woocommerce_get_customer_details',
|
||||
security: woocommerce_admin_meta_boxes.get_customer_details_nonce
|
||||
};
|
||||
|
||||
$( this ).closest( 'div.edit_address' ).block({
|
||||
|
@ -144,9 +143,9 @@ jQuery( function ( $ ) {
|
|||
data: data,
|
||||
type: 'POST',
|
||||
success: function( response ) {
|
||||
if ( response ) {
|
||||
$.each( response, function( key, data ) {
|
||||
$( ':input#_' + key ).val( data ).change();
|
||||
if ( response && response.billing ) {
|
||||
$.each( response.billing, function( key, data ) {
|
||||
$( ':input#_billing_' + key ).val( data ).change();
|
||||
});
|
||||
}
|
||||
$( 'div.edit_address' ).unblock();
|
||||
|
@ -169,7 +168,6 @@ jQuery( function ( $ ) {
|
|||
|
||||
var data = {
|
||||
user_id: user_id,
|
||||
type_to_load: 'shipping',
|
||||
action: 'woocommerce_get_customer_details',
|
||||
security: woocommerce_admin_meta_boxes.get_customer_details_nonce
|
||||
};
|
||||
|
@ -187,9 +185,9 @@ jQuery( function ( $ ) {
|
|||
data: data,
|
||||
type: 'POST',
|
||||
success: function( response ) {
|
||||
if ( response ) {
|
||||
$.each( response, function( key, data ) {
|
||||
$( ':input#_' + key ).val( data ).change();
|
||||
if ( response && response.billing ) {
|
||||
$.each( response.shipping, function( key, data ) {
|
||||
$( ':input#_shipping_' + key ).val( data ).change();
|
||||
});
|
||||
}
|
||||
$( 'div.edit_address' ).unblock();
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -460,18 +460,6 @@ abstract class WC_Abstract_Legacy_Product extends WC_Data {
|
|||
return $post_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the title of the post.
|
||||
*
|
||||
* @deprecated 2.7.0
|
||||
* @return string
|
||||
*/
|
||||
public function get_title() {
|
||||
wc_deprecated_function( 'WC_Product::get_title', '2.7', 'WC_Product::get_name' );
|
||||
|
||||
return apply_filters( 'woocommerce_product_title', $this->get_post_data() ? $this->get_post_data()->post_title : '', $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parent of the post.
|
||||
*
|
||||
|
|
|
@ -1616,6 +1616,15 @@ class WC_Product extends WC_Abstract_Legacy_Product {
|
|||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get the product's title. For products this is the product name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_title() {
|
||||
return apply_filters( 'woocommerce_product_title', $this->get_name(), $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Product permalink.
|
||||
* @return string
|
||||
|
|
|
@ -24,7 +24,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
if ( ! $attribute->get_variation() ) {
|
||||
continue;
|
||||
}
|
||||
$selected_value = isset( $attribute_values[ 'attribute_' . sanitize_title( $attribute->get_name() ) ] ) ? $attribute_values[ 'attribute_' . sanitize_title( $attribute->get_name() ) ] : '';
|
||||
$selected_value = isset( $attribute_values[ sanitize_title( $attribute->get_name() ) ] ) ? $attribute_values[ sanitize_title( $attribute->get_name() ) ] : '';
|
||||
?>
|
||||
<select name="attribute_<?php echo sanitize_title( $attribute->get_name() ) . "[{$loop}]"; ?>">
|
||||
<option value=""><?php
|
||||
|
@ -115,15 +115,6 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
get_woocommerce_currency_symbol()
|
||||
);
|
||||
|
||||
woocommerce_wp_text_input( array(
|
||||
'id' => "variable_regular_price_{$loop}",
|
||||
'name' => "variable_regular_price[{$loop}]",
|
||||
'value' => wc_format_localized_price( $variation_object->get_regular_price( 'edit' ) ),
|
||||
'label' => __( 'Regular price', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')',
|
||||
'data_type' => 'price',
|
||||
'wrapper_class' => 'form-row form-row-first',
|
||||
) );
|
||||
|
||||
woocommerce_wp_text_input( array(
|
||||
'id' => "variable_sale_price{$loop}",
|
||||
'name' => "variable_sale_price[{$loop}]",
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -537,12 +537,11 @@ class WC_Cart {
|
|||
public function get_item_data( $cart_item, $flat = false ) {
|
||||
$item_data = array();
|
||||
|
||||
// Variation data
|
||||
// Variation values are shown only if they are not found in the title as of 2.7.
|
||||
// This is because variation titles display the attributes.
|
||||
if ( $cart_item['data']->is_type( 'variation' ) && is_array( $cart_item['variation'] ) ) {
|
||||
|
||||
foreach ( $cart_item['variation'] as $name => $value ) {
|
||||
|
||||
if ( '' === $value ) {
|
||||
if ( '' === $value || stristr( $cart_item['data']->get_name(), $value ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -558,13 +557,8 @@ class WC_Cart {
|
|||
|
||||
// If this is a custom option slug, get the options name
|
||||
} else {
|
||||
$value = apply_filters( 'woocommerce_variation_option_name', $value );
|
||||
$product_attributes = $cart_item['data']->get_attributes();
|
||||
if ( isset( $product_attributes[ str_replace( 'attribute_', '', $name ) ] ) ) {
|
||||
$label = wc_attribute_label( $product_attributes[ str_replace( 'attribute_', '', $name ) ]['name'] );
|
||||
} else {
|
||||
$label = $name;
|
||||
}
|
||||
$value = apply_filters( 'woocommerce_variation_option_name', $value );
|
||||
$label = wc_attribute_label( str_replace( 'attribute_', '', $name ), $cart_item['data'] );
|
||||
}
|
||||
|
||||
$item_data[] = array(
|
||||
|
|
|
@ -173,12 +173,4 @@ class WC_Order_Item_Coupon extends WC_Order_Item {
|
|||
}
|
||||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( 'discount_amount', 'discount_amount_tax' );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -234,12 +234,4 @@ class WC_Order_Item_Fee extends WC_Order_Item {
|
|||
}
|
||||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( '_tax_class', '_tax_status', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -450,13 +450,4 @@ class WC_Order_Item_Product extends WC_Order_Item {
|
|||
}
|
||||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( '_product_id', '_variation_id', '_qty', '_tax_class', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -243,12 +243,4 @@ class WC_Order_Item_Shipping extends WC_Order_Item {
|
|||
}
|
||||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( 'method_id', 'cost', 'total_tax', 'taxes' );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -200,20 +200,6 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
return $this->get_prop( 'compound', $context );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Other
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( 'rate_id', 'label', 'compound', 'tax_amount', 'shipping_tax_amount' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this a compound tax rate?
|
||||
* @return boolean
|
||||
|
|
|
@ -194,8 +194,8 @@ class WC_Order_Item extends WC_Data implements ArrayAccess {
|
|||
continue;
|
||||
}
|
||||
|
||||
$meta->key = rawurldecode( $meta->key );
|
||||
$meta->value = rawurldecode( $meta->value );
|
||||
$meta->key = rawurldecode( (string) $meta->key );
|
||||
$meta->value = rawurldecode( (string) $meta->value );
|
||||
$attribute_key = str_replace( 'attribute_', '', $meta->key );
|
||||
$display_key = wc_attribute_label( $attribute_key, is_callable( array( $this, 'get_product' ) ) ? $this->get_product() : false );
|
||||
$display_value = $meta->value;
|
||||
|
|
|
@ -57,6 +57,7 @@ class WC_Product_Attribute implements ArrayAccess {
|
|||
|
||||
/**
|
||||
* Gets terms from the stored options.
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public function get_terms() {
|
||||
|
@ -77,6 +78,28 @@ class WC_Product_Attribute implements ArrayAccess {
|
|||
return $terms;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets slugs from the stored options, or just the string if text based.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_slugs() {
|
||||
if ( ! $this->is_taxonomy() || ! taxonomy_exists( $this->get_name() ) ) {
|
||||
return $this->get_options();
|
||||
}
|
||||
foreach ( $this->get_options() as $option ) {
|
||||
if ( is_int( $option ) ) {
|
||||
$term = get_term_by( 'id', $option, $this->get_name() );
|
||||
} else {
|
||||
$term = get_term_by( 'name', $option, $this->get_name() );
|
||||
}
|
||||
if ( $term && ! is_wp_error( $term ) ) {
|
||||
$terms[] = $term->slug;
|
||||
}
|
||||
}
|
||||
return $terms;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all data for this object.
|
||||
* @return array
|
||||
|
|
|
@ -63,11 +63,15 @@ class WC_Product_Factory {
|
|||
// Allow the overriding of the lookup in this function. Return the product type here.
|
||||
$override = apply_filters( 'woocommerce_product_type_query', false, $product_id );
|
||||
if ( ! $override ) {
|
||||
if ( 'product_variation' === get_post_type( $product_id ) ) {
|
||||
$post_type = get_post_type( $product_id );
|
||||
if ( 'product_variation' === $post_type ) {
|
||||
return 'variation';
|
||||
} elseif ( 'product' === $post_type ) {
|
||||
$terms = get_the_terms( $product_id, 'product_type' );
|
||||
return ! empty( $terms ) ? sanitize_title( current( $terms )->name ) : 'simple';
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
$terms = get_the_terms( $product_id, 'product_type' );
|
||||
return ! empty( $terms ) ? sanitize_title( current( $terms )->name ) : 'simple';
|
||||
} else {
|
||||
return $override;
|
||||
}
|
||||
|
|
|
@ -247,6 +247,7 @@ class WC_Product_Variable extends WC_Product {
|
|||
}
|
||||
|
||||
return apply_filters( 'woocommerce_available_variation', array_merge( $variation->get_data(), array(
|
||||
'attributes' => $variation->get_variation_attributes(),
|
||||
'image' => wc_get_product_attachment_props( $variation->get_image_id() ),
|
||||
'weight_html' => wc_format_weight( $variation->get_weight() ),
|
||||
'dimensions_html' => wc_format_dimensions( $variation->get_dimensions( false ) ),
|
||||
|
|
|
@ -65,12 +65,26 @@ class WC_Product_Variation extends WC_Product_Simple {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get variation attribute values.
|
||||
* Get the product's title. For variations this is the parent product name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_title() {
|
||||
return apply_filters( 'woocommerce_product_title', $this->parent_data['title'], $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get variation attribute values. Keys are prefixed with attribute_, as stored.
|
||||
*
|
||||
* @return array of attributes and their values for this variation
|
||||
*/
|
||||
public function get_variation_attributes() {
|
||||
return $this->get_attributes();
|
||||
$attributes = $this->get_attributes();
|
||||
$variation_attributes = array();
|
||||
foreach ( $attributes as $key => $value ) {
|
||||
$variation_attributes[ 'attribute_' . $key ] = $value;
|
||||
}
|
||||
return $variation_attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,9 +101,9 @@ class WC_Product_Variation extends WC_Product_Simple {
|
|||
} elseif ( ! empty( $item_object['item_meta_array'] ) ) {
|
||||
$data_keys = array_map( 'wc_variation_attribute_name', wp_list_pluck( $item_object['item_meta_array'], 'key' ) );
|
||||
$data_values = wp_list_pluck( $item_object['item_meta_array'], 'value' );
|
||||
$data = array_intersect_key( array_combine( $data_keys, $data_values ), $this->get_attributes() );
|
||||
$data = array_intersect_key( array_combine( $data_keys, $data_values ), $this->get_variation_attributes() );
|
||||
} else {
|
||||
$data = $this->get_attributes();
|
||||
$data = $this->get_variation_attributes();
|
||||
}
|
||||
|
||||
return add_query_arg( array_map( 'urlencode', array_filter( $data ) ), $url );
|
||||
|
@ -101,7 +115,7 @@ class WC_Product_Variation extends WC_Product_Simple {
|
|||
* @return string
|
||||
*/
|
||||
public function add_to_cart_url() {
|
||||
$variation_data = array_map( 'urlencode', $this->get_attributes() );
|
||||
$variation_data = array_map( 'urlencode', $this->get_variation_attributes() );
|
||||
$url = $this->is_purchasable() ? remove_query_arg( 'added-to-cart', add_query_arg( array( 'variation_id' => $this->get_id(), 'add-to-cart' => $this->get_parent_id() ), $this->get_permalink() ) ) : $this->get_permalink();
|
||||
return apply_filters( 'woocommerce_product_add_to_cart_url', $url, $this );
|
||||
}
|
||||
|
@ -295,9 +309,9 @@ class WC_Product_Variation extends WC_Product_Simple {
|
|||
$attributes = array();
|
||||
|
||||
foreach ( $raw_attributes as $key => $value ) {
|
||||
// Add attribute prefix which meta gets stored with.
|
||||
if ( 0 !== strpos( $key, 'attribute_' ) ) {
|
||||
$key = 'attribute_' . $key;
|
||||
// Remove attribute prefix which meta gets stored with.
|
||||
if ( 0 === strpos( $key, 'attribute_' ) ) {
|
||||
$key = substr( $key, 10 );
|
||||
}
|
||||
$attributes[ $key ] = $value;
|
||||
}
|
||||
|
@ -305,7 +319,7 @@ class WC_Product_Variation extends WC_Product_Simple {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns array of attribute name value pairs.
|
||||
* Returns array of attribute name value pairs. Keys are prefixed with attribute_, as stored.
|
||||
*
|
||||
* @param string $context
|
||||
* @return array
|
||||
|
|
|
@ -336,4 +336,36 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
|
|||
|
||||
return wc_format_decimal( $spent, 2 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Search customers and return customer IDs.
|
||||
*
|
||||
* @param string $term
|
||||
* @return array
|
||||
*/
|
||||
public function search_customers( $term ) {
|
||||
$query = new WP_User_Query( array(
|
||||
'search' => '*' . esc_attr( $term ) . '*',
|
||||
'search_columns' => array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name' ),
|
||||
'fields' => 'ID',
|
||||
) );
|
||||
|
||||
$query2 = new WP_User_Query( array(
|
||||
'fields' => 'ID',
|
||||
'meta_query' => array(
|
||||
'relation' => 'OR',
|
||||
array(
|
||||
'key' => 'first_name',
|
||||
'value' => $term,
|
||||
'compare' => 'LIKE',
|
||||
),
|
||||
array(
|
||||
'key' => 'last_name',
|
||||
'value' => $term,
|
||||
'compare' => 'LIKE',
|
||||
),
|
||||
),
|
||||
) );
|
||||
return wp_parse_id_list( array_merge( $query->get_results(), $query2->get_results() ) );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,14 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Coupon_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store_Interface, WC_Order_Item_Type_Data_Store_Interface {
|
||||
|
||||
/**
|
||||
* Data stored in meta keys.
|
||||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $internal_meta_keys = array( 'discount_amount', 'discount_amount_tax' );
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
|
|
|
@ -11,6 +11,13 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Fee_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store_Interface, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Data stored in meta keys.
|
||||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $internal_meta_keys = array( '_tax_class', '_tax_status', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
|
|
|
@ -11,6 +11,13 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Product_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store_Interface, WC_Order_Item_Type_Data_Store_Interface, WC_Order_Item_Product_Data_Store_Interface {
|
||||
/**
|
||||
* Data stored in meta keys.
|
||||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $internal_meta_keys = array( '_product_id', '_variation_id', '_qty', '_tax_class', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
|
|
|
@ -11,6 +11,13 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Shipping_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store_Interface, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Data stored in meta keys.
|
||||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $internal_meta_keys = array( 'method_id', 'cost', 'total_tax', 'taxes' );
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
|
|
|
@ -11,6 +11,13 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Tax_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store_Interface, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Data stored in meta keys.
|
||||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $internal_meta_keys = array( 'rate_id', 'label', 'compound', 'tax_amount', 'shipping_tax_amount' );
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
|
|
|
@ -1022,4 +1022,61 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
|
|||
return $return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Search product data for a term and return ids.
|
||||
*
|
||||
* @param string $term
|
||||
* @param string $type of product
|
||||
* @param bool $include_variations in search or not
|
||||
* @return array of ids
|
||||
*/
|
||||
public function search_products( $term, $type = '', $include_variations = false ) {
|
||||
global $wpdb;
|
||||
|
||||
$search_fields = array_map( 'wc_clean', apply_filters( 'woocommerce_product_search_fields', array(
|
||||
'_sku',
|
||||
) ) );
|
||||
$like_term = '%' . $wpdb->esc_like( $term ) . '%';
|
||||
$post_types = $include_variations ? array( 'product', 'product_variation' ) : array( 'product' );
|
||||
$type_join = '';
|
||||
$type_where = '';
|
||||
|
||||
if ( $type ) {
|
||||
if ( in_array( $type, array( 'virtual', 'downloadable' ) ) ) {
|
||||
$type_join = " LEFT JOIN {$wpdb->postmeta} postmeta_type ON posts.ID = postmeta_type.post_id ";
|
||||
$type_where = " AND ( postmeta_type.meta_key = '_{$type}' AND postmeta_type.meta_value = 'yes' ) ";
|
||||
}
|
||||
}
|
||||
|
||||
$product_ids = $wpdb->get_col(
|
||||
$wpdb->prepare( "
|
||||
SELECT DISTINCT posts.ID FROM {$wpdb->posts} posts
|
||||
LEFT JOIN {$wpdb->postmeta} postmeta ON posts.ID = postmeta.post_id
|
||||
$type_join
|
||||
WHERE (
|
||||
posts.post_title LIKE %s
|
||||
OR posts.post_content LIKE %s
|
||||
OR (
|
||||
postmeta.meta_key = '_sku' AND postmeta.meta_value LIKE %s
|
||||
)
|
||||
)
|
||||
AND posts.post_type IN ('" . implode( "','", $post_types ) . "')
|
||||
AND posts.post_status = 'publish'
|
||||
$type_where
|
||||
ORDER BY posts.post_parent ASC, posts.post_title ASC
|
||||
",
|
||||
$like_term,
|
||||
$like_term,
|
||||
$like_term
|
||||
)
|
||||
);
|
||||
|
||||
if ( is_numeric( $term ) ) {
|
||||
$product_ids[] = absint( $term );
|
||||
$product_ids[] = get_post_parent( $term );
|
||||
}
|
||||
|
||||
return wp_parse_id_list( $product_ids );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,7 +86,7 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
|
|||
'post_type' => 'product_variation',
|
||||
'post_status' => $product->get_status() ? $product->get_status() : 'publish',
|
||||
'post_author' => get_current_user_id(),
|
||||
'post_title' => get_the_title( $product->get_parent_id() ) . ' –' . wc_get_formatted_variation( $product->get_attributes(), true ),
|
||||
'post_title' => get_the_title( $product->get_parent_id() ) . ' – ' . wc_get_formatted_variation( $product, true, false ),
|
||||
'post_content' => '',
|
||||
'post_parent' => $product->get_parent_id(),
|
||||
'comment_status' => 'closed',
|
||||
|
@ -121,7 +121,7 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
|
|||
public function update( &$product ) {
|
||||
$post_data = array(
|
||||
'ID' => $product->get_id(),
|
||||
'post_title' => get_the_title( $product->get_parent_id() ) . ' –' . wc_get_formatted_variation( $product->get_attributes(), true ),
|
||||
'post_title' => get_the_title( $product->get_parent_id() ) . ' – ' . wc_get_formatted_variation( $product, true, false ),
|
||||
'post_parent' => $product->get_parent_id(),
|
||||
'comment_status' => 'closed',
|
||||
'post_status' => $product->get_status() ? $product->get_status() : 'publish',
|
||||
|
@ -199,6 +199,7 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
|
|||
}
|
||||
|
||||
$product->set_parent_data( array(
|
||||
'title' => get_the_title( $product->get_parent_id() ),
|
||||
'sku' => get_post_meta( $product->get_parent_id(), '_sku', true ),
|
||||
'manage_stock' => get_post_meta( $product->get_parent_id(), '_manage_stock', true ),
|
||||
'backorders' => get_post_meta( $product->get_parent_id(), '_backorders', true ),
|
||||
|
@ -233,8 +234,8 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
|
|||
$attributes = $product->get_attributes();
|
||||
$updated_attribute_keys = array();
|
||||
foreach ( $attributes as $key => $value ) {
|
||||
update_post_meta( $product->get_id(), $key, $value );
|
||||
$updated_attribute_keys[] = $key;
|
||||
update_post_meta( $product->get_id(), 'attribute_' . $key, $value );
|
||||
$updated_attribute_keys[] = 'attribute_' . $key;
|
||||
}
|
||||
|
||||
// Remove old taxonomies attributes so data is kept up to date - first get attribute key names.
|
||||
|
|
|
@ -131,9 +131,16 @@ function wc_attribute_label( $name, $product = '' ) {
|
|||
$name = wc_sanitize_taxonomy_name( str_replace( 'pa_', '', $name ) );
|
||||
$all_labels = wp_list_pluck( wc_get_attribute_taxonomies(), 'attribute_label', 'attribute_name' );
|
||||
$label = isset( $all_labels[ $name ] ) ? $all_labels[ $name ] : $name;
|
||||
} elseif ( $product && ( $attributes = $product->get_attributes() ) && isset( $attributes[ sanitize_title( $name ) ]['name'] ) ) {
|
||||
// Attempt to get label from product, as entered by the user
|
||||
$label = $attributes[ sanitize_title( $name ) ]['name'];
|
||||
} elseif ( $product ) {
|
||||
if ( $product->is_type( 'variation' ) ) {
|
||||
$product = wc_get_product( $product->get_parent_id() );
|
||||
}
|
||||
// Attempt to get label from product, as entered by the user.
|
||||
if ( ( $attributes = $product->get_attributes() ) && isset( $attributes[ sanitize_title( $name ) ] ) ) {
|
||||
$label = $attributes[ sanitize_title( $name ) ]->get_name();
|
||||
} else {
|
||||
$label = $name;
|
||||
}
|
||||
} else {
|
||||
$label = $name;
|
||||
}
|
||||
|
@ -290,3 +297,14 @@ function wc_check_if_attribute_name_is_reserved( $attribute_name ) {
|
|||
function wc_attributes_array_filter_visible( $attribute ) {
|
||||
return $attribute && is_a( $attribute, 'WC_Product_Attribute' ) && $attribute->get_visible() && ( ! $attribute->is_taxonomy() || taxonomy_exists( $attribute->get_name() ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for array filter to get variation attributes only.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Product $product
|
||||
* @return bool
|
||||
*/
|
||||
function wc_attributes_array_filter_variation( $attribute ) {
|
||||
return $attribute && is_a( $attribute, 'WC_Product_Attribute' ) && $attribute->get_variation();
|
||||
}
|
||||
|
|
|
@ -50,6 +50,19 @@ add_filter( 'woocommerce_short_description', 'shortcode_unautop' );
|
|||
add_filter( 'woocommerce_short_description', 'prepend_attachment' );
|
||||
add_filter( 'woocommerce_short_description', 'do_shortcode', 11 ); // AFTER wpautop()
|
||||
|
||||
/**
|
||||
* Define a constant if it is not already defined.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param string $name
|
||||
* @param string $value
|
||||
*/
|
||||
function wc_maybe_define_constant( $name, $value ) {
|
||||
if ( ! defined( $name ) ) {
|
||||
define( $name, $value );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new order programmatically.
|
||||
*
|
||||
|
|
|
@ -323,28 +323,40 @@ function wc_placeholder_img( $size = 'shop_thumbnail' ) {
|
|||
*
|
||||
* Gets a formatted version of variation data or item meta.
|
||||
*
|
||||
* @param string $variation
|
||||
* @param array|WC_Product_Variation $variation
|
||||
* @param bool $flat (default: false)
|
||||
* @param bool $include_names include attribute names/labels
|
||||
* @return string
|
||||
*/
|
||||
function wc_get_formatted_variation( $variation, $flat = false ) {
|
||||
function wc_get_formatted_variation( $variation, $flat = false, $include_names = true ) {
|
||||
$return = '';
|
||||
if ( is_array( $variation ) ) {
|
||||
|
||||
if ( is_a( $variation, 'WC_Product_Variation' ) ) {
|
||||
$variation_attributes = $variation->get_attributes();
|
||||
$product = $variation;
|
||||
} else {
|
||||
$variation_attributes = $variation;
|
||||
$product = false;
|
||||
}
|
||||
|
||||
$list_type = $include_names ? 'dl' : 'ul';
|
||||
|
||||
if ( is_array( $variation_attributes ) ) {
|
||||
|
||||
if ( ! $flat ) {
|
||||
$return = '<dl class="variation">';
|
||||
$return = '<' . $list_type . ' class="variation">';
|
||||
}
|
||||
|
||||
$variation_list = array();
|
||||
|
||||
foreach ( $variation as $name => $value ) {
|
||||
foreach ( $variation_attributes as $name => $value ) {
|
||||
if ( ! $value ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If this is a term slug, get the term's nice name
|
||||
if ( taxonomy_exists( esc_attr( str_replace( 'attribute_', '', $name ) ) ) ) {
|
||||
$term = get_term_by( 'slug', $value, esc_attr( str_replace( 'attribute_', '', $name ) ) );
|
||||
if ( taxonomy_exists( $name ) ) {
|
||||
$term = get_term_by( 'slug', $value, $name );
|
||||
if ( ! is_wp_error( $term ) && ! empty( $term->name ) ) {
|
||||
$value = $term->name;
|
||||
}
|
||||
|
@ -352,10 +364,18 @@ function wc_get_formatted_variation( $variation, $flat = false ) {
|
|||
$value = ucwords( str_replace( '-', ' ', $value ) );
|
||||
}
|
||||
|
||||
if ( $flat ) {
|
||||
$variation_list[] = wc_attribute_label( str_replace( 'attribute_', '', $name ) ) . ': ' . rawurldecode( $value );
|
||||
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 {
|
||||
$variation_list[] = '<dt>' . wc_attribute_label( str_replace( 'attribute_', '', $name ) ) . ':</dt><dd>' . rawurldecode( $value ) . '</dd>';
|
||||
if ( $flat ) {
|
||||
$variation_list[] = rawurldecode( $value );
|
||||
} else {
|
||||
$variation_list[] = '<li>' . rawurldecode( $value ) . '</li>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -366,7 +386,7 @@ function wc_get_formatted_variation( $variation, $flat = false ) {
|
|||
}
|
||||
|
||||
if ( ! $flat ) {
|
||||
$return .= '</dl>';
|
||||
$return .= '</' . $list_type . '>';
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
|
@ -935,6 +955,17 @@ function wc_products_array_filter_visible( $product ) {
|
|||
return $product && is_a( $product, 'WC_Product' ) && $product->is_visible();
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for array filter to get products the user can edit only.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Product $product
|
||||
* @return bool
|
||||
*/
|
||||
function wc_products_array_filter_editable( $product ) {
|
||||
return $product && is_a( $product, 'WC_Product' ) && current_user_can( 'edit_product', $product->get_id() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort an array of products by a value.
|
||||
* @since 2.7.0
|
||||
|
|
|
@ -347,6 +347,6 @@ class WC_Tests_Product_Data_Store extends WC_Unit_Test_Case {
|
|||
|
||||
$this->assertEquals( 'publish', $loaded_variation->get_status( 'edit' ) );
|
||||
$_attribute = $loaded_variation->get_attributes( 'edit' );
|
||||
$this->assertEquals( 'green', $_attribute['attribute_color'] );
|
||||
$this->assertEquals( 'green', $_attribute['color'] );
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue