Adding a Custom Item Type
Getting started
In this post describes example of how to create a custom item with custom item type and accept payments.
You can download our sample plugin here: wpinv-custom-item.zip
Register a item type
Let’s start by registering a custom item type “product” with the title “Product”.
/** * Register the custom item type. */ function wpi_custom_register_item_type( $item_types ) { $item_types['product'] = __( 'Product', 'textdomain' ); return $item_types; } add_filter( 'wpinv_get_item_types', 'wpi_custom_register_item_type', 10, 1 );
Adding a some description about “Product” item type which will be displayed under Item Info metabox in add/edit item form in backend.
function wpi_custom_product_type_info( $post ) { ?>
Handle Item Payment Received
Here is example that explains how to handle payment received for "product" item.
function wpi_custom_on_payment_complete( $invoice_id, $new_status, $old_status ) { if ( $new_status == 'publish' || $new_status == 'wpi-renewal' ) { $invoice = wpinv_get_invoice( $invoice_id ); if ( !empty( $invoice ) ) { $cart_items = $invoice->get_cart_details(); if ( !empty( $cart_items ) ) { foreach ( $cart_items as $key => $cart_item ) { $item = !empty( $cart_item['id'] ) ? new WPInv_Item( $cart_item['id'] ) : NULL; if ( !empty( $item ) && $item->get_type() == 'product' ) { $item_id = $item->ID; // Handle payment accepted for item. } } } } } } add_action( 'wpinv_update_status', 'wpi_custom_on_payment_complete', 10, 3 );Handle Item for Refunded Payment
Here is example that explains how to handle refunded for "product" item.
function wpi_custom_product_on_refund_payment( $invoice ) { $cart_items = !empty( $invoice ) ? $invoice->get_cart_details() : NULL; if ( !empty( $cart_items ) ) { foreach ( $cart_items as $key => $cart_item ) { $item = !empty( $cart_item['id'] ) ? new WPInv_Item( $cart_item['id'] ) : NULL; if ( !empty( $item ) && $item->get_type() == 'product' ) { $item_id = $item->ID; // Handle item refund . } } } } add_action( 'wpinv_post_refund_invoice', 'wpi_custom_product_on_refund_payment', 10, 1 );Custom Actions
When deleting invoicing item this will decide whether to allow or not to delete item with item type "product".
/** * Allow "product" item type delete. */ function wpi_custom_can_delete_product_item( $return, $post_id ) { if ( get_post_meta( $post_id, '_wpinv_type', true ) == 'product' && $product_id = get_post_meta( $post_id, '_wpinv_product_id', true ) ) { // $return = true; // Allow to delete "product" item. // $return = false; // Don't allow to delete "product" item. } return $return; } add_filter( 'wpinv_can_delete_item', 'wpi_custom_can_delete_product_item', 10, 2 );Add a item via API data
//=== Example 1: Create an simple standard item. ===// // An array of elements that make up a item to update or insert. $itemarr = array( 'item_id' => 1946, // Required. Any integer number. Must be unique within item type. 'title' => __( 'Simple Standard Product', 'wpinv-custom' ), // Required. Item title. 'price' => '49.50', // Optional. Item price. Default '0.00'. 'status' => 'publish', // Optional. pending, publish ); $item = wpinv_create_item( $itemarr ); // Returns invoicing item object on success. The value 0 or WP_Error on failure. //=== Example 2: Create an item with advance data. ===// // An array of elements that make up a item to update or insert. $itemarr = array( 'type' => 'product', // Optional. Item type. Default 'custom'. 'item_id' => 1947, // Required. Any integer number. Must be unique within item type. 'title' => __( 'First Product', 'wpinv-custom' ), // Required. Item title. 'price' => '99.50', // Optional. Item price. Default '0.00'. 'status' => 'publish', // Optional. pending, publish 'vat_rule' => 'digital', // Optional. digital => Digital item, physical => Physical item 'cpt_singular_name' => 'For Sale', // Optional. Sub title for item. Should be singular. 'cpt_name' => '', // Optional. Sub title for item. Should be plural. 'is_recurring' => 1, // Optional. 1 => Allow recurring or 0 => Don't allow recurring 'recurring_period' => 'M', // Optional. D => Daily, W => Weekly, M => Monthly, Y => Yearly 'recurring_interval' => 1, // Optional. Integer value between 1 - 90. 'recurring_limit' => 6, // Optional. Any integer number. 0 for recurring forever until cancelled. 'free_trial' => 1, // Optional. 1 => Allow free trial or 0 => Don't free trial 'trial_period' => 'M', // Optional. D => Daily, W => Weekly, M => Monthly, Y => Yearly 'trial_interval' => 1, // Optional. Any integer number. 'excerpt' => __( 'This is my first product.', 'wpinv-custom' ), // Optional. Item short description ); $item = wpinv_create_item( $itemarr ); // Returns invoicing item object on success. The value 0 or WP_Error on failure.