PluginProbe
WooCommerce / 11.1.0-rc.2
WooCommerce v11.1.0-rc.2
11.1.0 11.1.0-rc.2 11.1.0-rc.1 11.1.0-beta.2 11.1.0-beta.1 11.0.1 11.0.0 11.0.0-rc.3 11.0.0-rc.2 11.0.0-rc.1 11.0.0-beta.2 11.0.0-beta.1 10.9.4 10.9.3 10.9.2 10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 All 648 releases
woocommerce / includes / class-wc-product-attribute.php
class-wc-product-attribute.php
380 lines 7.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Represents a product attribute
4 *
5 * Attributes can be global (taxonomy based) or local to the product itself.
6 * Uses ArrayAccess to be BW compatible with previous ways of reading attributes.
7 *
8 * @package WooCommerce\Classes
9 * @version 3.0.0
10 * @since 3.0.0
11 */
12
13 defined( 'ABSPATH' ) || exit;
14
15 /**
16 * Product attribute class.
17 */
18 class WC_Product_Attribute implements ArrayAccess {
19
20 /**
21 * Data array.
22 *
23 * @since 3.0.0
24 * @var array
25 */
26 protected $data = array(
27 'id' => 0,
28 'name' => '',
29 'options' => array(),
30 'position' => 0,
31 'visible' => false,
32 'variation' => false,
33 );
34
35 /**
36 * Extra data array.
37 *
38 * @since 10.6.0
39 * @var array
40 */
41 protected $extra_data = array();
42
43 /**
44 * Return if this attribute is a taxonomy.
45 *
46 * @return boolean
47 */
48 public function is_taxonomy() {
49 return 0 < $this->get_id();
50 }
51
52 /**
53 * Get taxonomy name if applicable.
54 *
55 * @return string
56 */
57 public function get_taxonomy() {
58 return $this->is_taxonomy() ? $this->get_name() : '';
59 }
60
61 /**
62 * Get taxonomy object.
63 *
64 * @return array|null
65 */
66 public function get_taxonomy_object() {
67 global $wc_product_attributes;
68 return $this->is_taxonomy() ? $wc_product_attributes[ $this->get_name() ] : null;
69 }
70
71 /**
72 * Gets terms from the stored options.
73 *
74 * @return array|null
75 */
76 public function get_terms() {
77 if ( ! $this->is_taxonomy() || ! taxonomy_exists( $this->get_name() ) ) {
78 return null;
79 }
80 $terms = array();
81 foreach ( $this->get_options() as $option ) {
82 if ( is_int( $option ) ) {
83 $term = get_term_by( 'id', $option, $this->get_name() );
84 } else {
85 // Term names get escaped in WP. See sanitize_term_field.
86 $term = get_term_by( 'name', $option, $this->get_name() );
87
88 if ( ! $term || is_wp_error( $term ) ) {
89 $new_term = wp_insert_term( $option, $this->get_name() );
90 $term = is_wp_error( $new_term ) ? false : get_term_by( 'id', $new_term['term_id'], $this->get_name() );
91 }
92 }
93 if ( $term && ! is_wp_error( $term ) ) {
94 $terms[] = $term;
95 }
96 }
97 return $terms;
98 }
99
100 /**
101 * Gets slugs from the stored options, or just the string if text based.
102 *
103 * @return array
104 */
105 public function get_slugs() {
106 if ( ! $this->is_taxonomy() || ! taxonomy_exists( $this->get_name() ) ) {
107 return $this->get_options();
108 }
109 $terms = array();
110 foreach ( $this->get_options() as $option ) {
111 if ( is_int( $option ) ) {
112 $term = get_term_by( 'id', $option, $this->get_name() );
113 } else {
114 $term = get_term_by( 'name', $option, $this->get_name() );
115
116 if ( ! $term || is_wp_error( $term ) ) {
117 $new_term = wp_insert_term( $option, $this->get_name() );
118 $term = is_wp_error( $new_term ) ? false : get_term_by( 'id', $new_term['term_id'], $this->get_name() );
119 }
120 }
121 if ( $term && ! is_wp_error( $term ) ) {
122 $terms[] = $term->slug;
123 }
124 }
125 return $terms;
126 }
127
128 /**
129 * Returns all data for this object.
130 *
131 * @return array
132 */
133 public function get_data() {
134 return array_merge(
135 $this->extra_data,
136 $this->data,
137 array(
138 'is_visible' => $this->get_visible() ? 1 : 0,
139 'is_variation' => $this->get_variation() ? 1 : 0,
140 'is_taxonomy' => $this->is_taxonomy() ? 1 : 0,
141 'value' => $this->is_taxonomy() ? '' : wc_implode_text_attributes( $this->get_options() ),
142 )
143 );
144 }
145
146 /*
147 |--------------------------------------------------------------------------
148 | Setters
149 |--------------------------------------------------------------------------
150 */
151
152 /**
153 * Set extra data by key.
154 *
155 * @since 10.6.0
156 * @param string $key Extra data key.
157 * @param mixed $value Extra data value.
158 */
159 public function set_extra_data( string $key, $value ): void {
160 $this->extra_data[ $key ] = $value;
161 }
162
163 /**
164 * Set ID (this is the attribute ID).
165 *
166 * @param int $value Attribute ID.
167 */
168 public function set_id( $value ) {
169 $this->data['id'] = absint( $value );
170 }
171
172 /**
173 * Set name (this is the attribute name or taxonomy).
174 *
175 * @param string $value Attribute name.
176 */
177 public function set_name( $value ) {
178 $this->data['name'] = $value;
179 }
180
181 /**
182 * Set options.
183 *
184 * @param array $value Attribute options.
185 */
186 public function set_options( $value ) {
187 $this->data['options'] = $value;
188 }
189
190 /**
191 * Set position.
192 *
193 * @param int $value Attribute position.
194 */
195 public function set_position( $value ) {
196 $this->data['position'] = absint( $value );
197 }
198
199 /**
200 * Set if visible.
201 *
202 * @param bool $value If is visible on Product's additional info tab.
203 */
204 public function set_visible( $value ) {
205 $this->data['visible'] = wc_string_to_bool( $value );
206 }
207
208 /**
209 * Set if variation.
210 *
211 * @param bool $value If is used for variations.
212 */
213 public function set_variation( $value ) {
214 $this->data['variation'] = wc_string_to_bool( $value );
215 }
216
217 /*
218 |--------------------------------------------------------------------------
219 | Getters
220 |--------------------------------------------------------------------------
221 */
222
223 /**
224 * Get all extra data.
225 *
226 * @since 10.6.0
227 * @return array
228 */
229 public function get_all_extra_data() {
230 return $this->extra_data;
231 }
232
233 /**
234 * Get extra data by key.
235 *
236 * @since 10.6.0
237 * @param string $key Extra data key.
238 * @return mixed
239 */
240 public function get_extra_data( string $key ) {
241 return $this->extra_data[ $key ] ?? null;
242 }
243
244 /**
245 * Get the ID.
246 *
247 * @return int
248 */
249 public function get_id() {
250 return $this->data['id'];
251 }
252
253 /**
254 * Get name.
255 *
256 * @return string
257 */
258 public function get_name() {
259 return $this->data['name'];
260 }
261
262 /**
263 * Get options.
264 *
265 * @return array
266 */
267 public function get_options() {
268 return $this->data['options'];
269 }
270
271 /**
272 * Get position.
273 *
274 * @return int
275 */
276 public function get_position() {
277 return $this->data['position'];
278 }
279
280 /**
281 * Get if visible.
282 *
283 * @return bool
284 */
285 public function get_visible() {
286 return $this->data['visible'];
287 }
288
289 /**
290 * Get if variation.
291 *
292 * @return bool
293 */
294 public function get_variation() {
295 return $this->data['variation'];
296 }
297
298 /*
299 |--------------------------------------------------------------------------
300 | ArrayAccess/Backwards compatibility.
301 |--------------------------------------------------------------------------
302 */
303
304 /**
305 * OffsetGet.
306 *
307 * @param string $offset Offset.
308 * @return mixed
309 */
310 #[\ReturnTypeWillChange]
311 public function offsetGet( $offset ) {
312 switch ( $offset ) {
313 case 'is_variation':
314 return $this->get_variation() ? 1 : 0;
315 case 'is_visible':
316 return $this->get_visible() ? 1 : 0;
317 case 'is_taxonomy':
318 return $this->is_taxonomy() ? 1 : 0;
319 case 'value':
320 return $this->is_taxonomy() ? '' : wc_implode_text_attributes( $this->get_options() );
321 default:
322 if ( is_callable( array( $this, "get_$offset" ) ) ) {
323 return $this->{"get_$offset"}();
324 }
325 if ( isset( $this->extra_data[ $offset ] ) ) {
326 return $this->extra_data[ $offset ];
327 }
328 break;
329 }
330 return '';
331 }
332
333 /**
334 * OffsetSet.
335 *
336 * @param string $offset Offset.
337 * @param mixed $value Value.
338 */
339 #[\ReturnTypeWillChange]
340 public function offsetSet( $offset, $value ) {
341 switch ( $offset ) {
342 case 'is_variation':
343 $this->set_variation( $value );
344 break;
345 case 'is_visible':
346 $this->set_visible( $value );
347 break;
348 case 'value':
349 $this->set_options( $value );
350 break;
351 default:
352 if ( is_callable( array( $this, "set_$offset" ) ) ) {
353 $this->{"set_$offset"}( $value );
354 break;
355 }
356 $this->extra_data[ $offset ] = $value;
357 break;
358 }
359 }
360
361 /**
362 * OffsetUnset.
363 *
364 * @param string $offset Offset.
365 */
366 #[\ReturnTypeWillChange]
367 public function offsetUnset( $offset ) {}
368
369 /**
370 * OffsetExists.
371 *
372 * @param string $offset Offset.
373 * @return bool
374 */
375 #[\ReturnTypeWillChange]
376 public function offsetExists( $offset ) {
377 return in_array( $offset, array_merge( array( 'is_variation', 'is_visible', 'is_taxonomy', 'value' ), array_keys( $this->data ), array_keys( $this->extra_data ) ), true );
378 }
379 }
380