簡體   English   中英

Woocommerce在添加新產品之前刪除了購物車

[英]Woocommerce deletes cart before adding new product

我有一個非常基本的問題,我想與woocommerce和wordpress一起工作的人會知道如何解決這個問題。

我有一個客戶可以在頁面上創建的可定制產品,然后可以將其添加到購物車中。

產品和“添加到購物車”按鈕可以正常工作。

它添加了產品-但在添加新定制的產品之前,它會清空購物車。 為什么這樣做呢? 以及如何避免這種情況-因此,在清空當前購物車之前,只需在購物車中添加另一個即可。

我的添加到購物車按鈕:

$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;

    }
  }

}

似乎您不是唯一發現需要首先初始化購物車以從中獲得一致和預期行為的人:

我建議您考慮加入以下內容:

$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 );

但是我的猜測是,您采用了方法簽名,該簽名顯示了第二個參數是可選的,並且如果省略則默認為整數1的值,在這種情況下,您可以使用以下方法使其更簡單:

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

如果只想傳遞變量,則需要這樣的東西

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

有一個過濾器

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;
}

您是否檢查了傳遞給$woocommerce->cart->add_to_cart( $product_ID, $quantity=1 )

轉儲它生成的SQL並嘗試運行它,看看它是否返回任何錯誤,該怎么辦?

因此,這是此問題的解決方案,Matthew向我指出了有關購物車會話的正確方向,但是對我有用的代碼是:

因此,在將產品添加到購物車之前,我必須檢索當前的購物車會話。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM