1+ <?php
2+ /**
3+ * Gravity Shop // Product Configurator // Map Order Data to Entry
4+ * https://gravitywiz.com/documentation/gravity-shop-product-configurator/
5+ *
6+ * Populate fields that are linked to a WooCommerce product using GS Product Configurator with values from the WooCommerce order.
7+ *
8+ * Instructions Video: https://www.loom.com/share/423b1e3835dc4757aae26a3efe9351b0
9+ *
10+ * Plugin Name: GSPC Map Order Data to Entry
11+ * Plugin URI: https://gravitywiz.com/documentation/gravity-shop-product-configurator/
12+ * Description: Populate fields that are linked to a WooCommerce product using GS Product Configurator with values from the WooCommerce order.
13+ * Author: Gravity Wiz
14+ * Version: 0.1
15+ * Author URI: http://gravitywiz.com
16+ */
17+ class GSPC_Map_Order_Data_to_Entry {
18+
19+ private $ _args = array ();
20+
21+ public function __construct ( $ args = array () ) {
22+
23+ $ this ->_args = wp_parse_args ( $ args , array (
24+ 'form_id ' => false ,
25+ 'field_map ' => array (),
26+ ) );
27+
28+ if ( empty ( $ this ->_args ['form_id ' ] ) ) {
29+ error_log ( 'GSPC_Map_Order_Data_to_Entry requires a form_id. ' );
30+ return ;
31+ }
32+
33+ add_action ( 'init ' , array ( $ this , 'init ' ) );
34+ }
35+
36+ public function init () {
37+
38+ if ( ! property_exists ( 'GFCommon ' , 'version ' ) ||
39+ ! class_exists ( '\GS_Product_Configurator\WC_Order_Item ' ) ||
40+ ! class_exists ( 'GFAPI ' ) ) {
41+ return ;
42+ }
43+
44+ add_action ( 'woocommerce_checkout_order_processed ' , array ( $ this , 'map_order_data_to_entries ' ), 10 , 3 );
45+ }
46+
47+ public function map_order_data_to_entries ( $ order_id , $ posted_data , $ order ) {
48+
49+ if ( ! $ order instanceof WC_Order ) {
50+ $ order = wc_get_order ( $ order_id );
51+ }
52+
53+ if ( ! $ order ) {
54+ return ;
55+ }
56+
57+ foreach ( $ order ->get_items () as $ item ) {
58+ $ gspc_order_item = \GS_Product_Configurator \WC_Order_Item::from ( $ item );
59+
60+ foreach ( $ gspc_order_item ->get_entries () as $ entry ) {
61+
62+ if ( $ this ->_args ['form_id ' ] && $ this ->_args ['form_id ' ] != $ entry ['form_id ' ] ) {
63+ continue ;
64+ }
65+
66+ $ form = GFAPI ::get_form ( $ entry ['form_id ' ] );
67+ $ entry_updated = false ;
68+
69+ foreach ( $ this ->_args ['field_map ' ] as $ field_key => $ data_key ) {
70+
71+ $ field_id = strpos ( $ field_key , '. ' ) !== false ?
72+ explode ( '. ' , $ field_key )[0 ] :
73+ $ field_key ;
74+
75+ $ field = GFFormsModel::get_field ( $ form , $ field_id );
76+ if ( ! $ field ) {
77+ continue ;
78+ }
79+
80+ $ value = $ this ->get_value_from_order ( $ order , $ data_key );
81+ if ( $ value !== null ) {
82+ $ entry [ $ field_key ] = $ value ;
83+ $ entry_updated = true ;
84+ }
85+ }
86+
87+ if ( $ entry_updated ) {
88+ GFAPI ::update_entry ( $ entry );
89+ }
90+ }
91+ }
92+ }
93+
94+ private function get_value_from_order ( $ order , $ data_key ) {
95+ $ order_data = $ order ->get_data ();
96+
97+
98+ switch ( $ data_key ) {
99+ case 'id ' :
100+ return $ order ->get_id ();
101+ case 'email ' :
102+ return $ order ->get_billing_email ();
103+ case 'status ' :
104+ return $ order ->get_status ();
105+ case 'total ' :
106+ return $ order ->get_total ();
107+ }
108+
109+ // Nested data (e.g., billing/first_name)
110+ $ parts = explode ( '/ ' , $ data_key );
111+ $ current = $ order_data ;
112+
113+ foreach ( $ parts as $ part ) {
114+ if ( isset ( $ current [ $ part ] ) ) {
115+ $ current = $ current [ $ part ];
116+ } else {
117+ return null ;
118+ }
119+ }
120+
121+ return $ current ;
122+ }
123+ }
124+
125+ # Configuration
126+
127+ new GSPC_Map_Order_Data_to_Entry ( array (
128+ 'form_id ' => 123 , // Replace with your form ID
129+ 'field_map ' => array (
130+ '2 ' => 'id ' , // Field ID 2 will store the order ID
131+ '3.3 ' => 'billing/first_name ' , // Field ID 3, input 3 (first name)
132+ '3.6 ' => 'billing/last_name ' , // Field ID 3, input 6 (last name)
133+ '4 ' => 'email ' , // Field ID 4 will store the email
134+ '5 ' => 'total ' , // Field ID 5 will store the order total
135+ ),
136+ ) );
0 commit comments