/var/www/html_us/wp-content/plugins/woocommerce/src/Internal/AssignDefaultCategory.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
/**
 * AssignDefaultCategory class file.
 */

namespace Automattic\WooCommerce\Internal;

defined'ABSPATH' ) || exit;

/**
 * Class to assign default category to products.
 */
class AssignDefaultCategory {
    
/**
     * Class initialization, to be executed when the class is resolved by the container.
     *
     * @internal
     */
    
final public function init() {
        
add_action'wc_schedule_update_product_default_cat', array( $this'maybe_assign_default_product_cat' ) );
    }

    
/**
     * When a product category is deleted, we need to check
     * if the product has no categories assigned. Then assign
     * it a default category. We delay this with a scheduled
     * action job to not block the response.
     *
     * @return void
     */
    
public function schedule_action() {
        
WC()->queue()->schedule_single(
            
time(),
            
'wc_schedule_update_product_default_cat',
            array(),
            
'wc_update_product_default_cat'
        
);
    }

    
/**
     * Assigns default product category for products
     * that have no categories.
     *
     * @return void
     */
    
public function maybe_assign_default_product_cat() {
        global 
$wpdb;

        
$default_category get_option'default_product_cat');

        if ( 
$default_category ) {
            
$affected_rows $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
                
)
            );
            if ( 
$affected_rows ) {
                
wp_cache_flush();
                
delete_transient'wc_term_counts' );
                
wp_update_term_count_now( array( $default_category ), 'product_cat' );
            }
        }
    }
}