@@ -26,18 +26,25 @@ public static function register() {
2626 array (
2727 'description ' => __ ( 'Extra data defined on the WC object ' , 'wp-graphql-woocommerce ' ),
2828 'fields ' => array (
29+ 'id ' => array (
30+ 'type ' => array ( 'non_null ' => 'String ' ),
31+ 'description ' => __ ( 'Meta ID. ' , 'wp-graphql-woocommerce ' ),
32+ 'resolve ' => function ( $ source ) {
33+ return ! empty ( $ source ->id ) ? $ source ->id : null ;
34+ },
35+ ),
2936 'key ' => array (
3037 'type ' => array ( 'non_null ' => 'String ' ),
3138 'description ' => __ ( 'Meta key. ' , 'wp-graphql-woocommerce ' ),
3239 'resolve ' => function ( $ source ) {
33- return ! empty ( $ source[ ' key ' ] ) ? $ source[ ' key ' ] : null ;
40+ return ! empty ( $ source-> key ) ? $ source-> key : null ;
3441 },
3542 ),
3643 'value ' => array (
3744 'type ' => array ( 'non_null ' => 'String ' ),
3845 'description ' => __ ( 'Meta value. ' , 'wp-graphql-woocommerce ' ),
3946 'resolve ' => function ( $ source ) {
40- return ! empty ( $ source[ ' value ' ] ) ? $ source[ ' value ' ] : null ;
47+ return ! empty ( $ source-> value ) ? $ source-> value : null ;
4148 },
4249 ),
4350 ),
@@ -62,16 +69,17 @@ public static function register() {
6269 ),
6370 ),
6471 'resolve ' => function ( $ source , array $ args ) {
72+ // Check if "key" argument set and assigns to target "keys" array.
6573 if ( ! empty ( $ args ['key ' ] ) && ! empty ( $ source [ $ args ['key ' ] ] ) ) {
6674 $ keys = array ( $ args ['key ' ] );
67- } elseif ( ! empty ( $ args ['keysIn ' ] ) ) {
75+ } elseif ( ! empty ( $ args ['keysIn ' ] ) ) { // Check if "keysIn" argument set and assigns to target "keys" array.
6876 $ keys = array ();
6977 foreach ( $ args ['keysIn ' ] as $ key ) {
7078 if ( ! empty ( $ source [ $ key ] ) ) {
7179 $ keys [] = $ key ;
7280 }
7381 }
74- } else {
82+ } else { // If no arguments set, all extra data keys are assigns to target "keys" array.
7583 $ keys = array_diff (
7684 array_keys ( $ source ),
7785 array (
@@ -90,10 +98,14 @@ public static function register() {
9098 )
9199 );
92100 }
101+ // Create meta ID prefix.
102+ $ id_prefix = apply_filters ( 'cart_meta_id_prefix ' , 'cart_ ' );
93103
104+ // Format meta data for resolution.
94105 $ data = array ();
95106 foreach ( $ keys as $ key ) {
96- $ data [] = array (
107+ $ data [] = (object ) array (
108+ 'id ' => "{$ id_prefix }_ {$ key }" ,
97109 'key ' => $ key ,
98110 'value ' => $ source [ $ key ],
99111 );
@@ -104,6 +116,7 @@ public static function register() {
104116 )
105117 );
106118
119+ // Register 'metaData' field on WC CRUD types.
107120 $ types = array (
108121 'Coupon ' ,
109122 'Customer ' ,
@@ -130,7 +143,7 @@ public static function register() {
130143 'type ' => 'String ' ,
131144 'description ' => __ ( 'Retrieve meta by key ' , 'wp-graphql-woocommerce ' ),
132145 ),
133- 'keysIn ' => array (
146+ 'keysIn ' => array (
134147 'type ' => array ( 'list_of ' => 'String ' ),
135148 'description ' => __ ( 'Retrieve multiple metas by key ' , 'wp-graphql-woocommerce ' ),
136149 ),
@@ -140,21 +153,56 @@ public static function register() {
140153 ),
141154 ),
142155 'resolve ' => function ( $ source , array $ args ) {
156+ // Set unique flag.
143157 $ single = ! empty ( $ args ['multiple ' ] ) ? ! $ args ['multiple ' ] : true ;
144- $ data = array ();
145158
146- if ( ! empty ( $ args ['key ' ] ) ) {
147- $ data [ $ args ['key ' ] ] = $ source ->get_meta ( $ args ['key ' ], $ single );
148- } elseif ( ! empty ( $ args ['keysIn ' ] ) ) {
149- $ data = array ();
150- foreach ( $ args ['keysIn ' ] as $ key ) {
151- $ data [ $ key ] = $ source ->get_meta ( $ key , $ single );
159+ // Check "key" argument and format meta_data objects.
160+ if ( ! empty ( $ args ['key ' ] ) && $ source ->meta_exists ( $ args ['key ' ] ) ) {
161+ $ data = $ source ->get_meta ( $ args ['key ' ], $ single );
162+ if ( ! is_array ( $ data ) ) {
163+ $ data = array_filter (
164+ $ source ->get_meta_data (),
165+ function ( $ meta ) use ( $ data ) {
166+ return $ meta ->value === $ data ;
167+ }
168+ );
152169 }
153- } else {
154- $ data = $ source ->get_meta_data ();
170+ } elseif ( ! empty ( $ args ['keysIn ' ] ) ) { // Check "keysIn" argument and format meta_data objects.
171+ $ keys = $ args ['keysIn ' ];
172+
173+ $ found = array ();
174+ $ data = array_filter (
175+ $ source ->get_meta_data (),
176+ function ( $ meta ) use ( $ keys , $ single , &$ found ) {
177+ if ( in_array ( $ meta ->key , $ keys , true ) ) {
178+ if ( $ single ) {
179+ if ( ! in_array ( $ meta ->key , $ found , true ) ) {
180+ $ found [] = $ meta ->key ;
181+ return true ;
182+ }
183+ return false ;
184+ }
185+ return true ;
186+ }
187+ }
188+ );
189+ } else { // If no arguments set return all meta (in accordance with unique flag).
190+ $ found = array ();
191+ $ data = array_filter (
192+ $ source ->get_meta_data (),
193+ function ( $ meta ) use ( $ single , &$ found ) {
194+ if ( $ single ) {
195+ if ( ! in_array ( $ meta ->key , $ found , true ) ) {
196+ $ found [] = $ meta ->key ;
197+ return true ;
198+ }
199+ return false ;
200+ }
201+ return true ;
202+ }
203+ );
155204 }
156205
157- \codecept_debug ( $ source ->get_meta_data () );
158206 return ! empty ( $ data ) ? $ data : null ;
159207 },
160208 )
0 commit comments