Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add Woocommerce Temporary product

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. 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!

like image 389
Tina Avatar asked Sep 18 '17 14:09

Tina


1 Answers

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);
    }
}
like image 74
Tina Avatar answered Nov 02 '22 21:11

Tina