2015-06-25 139 views
1

我有一個非常基本的問題,我猜與woocommerce和wordpress一起工作的人會知道如何解決這個問題。Woocommerce在添加新產品之前刪除購物車

我有一個客戶在頁面上創建的可定製產品,然後能夠將其添加到購物車。

產品和加入購物車按鈕可以很好地說。

它增加了產品 - 但它在添加新定製產品之前清理購物車。它爲什麼這樣做?我怎樣才能避免它 - 所以它只是在清空當前的購物車之前添加另一個。

我添加到購物車按鈕:

$woocommerce->cart->add_to_cart($product_ID, $quantity=1) 

我的產品創新:

function customcart() { 

    if (isset($_POST["addcustomcarts"])) { 

    global $woocommerce; 
    $my_post = array(
     'post_title' => 'Design selv skilt', 
     'post_content' => '<div class="col-md-12">Dette er et design selv skilt, tjek egenskaber på produktet for at se hvad kunden har bestilt.</div>', 
     'post_status' => 'publish', 
     'post_author' => 1, 
     'post_type'  => 'product' 
    ); 

    // Insert the post into the database 
    $product_ID = wp_insert_post($my_post); 

    $filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1); 

    //Decode the string 
    $unencodedData=base64_decode($filteredData); 

    //Save the image 
    file_put_contents('img' . $product_ID . '.png', $unencodedData); 

    if ($product_ID){ 
     wp_set_object_terms($product_ID, 'design-selv-skilte', 'product_cat'); 
     add_post_meta($product_ID, '_regular_price', $_POST["priceInput"]); 
     add_post_meta($product_ID, '_price', $_POST["priceInput"]); 
     add_post_meta($product_ID, '_stock_status', 'instock'); 
     //add_post_meta($product_ID, '_manage_stock', 'yes');  
     //add_post_meta($product_ID, '_stock', '10'); 
     add_post_meta($product_ID, '_sku', 'designselvskilt-' . $product_ID); 
     add_post_meta($product_ID, '_visibility', 'hidden'); 
     add_post_meta($product_ID, 'tekst-paa-linje-1', $_POST["textInput"]); 
     add_post_meta($product_ID, 'tekst-paa-linje-2', $_POST["text2Input"]); 
     add_post_meta($product_ID, 'stoerrelse', $_POST["størrelseInput"]); 
     add_post_meta($product_ID, 'form', $_POST["formInput"]); 
     add_post_meta($product_ID, 'farve', $_POST["farveInput"]); 
     add_post_meta($product_ID, 'type-skilt', $_POST["typeInput"]); 
     add_post_meta($product_ID, 'fastgoering', $_POST["fastgøringInput"]); 
     add_post_meta($product_ID, 'font', $_POST["fontInput"]); 
     add_post_meta($product_ID, 'linje-1-font-size', $_POST["fontSizeLine1Input"]); 
     add_post_meta($product_ID, 'linje-2-font-size', $_POST["fontSizeLine2Input"]); 
     add_post_meta($product_ID, 'product_image_gallery', $_POST["img_val"]); 
     add_post_meta($product_ID, 'product_image_url', 'img' . $product_ID . '.png'); 
     require_once(ABSPATH . 'wp-admin/includes/media.php'); 
     require_once(ABSPATH . 'wp-admin/includes/file.php'); 
     require_once(ABSPATH . 'wp-admin/includes/image.php'); 
     $home = home_url(); 
     $url = $home . '/img' . $product_ID . '.png'; 
     $post_id = $product_ID; 
     $desc = $_POST["textInput"]; 
     $image = media_sideload_image($url, $post_id, $desc, src); 

       function getImageId($image) { 
      // Split the $url into two parts with the wp-content directory as the separator 
      $parsed_url = explode(parse_url(WP_CONTENT_URL, PHP_URL_PATH), $image); 

      // Get the host of the current site and the host of the $url, ignoring www 
      $this_host = str_ireplace('www.', '', parse_url(home_url(), PHP_URL_HOST)); 
      $file_host = str_ireplace('www.', '', parse_url($image, PHP_URL_HOST)); 

      // Return nothing if there aren't any $url parts or if the current host and $url host do not match 
      if (! isset($parsed_url[1]) || empty($parsed_url[1]) || ($this_host != $file_host)) { 
       return; 
      } 

      // Now we're going to quickly search the DB for any attachment GUID with a partial path match 
      // Example: /uploads/2013/05/test-image.jpg 
      global $wpdb; 

      $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM {$wpdb->prefix}posts WHERE guid RLIKE %s;", $parsed_url[1])); 

      // Returns null if no attachment is found 
      return $attachment[0]; 
     }  

     set_post_thumbnail($post_id, getImageId($image));  

     $woocommerce->cart->add_to_cart($product_ID, $quantity=1); 

     wp_redirect('/kurv'); exit; 

    } 
    } 

} 
+0

