Add Woocommerce Temporary product

2019-02-24 19:14发布

问题:

Help Needed: Is it possible to make a user-generated temporary product to be added to cart in WooCommerce? I'm trying to transfer a non-wordpress website to WordPress, but the site already has a sophisticated e-commerce system that the client doesn't want to change it. What basically happens is a visitor specifies the measurement of the product that the client is selling, add different variations to it, and then after submitting, the website generates the product's price based on the visitor's input. Adding products will be very tedious because they have too many products with thousands of variations. So our solution is this. I'm open to other plugin suggestions aside from WooCommerce. I already tried using Gravity Forms, but I got stuck in the end because our client's current website has to be an e-commerce site after it was added to the cart. Thank you in advance!

回答1:

This is solved! Here is what I did just in case someone needs help with this in the future.

First I made a page with a form. Action is whichever the page will live in and method is post.

<form method="post" action="/order-page">

    <label for="tc_name" title="Full Name">Full Name</label>
    <input type="text" name="tc_name"/>

    <label for="tc_title" title="Product Name">Product Name</label>
    <input type="text" name="tc_title">

    <label for="tc_description" title="Product Description">Product Description</label>
    <textarea name="tc_description"></textarea>

    <label for="tc_price" title="Price">Price</label>
    <input type="number" name="tc_price"/>

    <input type="submit" value="Submit"/>
</form>

Then on the next page, I grabbed the values, created the product based on the values given, and then added a shortcode to display the cart button.

if('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['tc_price'])) {

    //grab the values
    $pName = $_POST["tc_name"];
    $pDescription = $_POST["tc_description"];
    $pPrice = $_POST["tc_price"];
    $post_title = $_POST["tc_title"];

    //add them in an array
    $post = array(
        'post_author' => $pName,
        'post_content' => $pDescription,
        'post_status' => "publish",
        'post_title' => $post_title,
        'post_type' => "product",
    );
    //create product
    $product_id = wp_insert_post( $post, __('Cannot create product', 'bones') );

    //type of product
    wp_set_object_terms($product_id, 'simple', 'product_type');

    //add price to the product, this is where you can add some descriptions such as sku's and measurements
    update_post_meta( $product_id, '_regular_price', $pPrice );
    update_post_meta( $product_id, '_sale_price', $pPrice );
    update_post_meta( $product_id, '_price', $pPrice );

    //get woocommerce shortcode for add to cart
    $myButton = do_shortcode('[add_to_cart id="' . $product_id . '"]');

    //display product
    echo $myButton;
}

and then lastly, once an order is completed, delete the product by hooking an action to woocommerce_thankyou. I put it in the functions.

function mysite_completed($order_id) {
    //get order ID
    $order = new WC_Order( $order_id );

    //grab items from the order id
    $items = $order->get_items();

    //loop thru all products in the order section and get product ID 
    foreach ( $items as $item ) {
        $product_id = $item['product_id'];

        //choose whatever suites you, trash the product is what I picked

        //permanently deletes product
        //wp_delete_post($product_id);

        //trashes post
        wp_trash_post($product_id);
    }
}


回答2:

To Extend this topic and trash or delete products from a category when the order is successfully created.

First you need to create a custom category where all the products you'd like to trash or delete upon successful order creation will live. Then add the following code;

function delete_product_on_woocommerce_complete_order( $order_id ) { 

    if ( ! $order_id ) {
        return;
    }

    // 1. Get order object
    $order = wc_get_order( $order_id );

    // 2. Initialize $cat_in_order variable
    $cat_in_order = false;

    foreach ( $items as $item ) {       
        $product_id = $item['product_id'];  
        if ( has_term( 'machine', 'product_cat', $product_id ) ) { //Where machine is the custom product category slug

            // 3. choose whatever suites you, delete the product is what I picked
            //To Delete Product
            wp_delete_post($product_id); 

            //To Trash Product
            //wp_trash_post($product_id); 
        }
    }   

}
add_action( 'woocommerce_thankyou', 'delete_product_on_woocommerce_complete_order', 5 );

Code goes in function.php file of your active child theme (or active theme) or cutsom plugin. Tested and worked.