Forum Replies Created

Viewing 1 replies (of 1 total)
  • Thread Starter brucebarbour

    (@brucebarbour)

    Hi Patrick. Doing fine thanks. I hope you are too. Please see the code below as requested.

    <?php
    /**
     * Plugin Name: [Forminator] - Custom submission id as order number
     * Description: [Forminator] - Custom submission id as order number
     * Jira: SLS-224
     * Author: Thobk @ WPMUDEV
     * Author URI: https://premium.wpmudev.org
     * License: GPLv2 or later
     */
    if ( ! defined( 'ABSPATH' ) ) {
    	exit;
    } elseif ( defined( 'WP_CLI' ) && WP_CLI ) {
    	return;
    }
    
    add_action( 'after_setup_theme', 'wpmudev_forminator_custom_submission_number_for_custom_form_func', 100 );
    
    /**
     * To reset order number of a form, please login the admin
     * and then try to access this url: yoursite.com/wp-admin?wpmudev-fm-reset-order-number-by-form-id=[form_id]
     */
    
    function wpmudev_forminator_custom_submission_number_for_custom_form_func() {
    	if ( class_exists( 'Forminator' )  ) {
    
    		class WPMUDEV_FM_Order_Number{
    			private $include_form_ids = [];
    			private $exclude_form_ids = [];//enter list exclude form ids, e.g: [234,456]
    			private $start_number = ZZZ999;
    
     			private $entry;
    
    			public function __construct(){
    
    				add_filter( 'forminator_replace_custom_form_data', array( $this, 'custom_order_number' ), 10, 4 );
    				add_action( 'forminator_custom_form_mail_after_send_mail', array( $this, 'increase_order_number' ), 10, 1 );
    
    				add_action( 'admin_init', array( $this, 'reset_order_number' ) );
    
    				// change number order for admin:
    				add_filter( 'forminator_custom_form_entries_iterator', array( $this, 'custom_order_number_for_admin' ), 10, 2 );
    			}
    
    			public function reset_order_number(){
    				if( current_user_can( 'manage_options' ) && isset( $_GET['wpmudev-fm-reset-order-number-by-form-id']) ){
    					$form_id = (int) $_GET['wpmudev-fm-reset-order-number-by-form-id'];
    					if( $form_id ) {
    						$order_numbers = get_option( 'wpmudev_fm_custom_submission_id', array() );
    						if( isset( $order_numbers[ $form_id ] ) ){
    							unset( $order_numbers[ $form_id ] );
    							update_option( 'wpmudev_fm_custom_submission_id', $order_numbers );
    						}
    					}
    				}
    			}
    
    			public function custom_order_number( $content, $custom_form, $data, $entry ){
    
    				// maybe exclude the form.
    				if( ! empty( $this->include_form_ids ) ){
    					if( ! in_array( $custom_form->id, $this->include_form_ids ) ){
    						return $content;
    					}
    				}elseif( ! empty( $this->exclude_form_ids ) && in_array( $custom_form->id, $this->exclude_form_ids ) ){
    					return $content;
    				}
    
    				if( version_compare( FORMINATOR_VERSION, '1.3.1', '>' ) ){
    					$submission_id = '#'. esc_html( $entry->entry_id );// add prefix # to avoid the conflict.
    					$replace = '#'. $this->get_number_order( $entry->form_id );
    				}else{
    					$submission_id = esc_html( $entry->form_id . $entry->entry_id );
    					$replace = $this->get_number_order( $entry->form_id );
    				}
    
    				if( false !== strpos( $content, $submission_id ) ){
    					$this->entry = $entry;
    					$content = str_replace( $submission_id, $replace, $content );
    				}
    
    				return $content;
    			}
    
    			public function increase_order_number(){
    				if( $this->entry ){
    					$order_number = $this->get_number_order( $this->entry->form_id );
    					// set to entry meta
    					$this->entry->set_fields(
    						array( 
    							array(
    								'name'=> 'order_number',
    								'value' => $order_number
    							),
    						)
    					);
    
    					$order_number ++;
    					$order_numbers = get_option( 'wpmudev_fm_custom_submission_id', array() );
    					$order_numbers[ $this->entry->form_id ] = $order_number;
    					update_option( 'wpmudev_fm_custom_submission_id', $order_numbers );
    
    					// reset entry
    					$this->entry = null;
    				}
    			}
    
    			public function get_number_order( $form_id ){
    				static $order_number;
    				if( ! $order_number ){
    					$order_numbers = get_option( 'wpmudev_fm_custom_submission_id', array() );
    					if( isset( $order_numbers[ $form_id ] ) ){
    						$order_number = $order_numbers[ $form_id ];
    					}else{
    						$order_number = $this->start_number;
    					}
    				}
    
    				return $order_number;
    			}
    
    			public function custom_order_number_for_admin( $iterator, $entry ){
    				// maybe exclude the form.
    				if( ! empty( $this->include_form_ids ) ){
    					if( ! in_array( $entry->form_id, $this->include_form_ids ) ){
    						return $iterator;
    					}
    				}elseif( ! empty( $this->exclude_form_ids ) && in_array( $entry->form_id, $this->exclude_form_ids ) ){
    					return $iterator;
    				}
    
    				$order_number = $entry->get_meta('order_number');
    				if( $order_number ){
    					$iterator['entry_id'] .= '-'. $order_number;
    					$iterator['detail']['items']  = array( array_shift( $iterator['detail']['items'] ), array(
    						'type'        => 'number',
    						'label'       => 'Order',
    						'value'       => '#'. $order_number,
    						'sub_entries' => array(),
    					) ) + $iterator['detail']['items'];
    				}
    
    				return $iterator;
    			}
    
    		}
    
    		$run = new WPMUDEV_FM_Order_Number;
    	}
    }
Viewing 1 replies (of 1 total)