How to get post id created by cred commerce?
CRED Commerce does not create Posts.
It connects Toolset Forms, to WooCommerce Products.
Then, the Toolset Form which creates either Posts or Users, will not let you do so until a certain WooCommerce product is bought.
Now, if you need to have the Post ID of the Post that Toolset Forms generates, then it depends a little where you need this.
For example, you can access it with the Toolset Forms API at any moment of the Forms' life, or later during the Toolset Commerce Form process:
https://toolset.com/documentation/programmer-reference/cred-api/
https://toolset.com/documentation/programmer-reference/cred-commerce-api/
For example, when you submit the Form, the Post ID is in the variable $post_id of cred_save_data()
https://toolset.com/documentation/programmer-reference/cred-api/#cred_save_data
Later, during the checkout process, for example, after payments are complete (cred_commerce_after_payment_completed()), you can access that Post ID in the $data['cred_post_id']:
https://toolset.com/documentation/programmer-reference/cred-commerce-api/#cred_commerce_after_payment_completed
Hello Beda,
Thank you for your reply.
I already tried ( after payments are complete ) with no luck to get to the created post so I can display it within the order information.
I'm moving the setup to a live subdomain so I can grant you access to see the problem as I'm currently using docker container on my local machine to do the development.
Thank you,
Ahmed
Hi, try this variation instead:
add_action( 'cred_commerce_after_payment_completed', 'my_hook', 10, 1 );
function my_hook( $data ) {
$post_id = $data['extra_data'][0]['cred_post_id'];
}
The cred_post_id variable should be defined in the first item in the extra_data array. If that does not work, I'll be glad to take a look once you have the test site up and running. Please provide login credentials in the private reply fields here.
Here's how to access the cred_post_id in your cred_commerce_after_payment_completed callback:
add_action('cred_commerce_after_payment_completed','add_order_number',10,1);
function add_order_number($data) {
$order_number = $data['transaction_id']; //WooCommerce Order ID associated to the buying process
$post_id = $data['extra_data'][0]['cred_post_id']; //Post ID that was created/edited with the form
If that does not work as expected please add an error log statement so we can inspect the data parameter:
add_action('cred_commerce_after_payment_completed','add_order_number',10,1);
function add_order_number($data) {
$order_number = $data['transaction_id']; //WooCommerce Order ID associated to the buying process
$post_id = $data['extra_data'][0]['cred_post_id']; //Post ID that was created/edited with the form
error_log(print_r($data, true));
Then turn on server logs and complete the payment once more. Let me know what you find in the logs. If you're not familiar with server logs I can show you how to activate them temporarily. Go in your wp-config.php file and look for define(‘WP_DEBUG’, false);. Change it to:
define('WP_DEBUG', true);
Then add these lines, just before it says 'stop editing here':
ini_set('log_errors',TRUE);
ini_set('error_reporting', E_ALL);
ini_set('error_log', dirname(__FILE__) . '/error_log.txt');
When the code is triggered, a file called error_log.txt will be created in your site's root directory. Send me its contents.
Hello Christian,
I already provided the credentials for the ftp and site access. Are you able to debug it from you end?
I have added this code:
add_action('cred_commerce_after_payment_completed','add_order_number',10,1);
function add_order_number($data) {
$order_number = $data['transaction_id']; //WooCommerce Order ID associated to the buying process
$post_id = $data['extra_data'][0]['cred_post_id']; //Post ID that was created/edited with the form
update_post_meta( $post_id, 'wpcf-confirmation-number', $order_number);
}
Then I ran several tests. Here you can see the Booking I created:
hidden link
Here is the corresponding Order:
hidden link
You can see in the Booking post that the confirmation number is set to the corresponding Order ID. In these tests, I used the "Check payment" payment gateway to process payments. I chose products that cost some amount (not free products). After Checkout, I went into wp-admin and marked the Order to be "Processing". This triggered the payment complete action, and the confirmation number was added. Then I marked the Order "Complete". This triggered the Booking post to be published.
Please let me know if I've misunderstood what you want to accomplish.
Hello Christian,
Thank you for your support. A good move to show the confirmation number.
But, unfortunately by disabling:
//WC()->cart->add_to_cart( $product_id, $numberdays );
the quantity of the product in the cart will not update to reflect the actual number of days so the amount is not calculated based on the number of days.
WC()->cart->add_to_cart( $product_id, $numberdays );
This code is incompatible with the Commerce Forms API cred_commerce_add_product_to_cart because it adds a product to the cart programmatically, bypassing Commerce Forms internal processes. This API should return a single product ID, which is then added to the cart by Commerce Forms. So the problem is that you need to modify the quantity of the product in the cart based on the number of days, is that correct? We can do that with another hook and a hidden field that stores the product ID in the booking post. I have changed the code and added a cred_commerce_after_add_to_cart hook to set the quantity programmatically:
/* ==================================================== */
/* To Add The Booked / Pack Original Post to the Cart */
/* ==================================================== */
add_filter('cred_commerce_add_product_to_cart','add_custom_product_to_cart', 10, 3 );
function add_custom_product_to_cart( $product_id, $form_id, $post_id ) {
/* ==================================================================== */
if ( $form_id == 12997 ) {
$packid = toolset_get_relationship('product-pack');
if ( $packid ) {
$product_id = $packid;
global $post;
$product_id = $post->ID;
error_log("product id is : " . $product_id);
}
//WC()->cart->add_to_cart( $product_id );
}
/* ==================================================================== */
if ( $form_id == 12996 ) {
$bookid = toolset_get_relationship('product-booking');
/* get booking fields */
$date_from = get_post_meta($post_id, 'wpcf-booking-from', true);
$date_to = get_post_meta($post_id, 'wpcf-booking-to', true);
//$numberdays = get_post_meta($post_id, 'wpcf-booking-days', true);
if ( $bookid ) {
$product_id = $bookid;
global $post;
$product_id = $post->ID;
error_log("product id is : " . $product_id);
}
//WC()->cart->add_to_cart( $product_id, $numberdays );
/* set booked fields */
update_post_meta( $post_id, 'wpcf-booked-from', $date_from );
update_post_meta( $post_id, 'wpcf-booked-to', $date_to );
update_post_meta( $post_id, '_cred_product_id', $product_id);
}
/* ==================================================================== */
return $product_id;
}
/* ==================================================== */
/* Modify the quantity added to the Cart by Commerce Form */
/* ==================================================== */
add_action( 'cred_commerce_after_add_to_cart', 'forms_commerce_modify_booking_qty', 10, 2 );
function forms_commerce_modify_booking_qty( $form_id, $post_id ) {
if ( $form_id == 12996 ) {
$numberdays = get_post_meta($post_id, 'wpcf-booking-days', true);
$product_id = get_post_meta($post_id, '_cred_product_id', true);
foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
if ($values['product_id'] == $product_id) {
WC()->cart->set_quantity($cart_item_key, $numberdays, true);
break;
}
}
}
}
Hello Christian,
I tried to make a booking after the modification you kindly made.
The quantity still not updating in the cart.
Oh sorry, I left a comment in the code. It should be working now.
Cool It displays the quantity.
Is there any possibility to display the id of the created new booking on the frontend cart / checkout page?
I already placed a view on the cart layout
Thank you,
The checkout page isn't managed by Toolset, so I don't have a cut-and-paste solution that will allow you to modify that page. It may take some assistance from the WooCommerce support team or community. If you are able to figure out how to insert some content into the WooCommerce Checkout template using shortcodes, you could create a View of Booking posts, filtered by post status "Pending", filtered by post author where the author of the post is the current User. Order the View by post date, in descending order, and show only 1 result. In the Loop, output the post title using a shortcode. Then insert this View in the cart Layout or the checkout page template.
Hello Christian,
Thank you for instant reply.
I already created a layout for the cart page and added a view to display the booking information.
The only missing part is to inject the newly created post id so it displays this exact same post. [ So, I can delete that post if the customer didn't process the payment]
How to create a shotcode that makes use of the id within the ( cred_commerce_add_product_to_cart ) without breaking the code?
Sorry but I don't understand what you're asking. Like I was saying before, create a View of Booking posts, filtered by post author and post status, in reverse chronological order, and only show one result. Then in the Loop you can output the post ID or post title or whatever you want to show. Can you explain why this does not work for what you need?