-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.php
More file actions
155 lines (135 loc) · 4.51 KB
/
index.php
File metadata and controls
155 lines (135 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?php
/**
* Plugin Name: Woocommerce Random Order Numbers
* Description: Generates large hyphenated random order numbers (e.g. 13124234-2343423-32423423-333) and uses them as the public order number.
* Version: 1.0
* Author: P4UL
*/
if ( ! defined( 'ABSPATH' ) ) exit;
class P4UL_Random_Order_Numbers {
const META_KEY = '_p4ul_random_order_number';
public function __construct() {
// Create number during checkout/order creation
add_action( 'woocommerce_checkout_create_order', [ $this, 'maybe_assign_number_on_checkout' ], 20, 1 );
add_action( 'woocommerce_new_order', [ $this, 'maybe_assign_number_on_new_order' ], 20, 1 );
// Display the custom number everywhere
add_filter( 'woocommerce_order_number', [ $this, 'filter_public_order_number' ], 10, 2 );
// Make it searchable in admin
add_filter( 'woocommerce_shop_order_search_fields', [ $this, 'add_searchable_meta' ] );
// Show in admin order meta box (read-only)
add_action( 'add_meta_boxes', [ $this, 'add_admin_metabox' ] );
}
/**
* Generate a hyphenated random numeric string like 13124234-2343423-32423423-333.
* Pattern is filterable via 'p4ul_random_order_number_pattern'.
*/
public function generate_number(): string {
// Default group lengths. Example output: 8-7-8-3 digits
$pattern = apply_filters( 'p4ul_random_order_number_pattern', [8, 7, 8, 3] );
$groups = [];
foreach ( $pattern as $len ) {
$groups[] = $this->random_digits( max(1, (int) $len ) );
}
return implode( '-', $groups );
}
private function random_digits( int $length ): string {
// wp_generate_password with only digits
return wp_generate_password( $length, false, false, '0123456789' );
}
/**
* Ensure uniqueness across orders.
*/
public function generate_unique_number(): string {
global $wpdb;
$meta_key = self::META_KEY;
$tries = 0;
do {
$number = $this->generate_number();
$exists = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(1) FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %s LIMIT 1",
$meta_key,
$number
) );
$tries++;
if ( $tries > 25 ) {
// Safety net: append 4 digits to drastically reduce collision risk
$number .= '-' . $this->random_digits(4);
$exists = 0;
}
} while ( $exists > 0 );
return $number;
}
/**
* Assign number when creating order during checkout (WC 3.0+).
*/
public function maybe_assign_number_on_checkout( WC_Order $order ) {
if ( ! $order->get_meta( self::META_KEY, true ) ) {
$order->update_meta_data( self::META_KEY, $this->generate_unique_number() );
}
}
/**
* Assign number for programmatically created orders that bypass checkout hook.
*/
public function maybe_assign_number_on_new_order( $order_id ) {
$order = wc_get_order( $order_id );
if ( $order && ! $order->get_meta( self::META_KEY, true ) ) {
$order->update_meta_data( self::META_KEY, $this->generate_unique_number() );
$order->save();
}
}
/**
* Replace displayed order number with our custom one.
*/
public function filter_public_order_number( $order_number, $order ) {
if ( $order instanceof WC_Order ) {
$custom = $order->get_meta( self::META_KEY, true );
if ( $custom ) {
return $custom;
}
}
return $order_number;
}
/**
* Allow searching orders by the random number in admin.
*/
public function add_searchable_meta( $fields ) {
$fields[] = self::META_KEY;
return $fields;
}
/**
* Small metabox in admin > single order showing the random number.
*/
public function add_admin_metabox() {
add_meta_box(
'p4ul-random-order-number',
__( 'Random Order Number', 'p4ul' ),
function( $post ) {
$order = wc_get_order( $post->ID );
if ( ! $order ) return;
$number = $order->get_meta( self::META_KEY, true );
if ( ! $number ) {
echo '<p>' . esc_html__( 'No random order number assigned.', 'p4ul' ) . '</p>';
return;
}
echo '<code style="font-size:14px;">' . esc_html( $number ) . '</code>';
echo '<p style="margin-top:8px;color:#666;">' . esc_html__( 'This value is used wherever WooCommerce displays the order number and can be searched from the orders list.', 'p4ul' ) . '</p>';
},
'shop_order',
'side',
'core'
);
}
}
add_action( 'plugins_loaded', function() {
// Only run if WooCommerce active
if ( class_exists( 'WooCommerce' ) ) {
new P4UL_Random_Order_Numbers();
}
} );
/**
* Optional: change the pattern of digit groups.
* Example below produces 10-10 (uncomment to use).
*/
// add_filter( 'p4ul_random_order_number_pattern', function( $pattern ) {
// return [10, 10];
// } );