Search code examples
phpwordpresswoocommerceproductwoocommerce-bookings

Add person types programmatically on bookable product creation in Woocommerce 3


Basically I'm trying to add a new bookable product in Woocommerce using a custom form I've made, so I have to add the products programmatically. Creating the product is fine, the problem is that I can't figure out how to add a new person type to my product so I can fix multiple prices.

Does someone have an idea how to do this?

This is the code I have so far.

$post_id = wp_insert_post( array(
    'post_title' => $_POST["title"],
    'post_content' => $_POST["description"],
    'post_status' => 'publish',
    'post_type' => "product",
) );
wp_set_object_terms( $post_id, 'booking', 'product_type' );

Solution

  • The following will enable "has persons" and create your person types for a bookable product:

    // Create the product
    $product_id = wp_insert_post( array(
        'post_title' => $_POST["title"],
        'post_content' => $_POST["description"],
        'post_status' => 'publish',
        'post_type' => "product",
    ) );
    
    // Set the product type
    wp_set_object_terms( $product_id, 'booking', 'product_type' );
    
    // Get an instance of the WC_Product Object
    $product = wc_get_product($product_id);
    
    // Enable persons and save
    $product->set_has_persons(true);
    $product->save();
    
    // Here define your person types (one array by person type)
    $persons_type_data =  array(
        // First person type
        array( 
            'block_cost'  => 0,
            'cost'        => 16.50,
            'description' => '',
            'max'         => '',
            'min'         => '',
            'name'        => __('Adults'),
        ),
        // Second person type
        array(
            'block_cost'  => 0,
            'cost'        => 9.20,
            'description' => '',
            'max'         => '',
            'min'         => '',
            'name'        => __('Childs'),
        ),
    );
    
    // Loop Through persons type data
    foreach( $persons_type_data as $key => $values ){
        $person_type = new WC_Product_Booking_Person_Type();
        $person_type->set_block_cost($values['block_cost']);
        $person_type->set_cost($values['cost']);
        $person_type->set_description($values['description']);
        $person_type->set_max($values['max']);
        $person_type->set_min($values['min']);
        $person_type->set_name($values['name']);
        $person_type->set_parent_id($product_id);
        $person_type->set_sort_order($key); // Sorting is based on the array order
    
        // Save the person type
        $person_type->save();
    
        // Add the person type to the array
        $persons[] = $person_type;
    }
    // Set person types and save the product
    $product->set_person_types($persons);
    $product->save();
    

    Tested and works.