【问题标题】:Delete product if SKU does not exist in csv when importing with the woocommerce built-in CSV importer使用 woocommerce 内置 CSV 导入器导入时,如果 csv 中不存在 SKU,则删除产品
【发布时间】:2021-03-06 05:58:36
【问题描述】:

我正在使用 wordpress 的 woocommerce 插件来建立商店。

似乎内置的 CSV 导入器无法删除不在用于创建/更新当前产品的 CSV 文件中的产品:

例如: 如果在我的商店中带有 SKU 的产品 'a1'、'b1' 和 'c1' 存在并且管理员导入带有 SKU 的产品列表 'a1'、'b1' 带有 SKU 'c1' 的产品应该被删除/移除。

我查看了产品导入器和抽象导入器的代码,似乎不存在这样的选项。

有人知道如何在不安装另一个插件的情况下解决这个问题吗? 也许是一个钩子,用于聚合用于导入的 CSV 文件的 SKU,以便我可以从数据库中加载现有 SKU,与 CSV 中的 SKU 进行比较并自己删除它们?

感谢您的任何想法/帮助! 亲切的问候,米。

【问题讨论】:

    标签: wordpress woocommerce csv-import


    【解决方案1】:

    我可能会采用的方法是使用几个钩子和瞬态:

    add_action( 'woocsv_start_import', 'action_woocsv_start_import', 10, 0 ); 
    

    使用此操作创建一个瞬态,它将在文件中存储一个包含所有 ID/SKU 的数组

    add_filter( 'woocsv_get_product_id', 'filter_woocsv_get_product_id', 10, 2 );
    function filter_woocsv_get_product_id( $product_id, $sku ) { 
        // make filter magic happen here... 
        return $product_id; 
    }
    

    使用此过滤器将 ID 添加到存储在瞬态中的数组中(确保返回 product_id)

    add_action( 'woocsv_after_save', 'action_woocsv_after_save', 10, 1 ); 
    function action_woocsv_after_save( $instance ) { 
        // make action magic happen here... 
    }
    
    

    使用此操作访问(和删除)瞬态。现在您可以访问所有 ID/SKU,您可以使用它们来查找未包含的 ID/SKU,然后将其删除。

    我个人只会使用 WP All Import

    编辑:

    我觉得无聊,所以我写了逻辑。对我来说这似乎有点低效,但它应该是这样的伎俩。未经测试。

    
    add_action( 'woocsv_start_import', 'action_woocsv_start_import', 10, 0 ); 
    
    function action_woocsv_start_import(){
        set_transient('namespace_skus_in_csv',array(),0);
    }
    
    add_filter( 'woocsv_get_product_id', 'filter_woocsv_get_product_id', 10, 2 );
    function filter_woocsv_get_product_id( $product_id, $sku ) { 
        $skus = get_transient('namespace_skus_in_csv');
        $skus[] = $sku;
        set_transient('namespace_skus_in_csv',$ids,0);
        return $product_id; 
    }
    
    add_action( 'woocsv_after_save', 'action_woocsv_after_save', 10, 1 ); 
    function action_woocsv_after_save( $instance ) { 
        $skus = get_transient('namespace_skus_in_csv');
        delete_transient('namespace_skus_in_csv');
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => -1
        );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ){ 
            while ( $loop->have_posts() ){ 
                $loop->the_post();
                global $product;
                $sku = $product->get_sku();
                if(!array_search($sku, $skus)){
                    wp_delete_post(get_the_ID());
                }
            }
        }
        wp_reset_postdata();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 2016-02-25
      • 2016-10-11
      • 2017-08-31
      相关资源
      最近更新 更多