PluginProbe
Ultimate Post Kit – Elementor Post Grid, Post Carousel, Post Slider & Blog Layout Widgets / 4.1.18
Ultimate Post Kit – Elementor Post Grid, Post Carousel, Post Slider & Blog Layout Widgets v4.1.18
4.5.4 4.2.1 4.2.2 4.2.3 4.5.0 4.5.2 4.5.3 4.2.0 4.1.18 4.1.17 4.1.16 4.1.15 4.1.14 4.1.13 4.1.12 4.1.11 4.1.10 4.1.9 4.1.8 4.0.9 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 All 146 releases
ultimate-post-kit / includes / compatiblity / wpml / wpml-module-with-items.php

wpml-module-with-items.php in Ultimate Post Kit – Elementor Post Grid, Post Carousel, Post Slider & Blog Layout Widgets 4.1.18, at includes/compatiblity/wpml/wpml-module-with-items.php

204 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace UltimatePostKit\Includes;
4
5 defined( 'ABSPATH' ) || die();
6
7 use WPML_PB_String;
8 use IWPML_Page_Builders_Module;
9 use WPML_Elementor_Translatable_Nodes;
10
11 /**
12 * Class WPML_Module_With_Items
13 */
14 abstract class WPML_Module_With_Items implements IWPML_Page_Builders_Module {
15
16 /**
17 * @param string $field
18 *
19 * @return string
20 */
21 abstract protected function get_title( $field );
22
23 /** @return array */
24 abstract protected function get_fields();
25
26 /**
27 * @param string $field
28 *
29 * @return string mixed
30 */
31 abstract protected function get_editor_type( $field );
32
33 /**
34 * @return string
35 */
36 abstract public function get_items_field();
37
38 /**
39 * @param string|int $node_id
40 * @param array $element
41 * @param WPML_PB_String[] $strings
42 *
43 * @return WPML_PB_String[]
44 */
45 public function get( $node_id, $element, $strings ) {
46
47 $items = $this->get_items( $element );
48
49 if ( ! is_array( $items ) || empty( $items ) ) {
50 return $strings;
51 }
52
53 foreach ( $items as $item ) {
54 foreach ( $this->get_fields() as $key => $field ) {
55 if ( ! is_array( $field ) ) {
56
57 if ( ! array_key_exists( $field, $item ) ) {
58 continue;
59 }
60
61 $strings[] = new WPML_PB_String(
62 $item[ $field ],
63 $this->get_string_name( $node_id, $item[ $field ], $field, $element['widgetType'], $item['_id'] ),
64 $this->get_title( $field ),
65 $this->get_editor_type( $field )
66 );
67 } else {
68 foreach ( $field as $inner_field ) {
69
70 if ( ! isset( $item[ $key ] ) || ! array_key_exists( $inner_field, $item[ $key ] ) ) {
71 continue;
72 }
73
74 $strings[] = new WPML_PB_String(
75 $item[ $key ][ $inner_field ],
76 $this->get_string_name( $node_id, $item[ $key ][ $inner_field ], $key . '_' . $inner_field, $element['widgetType'], $item['_id'] ),
77 $this->get_title( $key ),
78 $this->get_editor_type( $key )
79 );
80 }
81 }
82 }
83 }
84 return $strings;
85 }
86
87 /**
88 * @param int|string $node_id
89 * @param mixed $element
90 * @param WPML_PB_String $string
91 *
92 * @return mixed
93 */
94 public function update( $node_id, $element, WPML_PB_String $string ) {
95 // Defensive handling: ensure settings and items exist
96 $settings_key = WPML_Elementor_Translatable_Nodes::SETTINGS_FIELD;
97 $items_field = $this->get_items_field();
98 if (
99 ! isset( $element[ $settings_key ] )
100 || ! isset( $element[ $settings_key ][ $items_field ] )
101 || ! is_array( $element[ $settings_key ][ $items_field ] )
102 ) {
103 return null;
104 }
105
106 // Iterate by reference so we can write back into the element when matched
107 foreach ( $element[ $settings_key ][ $items_field ] as $key => &$item ) {
108 foreach ( $this->get_fields() as $field_key => $field ) {
109
110 if ( ! is_array( $field ) ) {
111
112 if ( ! array_key_exists( $field, $item ) ) {
113 continue;
114 }
115
116 if (
117 $this->get_string_name(
118 $node_id,
119 $item[ $field ],
120 $field,
121 isset( $element['widgetType'] ) ? $element['widgetType'] : '',
122 isset( $item['_id'] ) ? $item['_id'] : ''
123 ) === $string->get_name()
124 ) {
125 $item[ $field ] = $string->get_value();
126
127 // Attach index so WPML core can re-insert the item into the element.
128 $item['index'] = $key;
129
130 // Return both index and item so WPML core can list() them safely.
131 return array( $key, $item );
132 }
133
134 } else {
135
136 foreach ( $field as $inner_field ) {
137
138 if (
139 ! isset( $item[ $field_key ] )
140 || ! array_key_exists( $inner_field, $item[ $field_key ] )
141 ) {
142 continue;
143 }
144
145 if (
146 $this->get_string_name(
147 $node_id,
148 $item[ $field_key ][ $inner_field ],
149 $field_key . '_' . $inner_field,
150 isset( $element['widgetType'] ) ? $element['widgetType'] : '',
151 isset( $item['_id'] ) ? $item['_id'] : ''
152 ) === $string->get_name()
153 ) {
154 $item[ $field_key ][ $inner_field ] = $string->get_value();
155
156 // Attach index so WPML core can re-insert the item into the element.
157 $item['index'] = $key;
158
159 // Return both index and item so WPML core can list() them safely.
160 return array( $key, $item );
161 }
162 }
163 }
164 }
165 }
166 // Always return an array with two elements so callers using list($key, $item)
167 // won't trigger "Undefined array key" warnings when the result is empty.
168 return array(null, null);
169 }
170
171 /**
172 * @param string $node_id
173 * @param string $value
174 * @param string $type
175 * @param string $key
176 * @param string $item_id
177 *
178 * @return string
179 */
180 private function get_string_name( $node_id, $value, $type, $key = '', $item_id = '' ) {
181 return $key . '-' . $type . '-' . $node_id . '-' . $item_id;
182 }
183
184 /**
185 * @param $element
186 *
187 * @return mixed
188 */
189 public function get_items( $element ) {
190 $settings_key = WPML_Elementor_Translatable_Nodes::SETTINGS_FIELD;
191 $items_field = $this->get_items_field();
192
193 if (
194 ! isset( $element[ $settings_key ] )
195 || ! isset( $element[ $settings_key ][ $items_field ] )
196 || ! is_array( $element[ $settings_key ][ $items_field ] )
197 ) {
198 return array();
199 }
200
201 return $element[ $settings_key ][ $items_field ];
202 }
203 }
204