<? php
/**
 * Custom order codes for Paid Memberships Pro Orders.
 *
 * This code will take the date and order ID and create
 * an order code from that such as "INV060920211", "INV060920212", "INV060920213"
 * and increment with each order added.
 *
 * A fallback is in place that if "INV060920211" already exists for some order,
 * it will just generate a random code to be safe.
 *
 * You can add this recipe to your site by creating a custom plugin
 * or using the Code Snippets plugin available for free in the WordPress repository.
 * Read this companion article for step-by-step directions on either method.
 * https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/
 */

function pmpro_custom_order_codes( $code ) {

	global $wpdb;

	$last_id = $wpdb->get_var( "SELECT `id` FROM $wpdb->pmpro_membership_orders ORDER BY `id` DESC LIMIT 1" );

	$current_id = (int) $last_id + 1;

	$prefix = apply_filters( 'pmpro_custom_order_prefix', 'INV' ); // You can change "INV" to something else or filter this from another plugin or custom code.

	$today = date( 'dmY' ); // get date DDMMYYYY, e.g. 06092021

	// Merge prefix (INV) + date (06092021) + current_id (321), e.g. INV06092021321
	$code = $prefix . $today . $current_id; //Code cannot just be an integer and _must_contain_a_string_.

	// We need to add a check to see if the order code is not taken, otherwise it will be an infinite loop.
	$check = $wpdb->get_var( $wpdb->prepare( "SELECT `id` FROM $wpdb->pmpro_membership_orders WHERE code = %s LIMIT 1", $code ) );

	// If the code already exists or is only a number, just generate a random order code with 10 digits.
	if ( $check || is_numeric( $code ) ) {
		$code = wp_generate_password( 10, false, false );

	}

	return $code;

}
add_filter( 'pmpro_random_code', 'pmpro_custom_order_codes', 10, 1 );