您是否嘗試過的woocommerce支持論壇還沒有一個過濾器?你更有可能在那裏得到答案。 –

+0

也發佈在那裏。 –

回答

0

因此,這裏是這個問題的解決方案,馬修指着我在正確的方向關於車會議,但爲我工作的代碼是這樣的:

添加產品到購物車所以之前,我不得不檢索當前購物車會話。

$woocommerce->cart->get_cart_from_session(); 
$woocommerce->cart->add_to_cart($product_ID); 
0

你檢查值您傳遞給$woocommerce->cart->add_to_cart($product_ID, $quantity=1)

什麼爲之傾倒生成SQL和嘗試運行它,看它是否返回任何錯誤?

+0

我已經檢查過,它確實將產品添加到購物車,它只是在添加購物車之前清空購物車 - 這就是問題所在。 –

+0

不想讓你知道這樣的雞蛋,但只需檢查在調用操作時發送的查詢,並查看哪個操作不正確。它的要麼被刪除/更新,要麼創建一個未加入過去產品的新關係,可能會被分配一個新的籃子ID。 也許看看過去的籃子內容是否仍然可以通過數據庫訪問? – atoms

1

看來你並不是唯一一個發現車需要先初始化從中獲得一致的和預期的行爲:

我建議你考慮進入類似的東西:

$woocommerce->session->set_customer_session_cookie(true); 

爲了讓事情繼續下去,以便您不製作和設置新購物車,重寫舊的。

此外

我想,這可能會造成問題的道路:

$woocommerce->cart->add_to_cart($product_ID, $quantity=1); 

這是一樣的把

$woocommerce->cart->add_to_cart($product_ID, TRUE); 

其原因是是,你是傳遞給該方法的結果是$quantity=1,這幾乎總是成功的。

你是什麼意思是:

$woocommerce->cart->add_to_cart($product_ID, 1); 

但是我的猜測是,你拿了方法簽名這表明,第二個參數是可選的,默認爲整數之一,如果值在遺漏這種情況下,你可以使它更簡單搭配:

$woocommerce->cart->add_to_cart($product_ID); 

如果你只是想傳遞變量,那麼你需要像這樣

$quantity = 1; 
// ... any other code 
$woocommerce->cart->add_to_cart($product_ID, $quantity); 
+0

很好的建議,但它不能解決問題,無論我們使用哪種方法,建議您在添加新產品前仍會清空購物車。它可能與我使用的實際方法有關,與主題功能相沖突還是與購物車sesseion衝突? –

+0

我一直在閱讀有關課程。它具有加載會話,啓動會話和檢查購物車內容的方法。此外,很多示例靜態地(但不是全部)稱這個類,所以我對於什麼時候應該做什麼做了太多的假設。 –

+0

值得一提的是,如果我先添加可定製產品,然後再添加常規產品,那麼它工作正常。 –

1

有針對

add_filter('woocommerce_add_cart_item_data', 'wdm_empty_cart', 10, 3); 
function wdm_empty_cart($cart_item_data, $product_id, $variation_id) 
{ 
    global $woocommerce; 
    $woocommerce->cart->empty_cart(); 

    // Do nothing with the data and return 
    return $cart_item_data; 
} 
+0

您爲我節省了一些時間來挖掘woocommerce掛鉤+1 –

相關問題