Woocommerce - 无法删除产品变体

时间:2014-03-31 10:01:05

标签: ajax wordpress woocommerce

使用WooCommerce 2.6.1

我无法删除变量产品的产品变体:ajax调用后记录仍在数据库中。 似乎ajax调用没有通过:put error_log(print_r(' remove_variation',true));不输出任何东西(类-wc-ajax.php中的第387行)。 该操作将添加到类的构造函数中。函数public function remove_variation()不会被调用。

有没有人遇到同样的问题,并找到了一种方法让它发挥作用?

2 个答案:

答案 0 :(得分:1)

/**
* Trash a variation, don't delete it permanently.
*
* This is hooked to
* Hijack WooCommerce's WC_AJAX::remove_variation() "Delete Variation" Trash a variation if it is a subscription variation via ajax function
*/
public static function remove_variations() {

if ( isset( $_POST['variation_id'] ) ) { // removing single variation
error_log("here3");

check_ajax_referer( 'delete-variation', 'security' );
$variation_ids = array( $_POST['variation_id'] );
error_log($_POST['variation_id']);

} else { // removing multiple variations
error_log("here4");

check_ajax_referer( 'delete-variations', 'security' );
$variation_ids = (array) $_POST['variation_ids'];

}

foreach ( $variation_ids as $variation_id ) {

$variation_post = get_post( $variation_id );
error_log(print_r($variation_post, ));

if ( $variation_post && $variation_post->post_type == 'product_variation' ) {

$variation_product = get_product( $variation_id );

if ( $variation_product && $variation_product->is_type( 'subscription_variation' ) ) {
wp_trash_post( $variation_id );
}
}
}
die();
}

删除&& $ variation_product-> is_type('subscription_variation')解决了不可删除变体的问题。 http://support.woothemes.com/requests/162693应提供补丁,已报告问题。

答案 1 :(得分:0)

完全删除变体

这是用于 WooCommerece 版本 3+ (此代码要放在函数或自定义插件中:不是 Rest api)

删除变体不会删除色板,

它只是使色板禁用。(这可能有点令人尴尬)

如果您不再需要产品组合中的变体,则应将其删除。 如果您使用 slug (SKU) 中的可识别字符串创建了变体,则可以使用以下代码。

function delete_variation($product_cat="all",$Sku__search_string="",$force_delete=false,$document_it=false){
 
    // 'posts_per_page' => -1: goes through all posts
 
     if($product_cat=="all") {    
         $args = array( 
             'post_type'      => 'product',
             'posts_per_page' => -1,          
         );
     } else {
         $args = array( 
             'post_type'      => 'product',
             'posts_per_page' => -1,
             'product_cat'    => $product_cat
         );
     }
    $query = new WP_Query($args);
 
    while ( $query->have_posts() ) {    
         $query->the_post();
         $post_id = get_the_ID();
         $product = wc_get_product($post_id);  
         $product_id = $product->get_id(); //same as post_id
 
         //if you want to see what you are doing put $document_it to true;
                                 
         if($document_it) echo "<br>*********** $product_id ****************<br>";
 
         if($Sku__search_string!="")   { 
 
            $variations = $product->get_available_variations();
 
            foreach($variations as $variation){
 
                 //get the SKU slug of the variation
                 $sku=$variation["sku"]; 
 
                 //get the variation id
                 $variation_id=$variation['variation_id'];
                 if($document_it) echo "varid $variation_id <br>";
 
                 //and then get the actual variation product
                 $var_product=wc_get_product($variation_id);  
                
                 //Check if the search_string is in the slug
 
                 //You can modify this, or modify the $args above,
                 //if you have other criteria
                                  
                if(stripos($sku,$Sku__search_string)>0){  
                     $is_deleted=false; 
 
                     //here the variation is deleted
                     $is_deleted=$var_product->delete($force_delete);
 
                     if($is_deleted){
                         if($document_it) echo "<br>Deleted:  $sku";
                     } else {
                         if($document_it) echo "<br>Not deleted:  $sku";
                     }
                }   
            }        
        }           
    }                   
}    

如果你想delete all variations you may use this