WordPress

woocommerce offtopic – Jak zaktualizować wszystkie produkty z tymi samymi prefiksami SKU podczas aktualizacji zapasów za pomocą CSV?

  • 10 stycznia, 2023
  • 3 min read
woocommerce offtopic – Jak zaktualizować wszystkie produkty z tymi samymi prefiksami SKU podczas aktualizacji zapasów za pomocą CSV?


W moim sklepie WooCommerce jest kilka przypadków, w których pokazuję ten sam zmienny produkt z różnymi nazwami i opisami (ze względów SEO). Ponieważ WooCommerce nie pozwala na używanie tego samego SKU dla kilku produktów, do zduplikowanych produktów dodaję sufiks „_2”, „_3” itp. Na przykład, jeśli główny produkt zmienny ma SKU „12345678” dla odmiany, zduplikowany produkt będzie miał SKU „12345678_2” dla tej samej odmiany. Ustawiłem również niestandardowe pole „tri_produits” z tą samą wartością dla wszystkich zduplikowanych produktów, aby łatwo je znaleźć.

Teraz chcę zaktualizować zapasy i ceny wszystkich zduplikowanych produktów, gdy aktualizuję cenę z pliku CSV (za pomocą przycisku Produkty WooCommerce -> Importuj). Napisałem więc poniższy kod:

function update_imported_product($object, $data)
{

    // Update variable products with same SKU + suffix.

    if ($object->get_type() === 'variation'){
        $product_id = wp_get_post_parent_id($object->get_id());
    }
    else
    {
        $product_id = $object->get_id();    
    }
    
    // Looking for other products with same value for custom field tri_produits (these are the duplicated products)

    if(isset($product_id))
    {

        $tri_produits = get_post_meta($product_id, 'tri_produits', true);
        $ugs = get_post_meta($product_id, '_sku', true); //$object->get_sku();

        if(isset($tri_produits))
        {

            $args = array(
                'post_type'  => 'product',
                'meta_query' => array(
                    array(
                        'key'   => 'tri_produits',
                        'value' => $tri_produits,
                    )
                )
            );                  
            // Get the products
            $products = get_posts( $args);
            if(!empty($products))
            {
                
                if(count($products) > 1)
                {

                    foreach ( $products as $product ) 
                    {

                        // Check if this is another product
                        if($product->ID != $product_id)
                        {
                            // Loop on variations and check if same sku prefix
                            $product_variations = get_posts( [
                                'post_type'       => 'product_variation',
                                'posts_per_page'  => -1,
                                'fields'          => 'ids',
                                'post_parent'     => $product->ID,
                            ] );

                            if ( !empty( $product_variations ) ) {

                                foreach ( $product_variations as $product_variation_id ) {
                                    $sku = get_post_meta( $product_variation_id, '_sku', true );
                            
                                    if(str_starts_with($sku,$ugs.'_') || str_starts_with($sku,$ugs.'-'))
                                    {
                                            
                                        // Update stock
                                        $product_variation = new WC_Product_Variation($product_variation_id);
                                        if ($object->get_type() === 'variation'){
                                            $pr=new WC_Product_Variation($object->get_id());
                                        }
                                        else{
                                            $pr=new WC_Product($object->get_id());
                                        }
                                        /*if($pr->get_stock_quantity() != $product_variation->get_stock_quantity())*/
                                        $product_variation->set_stock_quantity($pr->get_stock_quantity());
                                        $product_variation->set_weight($pr->get_weight());
                                        $product_variation->set_regular_price($pr->get_regular_price()); 
                                        $product_variation->save();

                                    }
                                }                                           
                            }                                                                                
                        }
                    }
                }
            }                       
        }
    }       

    
    return $object;
}
//add_filter('woocommerce_product_import_pre_insert_product_object', 'update_product_at_import', 10, 2);
add_action( 'woocommerce_product_import_inserted_product_object', 'update_imported_product', 10, 2 );

Ale to nie działa. Znajduje zduplikowane produkty poprawnie, ale kiedy kod edytuje i zapisuje je, produkty się nie zmieniają. Co powinienem zmienić w moim kodzie?

Warto przeczytać!  Jak dodać rolę edytora SEO w WordPress


Źródło