Merge pull request #17899 from woocommerce/update/17321
Uncategorized category support
This commit is contained in:
commit
c1c02cd0aa
|
@ -299,22 +299,29 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
|
||||||
* Render any custom filters and search inputs for the list table.
|
* Render any custom filters and search inputs for the list table.
|
||||||
*/
|
*/
|
||||||
protected function render_filters() {
|
protected function render_filters() {
|
||||||
$current_category_slug = isset( $_REQUEST['product_cat'] ) ? wc_clean( wp_unslash( $_REQUEST['product_cat'] ) ) : false; // WPCS: input var ok, sanitization ok.
|
// Category Filtering.
|
||||||
$current_product_type = isset( $_REQUEST['product_type'] ) ? wc_clean( wp_unslash( $_REQUEST['product_type'] ) ) : false; // WPCS: input var ok, sanitization ok.
|
$categories_count = (int) wp_count_terms( 'product_cat' );
|
||||||
// @codingStandardsIgnoreStart
|
|
||||||
$current_category = $current_category_slug ? get_term_by( 'slug', $current_category_slug, 'product_cat' ): false;
|
|
||||||
// @codingStandardsIgnoreEnd
|
|
||||||
?>
|
|
||||||
<select class="wc-category-search" name="product_cat" data-placeholder="<?php esc_attr_e( 'Filter by category', 'woocommerce' ); ?>" data-allow_clear="true">
|
|
||||||
<?php if ( $current_category_slug && $current_category ) : ?>
|
|
||||||
<option value="<?php echo esc_attr( $current_category_slug ); ?>" selected="selected"><?php echo esc_html( $current_category->name ); ?><option>
|
|
||||||
<?php endif; ?>
|
|
||||||
</select>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
$terms = get_terms( 'product_type' );
|
if ( $categories_count <= apply_filters( 'woocommerce_product_category_filter_threshold', 100 ) ) {
|
||||||
$output = '<select name="product_type" id="dropdown_product_type">';
|
wc_product_dropdown_categories( array(
|
||||||
$output .= '<option value="">' . __( 'Filter by product type', 'woocommerce' ) . '</option>';
|
'option_select_text' => __( 'Filter by category', 'woocommerce' ),
|
||||||
|
) );
|
||||||
|
} else {
|
||||||
|
$current_category_slug = isset( $_GET['product_cat'] ) ? wc_clean( wp_unslash( $_GET['product_cat'] ) ) : false; // WPCS: input var ok, CSRF ok.
|
||||||
|
$current_category = $current_category_slug ? get_term_by( 'slug', $current_category_slug, 'product_cat' ) : false;
|
||||||
|
?>
|
||||||
|
<select class="wc-category-search" name="product_cat" data-placeholder="<?php esc_attr_e( 'Filter by category', 'woocommerce' ); ?>" data-allow_clear="true">
|
||||||
|
<?php if ( $current_category_slug && $current_category ) : ?>
|
||||||
|
<option value="<?php echo esc_attr( $current_category_slug ); ?>" selected="selected"><?php echo esc_html( $current_category->name ); ?><option>
|
||||||
|
<?php endif; ?>
|
||||||
|
</select>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
// Product type filtering.
|
||||||
|
$current_product_type = isset( $_REQUEST['product_type'] ) ? wc_clean( wp_unslash( $_REQUEST['product_type'] ) ) : false; // WPCS: input var ok, sanitization ok.
|
||||||
|
$terms = get_terms( 'product_type' );
|
||||||
|
$output = '<select name="product_type" id="dropdown_product_type"><option value="">' . __( 'Filter by product type', 'woocommerce' ) . '</option>';
|
||||||
|
|
||||||
foreach ( $terms as $term ) {
|
foreach ( $terms as $term ) {
|
||||||
$output .= '<option value="' . sanitize_title( $term->name ) . '" ';
|
$output .= '<option value="' . sanitize_title( $term->name ) . '" ';
|
||||||
|
|
|
@ -98,6 +98,7 @@ class WC_Install {
|
||||||
),
|
),
|
||||||
'3.3.0' => array(
|
'3.3.0' => array(
|
||||||
'wc_update_330_image_options',
|
'wc_update_330_image_options',
|
||||||
|
'wc_update_330_set_default_product_cat',
|
||||||
'wc_update_330_db_version',
|
'wc_update_330_db_version',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -454,11 +455,33 @@ class WC_Install {
|
||||||
|
|
||||||
foreach ( $taxonomies as $taxonomy => $terms ) {
|
foreach ( $taxonomies as $taxonomy => $terms ) {
|
||||||
foreach ( $terms as $term ) {
|
foreach ( $terms as $term ) {
|
||||||
if ( ! get_term_by( 'name', $term, $taxonomy ) ) {
|
if ( ! get_term_by( 'name', $term, $taxonomy ) ) { // @codingStandardsIgnoreLine.
|
||||||
wp_insert_term( $term, $taxonomy );
|
wp_insert_term( $term, $taxonomy );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$woocommerce_default_category = get_option( 'default_product_cat', 0 );
|
||||||
|
|
||||||
|
if ( ! $woocommerce_default_category || ! term_exists( $woocommerce_default_category, 'product_cat' ) ) {
|
||||||
|
$default_product_cat_id = 0;
|
||||||
|
$default_product_cat_slug = sanitize_title( _x( 'Uncategorized', 'Default category slug', 'woocommerce' ) );
|
||||||
|
$default_product_cat = get_term_by( 'slug', $default_product_cat_slug, 'product_cat' ); // @codingStandardsIgnoreLine.
|
||||||
|
|
||||||
|
if ( $default_product_cat ) {
|
||||||
|
$default_product_cat_id = absint( $default_product_cat->term_taxonomy_id );
|
||||||
|
} else {
|
||||||
|
$result = wp_insert_term( _x( 'Uncategorized', 'Default category slug', 'woocommerce' ), 'product_cat', array( 'slug' => $default_product_cat_slug ) );
|
||||||
|
|
||||||
|
if ( ! empty( $result['term_taxonomy_id'] ) ) {
|
||||||
|
$default_product_cat_id = absint( $result['term_taxonomy_id'] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $default_product_cat_id ) {
|
||||||
|
update_option( 'default_product_cat', $default_product_cat_id );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -31,6 +31,7 @@ class WC_Post_Data {
|
||||||
add_filter( 'post_type_link', array( __CLASS__, 'variation_post_link' ), 10, 2 );
|
add_filter( 'post_type_link', array( __CLASS__, 'variation_post_link' ), 10, 2 );
|
||||||
add_action( 'shutdown', array( __CLASS__, 'do_deferred_product_sync' ), 10 );
|
add_action( 'shutdown', array( __CLASS__, 'do_deferred_product_sync' ), 10 );
|
||||||
add_action( 'set_object_terms', array( __CLASS__, 'set_object_terms' ), 10, 6 );
|
add_action( 'set_object_terms', array( __CLASS__, 'set_object_terms' ), 10, 6 );
|
||||||
|
add_action( 'set_object_terms', array( __CLASS__, 'force_default_term' ), 10, 5 );
|
||||||
|
|
||||||
add_action( 'transition_post_status', array( __CLASS__, 'transition_post_status' ), 10, 3 );
|
add_action( 'transition_post_status', array( __CLASS__, 'transition_post_status' ), 10, 3 );
|
||||||
add_action( 'woocommerce_product_set_stock_status', array( __CLASS__, 'delete_product_query_transients' ) );
|
add_action( 'woocommerce_product_set_stock_status', array( __CLASS__, 'delete_product_query_transients' ) );
|
||||||
|
@ -500,6 +501,27 @@ class WC_Post_Data {
|
||||||
public static function flush_object_meta_cache( $meta_id, $object_id, $meta_key, $meta_value ) {
|
public static function flush_object_meta_cache( $meta_id, $object_id, $meta_key, $meta_value ) {
|
||||||
WC_Cache_Helper::incr_cache_prefix( 'object_' . $object_id );
|
WC_Cache_Helper::incr_cache_prefix( 'object_' . $object_id );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure default category gets set.
|
||||||
|
*
|
||||||
|
* @since 3.3.0
|
||||||
|
* @param int $object_id Product ID.
|
||||||
|
* @param array $terms Terms array.
|
||||||
|
* @param array $tt_ids Term ids array.
|
||||||
|
* @param string $taxonomy Taxonomy name.
|
||||||
|
* @param bool $append Are we appending or setting terms.
|
||||||
|
*/
|
||||||
|
public static function force_default_term( $object_id, $terms, $tt_ids, $taxonomy, $append ) {
|
||||||
|
if ( ! $append && 'product_cat' === $taxonomy && empty( $tt_ids ) && 'product' === get_post_type( $object_id ) ) {
|
||||||
|
$default_term = absint( get_option( 'default_product_cat', 0 ) );
|
||||||
|
$tt_ids = array_map( 'absint', $tt_ids );
|
||||||
|
|
||||||
|
if ( $default_term && ! in_array( $default_term, $tt_ids, true ) ) {
|
||||||
|
wp_set_post_terms( $object_id, array( $default_term ), 'product_cat', true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WC_Post_Data::init();
|
WC_Post_Data::init();
|
||||||
|
|
|
@ -585,15 +585,21 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
|
||||||
/**
|
/**
|
||||||
* For all stored terms in all taxonomies, save them to the DB.
|
* For all stored terms in all taxonomies, save them to the DB.
|
||||||
*
|
*
|
||||||
* @param WC_Product
|
* @param WC_Product $product Product object.
|
||||||
* @param bool Force update. Used during create.
|
* @param bool $force Force update. Used during create.
|
||||||
* @since 3.0.0
|
* @since 3.0.0
|
||||||
*/
|
*/
|
||||||
protected function update_terms( &$product, $force = false ) {
|
protected function update_terms( &$product, $force = false ) {
|
||||||
$changes = $product->get_changes();
|
$changes = $product->get_changes();
|
||||||
|
|
||||||
if ( $force || array_key_exists( 'category_ids', $changes ) ) {
|
if ( $force || array_key_exists( 'category_ids', $changes ) ) {
|
||||||
wp_set_post_terms( $product->get_id(), $product->get_category_ids( 'edit' ), 'product_cat', false );
|
$categories = $product->get_category_ids( 'edit' );
|
||||||
|
|
||||||
|
if ( empty( $categories ) && get_option( 'default_product_cat', 0 ) ) {
|
||||||
|
$categories = array( get_option( 'default_product_cat', 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
wp_set_post_terms( $product->get_id(), $categories, 'product_cat', false );
|
||||||
}
|
}
|
||||||
if ( $force || array_key_exists( 'tag_ids', $changes ) ) {
|
if ( $force || array_key_exists( 'tag_ids', $changes ) ) {
|
||||||
wp_set_post_terms( $product->get_id(), $product->get_tag_ids( 'edit' ), 'product_tag', false );
|
wp_set_post_terms( $product->get_id(), $product->get_tag_ids( 'edit' ), 'product_tag', false );
|
||||||
|
|
|
@ -1432,6 +1432,34 @@ function wc_update_330_image_options() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign default cat to all products with no cats.
|
||||||
|
*/
|
||||||
|
function wc_update_330_set_default_product_cat() {
|
||||||
|
global $wpdb;
|
||||||
|
|
||||||
|
$default_category = get_option( 'default_product_cat', 0 );
|
||||||
|
|
||||||
|
if ( $default_category ) {
|
||||||
|
$result = $wpdb->query( $wpdb->prepare( "
|
||||||
|
INSERT INTO {$wpdb->term_relationships} (object_id, term_taxonomy_id)
|
||||||
|
SELECT DISTINCT posts.ID, %s FROM {$wpdb->posts} posts
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT object_id FROM {$wpdb->term_relationships} term_relationships
|
||||||
|
LEFT JOIN {$wpdb->term_taxonomy} term_taxonomy ON term_relationships.term_taxonomy_id = term_taxonomy.term_taxonomy_id
|
||||||
|
WHERE term_taxonomy.taxonomy = 'product_cat'
|
||||||
|
) AS tax_query
|
||||||
|
ON posts.ID = tax_query.object_id
|
||||||
|
WHERE posts.post_type = 'product'
|
||||||
|
AND tax_query.object_id IS NULL
|
||||||
|
", $default_category ) );
|
||||||
|
wp_cache_flush();
|
||||||
|
delete_transient( 'wc_term_counts' );
|
||||||
|
wp_update_term_count_now( array( $default_category ), 'product_cat' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update DB Version.
|
* Update DB Version.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue