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.
|
||||
*/
|
||||
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.
|
||||
$current_product_type = isset( $_REQUEST['product_type'] ) ? wc_clean( wp_unslash( $_REQUEST['product_type'] ) ) : false; // WPCS: input var ok, sanitization ok.
|
||||
// @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
|
||||
// Category Filtering.
|
||||
$categories_count = (int) wp_count_terms( 'product_cat' );
|
||||
|
||||
$terms = get_terms( 'product_type' );
|
||||
$output = '<select name="product_type" id="dropdown_product_type">';
|
||||
$output .= '<option value="">' . __( 'Filter by product type', 'woocommerce' ) . '</option>';
|
||||
if ( $categories_count <= apply_filters( 'woocommerce_product_category_filter_threshold', 100 ) ) {
|
||||
wc_product_dropdown_categories( array(
|
||||
'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 ) {
|
||||
$output .= '<option value="' . sanitize_title( $term->name ) . '" ';
|
||||
|
|
|
@ -98,6 +98,7 @@ class WC_Install {
|
|||
),
|
||||
'3.3.0' => array(
|
||||
'wc_update_330_image_options',
|
||||
'wc_update_330_set_default_product_cat',
|
||||
'wc_update_330_db_version',
|
||||
),
|
||||
);
|
||||
|
@ -454,11 +455,33 @@ class WC_Install {
|
|||
|
||||
foreach ( $taxonomies as $taxonomy => $terms ) {
|
||||
foreach ( $terms as $term ) {
|
||||
if ( ! get_term_by( 'name', $term, $taxonomy ) ) {
|
||||
if ( ! get_term_by( 'name', $term, $taxonomy ) ) { // @codingStandardsIgnoreLine.
|
||||
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_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__, 'force_default_term' ), 10, 5 );
|
||||
|
||||
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' ) );
|
||||
|
@ -500,6 +501,27 @@ class WC_Post_Data {
|
|||
public static function flush_object_meta_cache( $meta_id, $object_id, $meta_key, $meta_value ) {
|
||||
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();
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* @param WC_Product
|
||||
* @param bool Force update. Used during create.
|
||||
* @param WC_Product $product Product object.
|
||||
* @param bool $force Force update. Used during create.
|
||||
* @since 3.0.0
|
||||
*/
|
||||
protected function update_terms( &$product, $force = false ) {
|
||||
$changes = $product->get_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 ) ) {
|
||||
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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue