PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.4
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.4
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
← All changes | includes/Core/Database/FormEntryMetaModel.php +585 -431 1.92.21.4 View file →
@@ -5,511 +5,665 @@
5 5 */
6 6
7 7 namespace BitCode\BitForm\Core\Database;
8 8
9 +use BitCode\BitForm\Core\Util\FileHandler;
10 +
9 11 /**
10 12 * Undocumented class
11 13 */
12 14
13 -use BitCode\BitForm\Core\Database\Helper;
14 -use BitCode\BitForm\Core\Database\Model;
15 +class FormEntryMetaModel extends Model
16 +{
17 + protected static $table = 'bitforms_form_entrymeta';
15 18
16 -class FormEntryMetaModel extends Model {
17 - protected static $table = 'bitforms_form_entrymeta';
19 + public function duplicateEntryMeta($data)
20 + {
21 + $values[] = $data['duplicateID'];
22 + $values[] = $data['entryID'];
23 + $sql = "INSERT INTO $this->table_name (bitforms_form_entry_id,meta_key,meta_value)"
24 + . ' SELECT %d as bitforms_form_entry_id,meta_key,meta_value'
25 + . " FROM `$this->table_name` WHERE bitforms_form_entry_id = %d";
26 + return $this->execute($sql, $values)->getResult();
27 + }
18 28
19 - public function duplicateEntryMeta($data) {
20 - $values[] = $data['duplicateID'];
21 - $values[] = $data['entryID'];
22 - $sql = "INSERT INTO $this->table_name (bitforms_form_entry_id,meta_key,meta_value)"
23 - . " SELECT %d as bitforms_form_entry_id,meta_key,meta_value"
24 - . " FROM `$this->table_name` WHERE bitforms_form_entry_id = %d";
25 - return $this->execute($sql, $values)->getResult();
29 + public function update(array $data, array $condition)
30 + {
31 + $entryID = $condition['bitforms_form_entry_id'];
32 + if (empty($entryID)) {
33 + return false;
26 34 }
27 -
28 - public function update(array $data, array $condition) {
29 - $entryID = $condition['bitforms_form_entry_id'];
30 - if (empty($entryID)) {
31 - return false;
32 - }
33 - $formEntryMeta = $this->get(
34 - array(
35 - 'meta_key',
36 - 'meta_value',
37 - ),
38 - array(
39 - 'bitforms_form_entry_id' => $entryID,
40 - )
35 + $formEntryMeta = $this->get(
36 + [
37 + 'meta_key',
38 + 'meta_value',
39 + ],
40 + [
41 + 'bitforms_form_entry_id' => $entryID,
42 + ]
43 + );
44 + $oldEntries = [];
45 + foreach ($formEntryMeta as $oldKey => $oldValue) {
46 + $oldEntries[$oldValue->meta_key] = $oldValue->meta_value;
47 + }
48 + $updatedData = [];
49 + $oldEntriesKey = array_keys($oldEntries);
50 + foreach ($data as $upKey => $upValue) {
51 + $updatedData[$upKey] = is_string($upValue) ?
52 + $upValue :
53 + wp_json_encode($upValue);
54 + if (!\in_array($upKey, $oldEntriesKey)) {
55 + $this->insert(
56 + [
57 + 'bitforms_form_entry_id' => $entryID,
58 + 'meta_key' => $upKey,
59 + 'meta_value' => $updatedData[$upKey],
60 + ]
41 61 );
42 - $oldEntries = array();
43 - foreach ($formEntryMeta as $oldKey => $oldValue) {
44 - $oldEntries[$oldValue->meta_key] = $oldValue->meta_value;
45 - }
46 - $updatedData = array();
47 - $oldEntriesKey = array_keys($oldEntries);
48 - foreach ($data as $upKey => $upValue) {
49 - $updatedData[$upKey] = is_string($upValue) ?
50 - $upValue :
51 - wp_json_encode($upValue);
52 - if (!\in_array($upKey, $oldEntriesKey)) {
53 - $this->insert(
54 - array(
55 - 'bitforms_form_entry_id' => $entryID,
56 - 'meta_key' => $upKey,
57 - 'meta_value' => $updatedData[$upKey],
58 - )
59 - );
60 - unset($data[$upKey]);
61 - }
62 - }
63 - if (empty($data)) {
64 - return $updatedData;
65 - }
66 - $checkCondition = $this->checkCondition($condition);
67 - if (is_wp_error($checkCondition)) {
68 - return $checkCondition;
69 - }
70 - $case_part = ' ';
71 - $all_values = array();
72 - $condition['meta_key'] = array_keys($data);
73 - foreach ($data as $key => $value) {
74 - $value = is_string($value) ? $value : wp_json_encode($value);
75 - $case_part .= "
62 + unset($data[$upKey]);
63 + }
64 + }
65 + if (empty($data)) {
66 + return $updatedData;
67 + }
68 + $checkCondition = $this->checkCondition($condition);
69 + if (is_wp_error($checkCondition)) {
70 + return $checkCondition;
71 + }
72 + $case_part = ' ';
73 + $all_values = [];
74 + $condition['meta_key'] = array_keys($data);
75 + foreach ($data as $key => $value) {
76 + $value = is_string($value) ? $value : wp_json_encode($value);
77 + $case_part .= "
76 78 WHEN '$key' THEN " . $this->getFieldFormat($value);
77 - $all_values[] = $value;
78 - }
79 - $formattedCondition = $this->getFormatedCondition($condition);
80 - if ($formattedCondition) {
81 - $condition_to_check = $formattedCondition['conditions'];
82 - $all_values = array_merge($all_values, $formattedCondition['values']);
83 - } else {
84 - $condition_to_check = null;
85 - }
79 + $all_values[] = $value;
80 + }
81 + $formattedCondition = $this->getFormatedCondition($condition);
82 + if ($formattedCondition) {
83 + $condition_to_check = $formattedCondition['conditions'];
84 + $all_values = array_merge($all_values, $formattedCondition['values']);
85 + } else {
86 + $condition_to_check = null;
87 + }
86 88
87 - $sql = "UPDATE $this->table_name
89 + $sql = "UPDATE $this->table_name
88 90 SET meta_value = ( CASE meta_key
89 91 $case_part
90 92 END
91 93 )";
92 - $sql .= " " . $condition_to_check;
93 - $status = $this->execute($sql, $all_values)->getResult();
94 - if (is_wp_error($status) && $status->get_error_code() !== 'result_empty') {
95 - return $status;
96 - }
97 - return $updatedData;
94 + $sql .= ' ' . $condition_to_check;
95 + $status = $this->execute($sql, $all_values)->getResult();
96 + if (is_wp_error($status) && 'result_empty' !== $status->get_error_code()) {
97 + return $status;
98 98 }
99 + return $updatedData;
100 + }
99 101
100 - public function validQueryCondition($conditions) {
101 - foreach ($conditions as $index => $condition) {
102 - if (is_object($condition)) {
103 - if (empty($condition->field) || empty($condition->logic) || empty($condition->val) && !in_array($condition->val, ['0', 0, 0.0], TRUE)) {
104 - unset($conditions[$index]);
105 - unset($conditions[$index + 1]);
106 - }
107 - }
102 + public function validQueryCondition($conditions)
103 + {
104 + foreach ($conditions as $index => $condition) {
105 + if (is_object($condition)) {
106 + if (empty($condition->field) || empty($condition->logic) || empty($condition->val) && !in_array($condition->val, ['0', 0, 0.0], true)) {
107 + unset($conditions[$index], $conditions[$index + 1]);
108 108 }
109 - return $conditions;
109 + }
110 110 }
111 + return $conditions;
112 + }
111 113
112 - public function sqlQryGenerateByFldCondition($conditions) {
113 - $dbHelper = new Helper();
114 - $sql = '';
114 + public function sqlQryGenerateByFldCondition($conditions)
115 + {
116 + $dbHelper = new Helper();
117 + $sql = '';
115 118
116 - $dateQuery = $dbHelper->dateQueryList();
119 + $dateQuery = $dbHelper->dateQueryList();
117 120
118 - $validCondtions = $this->validQueryCondition($conditions);
121 + $validCondtions = $this->validQueryCondition($conditions);
119 122
120 - foreach ($validCondtions as $condition) {
121 - if (is_object($condition)) {
122 - if (is_array($condition->val)) {
123 - $value = $dbHelper->arrValueModifyByLogic($condition->logic, $condition->val);
124 - } else {
125 - $value = $dbHelper->strValueModifyByLogic($condition->logic, $condition->val);
126 - }
123 + foreach ($validCondtions as $condition) {
124 + if (is_object($condition)) {
125 + if (is_array($condition->val)) {
126 + $value = $dbHelper->arrValueModifyByLogic($condition->logic, $condition->val);
127 + } else {
128 + $value = $dbHelper->strValueModifyByLogic($condition->logic, $condition->val);
129 + }
127 130
128 - $operator = $dbHelper->convertToSqlOperator($condition->logic);
131 + $operator = $dbHelper->convertToSqlOperator($condition->logic);
132 + if (!is_array($condition->val) && isset($dateQuery[$condition->val])) {
133 + $sql .= $dbHelper->fieldQueryByDate($condition->field, $operator, $value, $condition->logic);
134 + } else {
135 + if (!is_int($value)) {
136 + $value = "'" . $value . "'";
137 + }
129 138
130 - if (isset($dateQuery[$condition->val])) {
131 - $sql .= $dbHelper->fieldQueryByDate($condition->field, $operator, $value, $condition->logic);
132 - } else {
133 - if (!is_int($value)) {
134 - $value = "'" . $value . "'";
135 - }
139 + $sql .= "`$condition->field` $operator $value";
140 + }
141 + } else {
142 + $sql .= ' ' . $condition;
143 + }
144 + }
136 145
137 - $sql .= "`$condition->field` $operator $value";
138 - }
139 - } else {
140 - $sql .= ' ' . $condition;
141 - }
142 - }
146 + return trim($sql);
147 + }
143 148
144 - return trim($sql);
149 + public function queryRecount($selectedMeta, $groupedCondition, $orderCondition, $all_values)
150 + {
151 + $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
152 + $sql = 'SELECT count(*) as count FROM (';
153 + $sql .= "SELECT $selectedMeta FROM `$this->table_name` em";
154 + $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
155 + $sql .= $groupedCondition . $orderCondition;
156 + $sql .= ') as retrievedData';
157 + $countResult = $this->execute($sql, $all_values)->getResult();
158 + return $countResult[0]->count;
159 + }
145 160
146 - }
161 + public function selectedEntryMeta($formFields, $fieldCount)
162 + {
163 + $all_values = [];
164 + $formFieldsNames = [];
165 + $metaChecker = 0;
166 + $selectedMeta = '`bitforms_form_entry_id` as entry_id,';
167 + $selectedMeta .= "e.user_id as '__user_id',";
168 + $selectedMeta .= "e.user_ip as '__user_ip',";
169 + $selectedMeta .= "e.status as '__entry_status',";
170 + $selectedMeta .= "e.user_location as '__user_location',";
171 + $selectedMeta .= "e.user_device as '__user_device',";
172 + $selectedMeta .= "e.referer as '__referer',";
173 + $selectedMeta .= "e.created_at as '__created_at',";
174 + $selectedMeta .= "e.updated_at as '__updated_at'";
147 175
148 - public function queryRecount($selectedMeta, $groupedCondition, $orderCondition, $all_values) {
149 - $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
150 - $sql = "SELECT count(*) as count FROM (";
151 - $sql .= "SELECT $selectedMeta FROM `$this->table_name` em";
152 - $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
153 - $sql .= $groupedCondition . $orderCondition;
154 - $sql .= ") as retrievedData";
155 - $countResult = $this->execute($sql, $all_values)->getResult();
156 - return $countResult[0]->count;
176 + if ($fieldCount > 0) {
177 + $selectedMeta .= ',';
157 178 }
158 179
159 - public function selectedEntryMeta($formFields, $fieldCount) {
160 - $all_values = [];
161 - $formFieldsNames = [];
162 - $metaChecker = 0;
163 - $selectedMeta = "`bitforms_form_entry_id` as entry_id,";
164 - $selectedMeta .= "e.user_id as '__user_id',";
165 - $selectedMeta .= "e.user_ip as '__user_ip',";
166 - $selectedMeta .= "e.status as '__entry_status',";
167 - $selectedMeta .= "e.user_location as '__user_location',";
168 - $selectedMeta .= "e.user_device as '__user_device',";
169 - $selectedMeta .= "e.referer as '__referer',";
170 - $selectedMeta .= "e.created_at as '__created_at',";
171 - $selectedMeta .= "e.updated_at as '__updated_at'";
172 -
173 - if ($fieldCount > 0) {
174 - $selectedMeta .= ",";
175 - }
176 -
177 - foreach ($formFields as $fieldDetails) {
178 - $fieldFormat = $this->getFieldFormat($fieldDetails['key']);
179 - $selectedMeta .= "GROUP_CONCAT(
180 + foreach ($formFields as $fieldDetails) {
181 + $fieldFormat = $this->getFieldFormat($fieldDetails['key']);
182 + $selectedMeta .= "GROUP_CONCAT(
180 183 CASE
181 184 `meta_key`
182 185 WHEN '$fieldFormat' THEN `meta_value`
183 186 END
184 187 ) AS '$fieldFormat'";
185 - $metaChecker += 1;
186 - $all_values[] = $fieldDetails['key'];
187 - $all_values[] = $fieldDetails['key'];
188 - $formFieldsNames[] = $fieldDetails['key'];
189 - if ($metaChecker < $fieldCount) {
190 - $selectedMeta .= ",";
191 - }
192 - ##unused code commented by me##
193 - // if ( !empty( $filter['global'] ) ) {
194 - // $globalFilterString .= " `" . $fieldDetails['key'] . "` LIKE '%%" . $this->getFieldFormat( $filter['global'] ) . "%%' ";
195 - // if ( $metaChecker < $fieldCount ) {
196 - // $globalFilterString .= " OR ";
197 - // }
198 - // $globalFilterValues[] = $filter['global'];
199 - // }
200 - }
188 + $metaChecker += 1;
189 + $all_values[] = $fieldDetails['key'];
190 + $all_values[] = $fieldDetails['key'];
191 + $formFieldsNames[] = $fieldDetails['key'];
192 + if ($metaChecker < $fieldCount) {
193 + $selectedMeta .= ',';
194 + }
195 + //#unused code commented by me##
196 + // if ( !empty( $filter['global'] ) ) {
197 + // $globalFilterString .= " `" . $fieldDetails['key'] . "` LIKE '%%" . $this->getFieldFormat( $filter['global'] ) . "%%' ";
198 + // if ( $metaChecker < $fieldCount ) {
199 + // $globalFilterString .= " OR ";
200 + // }
201 + // $globalFilterValues[] = $filter['global'];
202 + // }
203 + }
201 204
202 - return [
203 - 'selected_meta' => $selectedMeta,
204 - 'form_fields_names' => $formFieldsNames,
205 - 'all_values' => $all_values,
206 - ];
205 + return [
206 + 'selected_meta' => $selectedMeta,
207 + 'form_fields_names' => $formFieldsNames,
208 + 'all_values' => $all_values,
209 + ];
210 + }
207 211
212 + public function groupedCondition($condition, $all_values, $fieldConditions)
213 + {
214 + $isFldCondition = false;
215 + $formattedCondition = $this->getFormatedCondition($condition);
216 + if ($formattedCondition) {
217 + $groupedCondition = $formattedCondition['conditions'] . 'GROUP BY
218 + `bitforms_form_entry_id` ';
219 + $all_values = array_merge($all_values, $formattedCondition['values']);
220 + } else {
221 + $groupedCondition = null;
208 222 }
223 + //#unused code commented by me##
224 + //$isRecount = false;
209 225
210 - public function groupedCondition($condition, $all_values, $fieldConditions) {
211 - $isFldCondition = false;
212 - $formattedCondition = $this->getFormatedCondition($condition);
213 - if ($formattedCondition) {
214 - $groupedCondition = $formattedCondition['conditions'] . "GROUP BY
215 - `bitforms_form_entry_id` ";
216 - $all_values = array_merge($all_values, $formattedCondition['values']);
217 - } else {
218 - $groupedCondition = null;
226 + // if ( !empty( $filter['field'] ) ) {
227 + // $isRecount = true;
228 + // $filterFieldCount = count( $filter['field'] );
229 + // $filterFieldChecker = 0;
230 + // if ( $filterFieldCount > 0 ) {
231 + // $groupedCondition .= " HAVING ";
232 + // }
233 + // foreach ( $filter['field'] as $filterFieldKey => $filterFieldDetails ) {
234 + // $groupedCondition .= " `$filterFieldDetails->id` ='%%" . $this->getFieldFormat( $filterFieldDetails->value ) . "%%'";
235 + // $all_values[] = $filterFieldDetails->value;
236 + // if ( $filterFieldChecker < $filterFieldCount ) {
237 + // $groupedCondition .= " AND ";
238 + // }
239 + // }
240 + // }
241 +
242 + // if ( !empty( $filter['global'] ) && !empty( $globalFilterString ) && !empty( $globalFilterValues ) ) {
243 + // $isRecount = true;
244 + // if ( !empty( $filter['field'] ) ) {
245 + // $groupedCondition .= " AND (" . $globalFilterString . ") ";
246 + // } else {
247 + // $groupedCondition .= " HAVING $globalFilterString ";
248 + // }
249 + // $offset = 0;
250 + // $all_values = array_merge( $all_values, $globalFilterValues );
251 + // }
252 +
253 + // if ( !empty( $dateBetweenFilter ) && !empty( $dateBetweenFilter->start_date ) && !empty( $dateBetweenFilter->end_date ) ) {
254 + // if ( strpos( $groupedCondition, 'HAVING' ) !== false ) {
255 + // $groupedCondition .= " AND `__created_at` BETWEEN '" . $dateBetweenFilter->start_date . "' AND '" . $dateBetweenFilter->end_date . "' ";
256 + // } else {
257 + // $groupedCondition .= " HAVING `__created_at` BETWEEN '" . $dateBetweenFilter->start_date . "' AND '" . $dateBetweenFilter->end_date . "' ";
258 + // }
259 + // }
260 +
261 + $sqlQryByFldCondtion = $this->sqlQryGenerateByFldCondition($fieldConditions);
262 +
263 + if (!empty($sqlQryByFldCondtion)) {
264 + $isFldCondition = true;
265 + if (false !== strpos($groupedCondition, 'HAVING')) {
266 + $groupedCondition .= ' AND (' . $sqlQryByFldCondtion . ') ';
267 + } else {
268 + $groupedCondition .= ' HAVING (' . $sqlQryByFldCondtion . ') ';
269 + }
270 + }
271 + return [
272 + 'groupedCondition' => $groupedCondition,
273 + 'all_values' => $all_values,
274 + 'isFldCondition' => $isFldCondition,
275 + ];
276 + }
277 +
278 + public function orderCondition($formFieldsNames, $sortBy)
279 + {
280 + $orderCondition = null;
281 + if (!empty($sortBy)) {
282 + $sortableFieldCount = count($sortBy);
283 + $sortableFieldChecker = 0;
284 + if ($sortableFieldCount > 0) {
285 + $orderCondition .= ' ORDER BY ';
286 + }
287 + $orderList = '';
288 + foreach ($sortBy as $sortableFieldKey => $sortableFieldDetails) {
289 + // $orderCondition .=" ".$this->getFieldFormat($sortableFieldDetails->id);
290 + $sortableFieldChecker += 1;
291 + if (in_array($sortableFieldDetails->id, $formFieldsNames)) {
292 + $orderList .= " `$sortableFieldDetails->id` ";
293 + $orderFollow = $sortableFieldDetails->desc ? ' DESC ' : ' ASC ';
294 + $orderList .= ' ' . $orderFollow;
295 + if ($sortableFieldChecker < $sortableFieldCount) {
296 + $orderList .= ', ';
297 + }
219 298 }
220 - ##unused code commented by me##
221 - //$isRecount = false;
299 + }
300 + if (empty($orderList)) {
301 + $orderCondition = null;
302 + } else {
303 + $orderCondition .= $orderList;
304 + }
305 + }
306 + $orderCondition .= empty($orderCondition) ? ' ORDER BY `bitforms_form_entry_id` DESC ' : ',`bitforms_form_entry_id` DESC ';
307 + return $orderCondition;
308 + }
222 309
223 - // if ( !empty( $filter['field'] ) ) {
224 - // $isRecount = true;
225 - // $filterFieldCount = count( $filter['field'] );
226 - // $filterFieldChecker = 0;
227 - // if ( $filterFieldCount > 0 ) {
228 - // $groupedCondition .= " HAVING ";
229 - // }
230 - // foreach ( $filter['field'] as $filterFieldKey => $filterFieldDetails ) {
231 - // $groupedCondition .= " `$filterFieldDetails->id` ='%%" . $this->getFieldFormat( $filterFieldDetails->value ) . "%%'";
232 - // $all_values[] = $filterFieldDetails->value;
233 - // if ( $filterFieldChecker < $filterFieldCount ) {
234 - // $groupedCondition .= " AND ";
235 - // }
236 - // }
237 - // }
310 + public function isEntryMetaExist($conditions)
311 + {
312 + $existMetaData = $this->get(
313 + [
314 + 'meta_key',
315 + 'meta_value',
316 + ],
317 + $conditions
318 + );
319 + if (!is_wp_error($existMetaData) && count($existMetaData) > 0) {
320 + return true;
321 + }
322 + return false;
323 + }
238 324
239 - // if ( !empty( $filter['global'] ) && !empty( $globalFilterString ) && !empty( $globalFilterValues ) ) {
240 - // $isRecount = true;
241 - // if ( !empty( $filter['field'] ) ) {
242 - // $groupedCondition .= " AND (" . $globalFilterString . ") ";
243 - // } else {
244 - // $groupedCondition .= " HAVING $globalFilterString ";
245 - // }
246 - // $offset = 0;
247 - // $all_values = array_merge( $all_values, $globalFilterValues );
248 - // }
325 + public function getEntryMeta($formFields, $entries, $limit = null, $offset = null, $filter = null, $sortBy = null, $fieldConditions = null, $dateBetweenFilter = null)
326 + {
327 + $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
328 + $fieldCount = count($formFields);
329 + $getSelectedMetaFldValue = $this->selectedEntryMeta($formFields, $fieldCount);
330 + $selectedMeta = $getSelectedMetaFldValue['selected_meta'];
331 + $formFieldsNames = $getSelectedMetaFldValue['form_fields_names'];
332 + $all_values = $getSelectedMetaFldValue['all_values'];
333 + $entryIDs = [];
334 + $entryCount = count($entries);
335 + // $paginateEntry = empty($sortBy) && empty($filter['field']) && empty($filter['global']);
336 + // $entries = $paginateEntry ? array_slice($entries, $offset, $limit) : $entries;
337 + $paginateEntry = false;
338 + foreach ($entries as $entryDetail) {
339 + $entryIDs[] = isset($entryDetail->id) ? $entryDetail->id : $entryDetail;
340 + }
341 + if (empty($entryIDs)) {
342 + return [
343 + 'count' => 0,
344 + 'entries' => [],
345 + ];
346 + }
347 + $condition['bitforms_form_entry_id'] = $entryIDs;
348 + $group = $this->groupedCondition($condition, $all_values, $fieldConditions);
349 + $groupedCondition = $group['groupedCondition'];
350 + $all_values = $group['all_values'];
351 + $isFldCondition = $group['isFldCondition'];
352 + $orderCondition = $this->orderCondition($formFieldsNames, (array) $sortBy);
249 353
250 - // if ( !empty( $dateBetweenFilter ) && !empty( $dateBetweenFilter->start_date ) && !empty( $dateBetweenFilter->end_date ) ) {
251 - // if ( strpos( $groupedCondition, 'HAVING' ) !== false ) {
252 - // $groupedCondition .= " AND `__created_at` BETWEEN '" . $dateBetweenFilter->start_date . "' AND '" . $dateBetweenFilter->end_date . "' ";
253 - // } else {
254 - // $groupedCondition .= " HAVING `__created_at` BETWEEN '" . $dateBetweenFilter->start_date . "' AND '" . $dateBetweenFilter->end_date . "' ";
255 - // }
256 - // }
354 + $paginate = null;
355 + if (!\is_null($limit)) {
356 + $limit = \intval($limit);
357 + $paginate .= " LIMIT $limit ";
358 + }
359 + if (!\is_null($offset)) {
360 + $offset = \intval($offset);
361 + $paginate .= " OFFSET $offset ";
362 + }
363 + $sql = "SELECT $selectedMeta FROM `$this->table_name` em";
364 + $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
365 + if ($dateBetweenFilter) {
366 + $startDate = $dateBetweenFilter->start_date;
367 + $endDate = $dateBetweenFilter->end_date;
368 + if ($startDate && $endDate) {
369 + $sql .= " AND DATE(e.created_at) BETWEEN '$startDate' AND '$endDate' ";
370 + } elseif ($startDate) {
371 + $sql .= " AND DATE(e.created_at) >= '$startDate' ";
372 + } elseif ($endDate) {
373 + $sql .= " AND DATE(e.created_at) <= '$endDate' ";
374 + }
375 + }
376 + $sql .= $groupedCondition . $orderCondition . $paginate;
377 + $result = $this->execute($sql, $all_values)->getResult();
378 + if (is_wp_error($result)) {
379 + return [
380 + 'count' => $paginateEntry ? $entryCount : 0,
381 + 'entries' => [],
382 + 'error' => $result->get_error_message()
383 + ];
384 + }
385 + if ($isFldCondition) {
386 + $condition['bitforms_form_entry_id'] = $entryIDs;
387 + $group = $this->groupedCondition($condition, $all_values, $fieldConditions);
388 + $all_values = $group['all_values'];
389 + $entryCount = $this->queryRecount($selectedMeta, $group['groupedCondition'], $orderCondition, $all_values);
390 + }
391 + $resultedEntries = [
392 + 'count' => $entryCount,
393 + 'entries' => $result,
394 + ];
395 + return $resultedEntries;
396 + }
257 397
258 - $sqlQryByFldCondtion = $this->sqlQryGenerateByFldCondition($fieldConditions);
398 + public function getSingleEntryMeta($formFields, $entryId)
399 + {
400 + $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
401 + $fieldCount = count($formFields);
402 + $getSelectedMetaFldValue = $this->selectedEntryMeta($formFields, $fieldCount);
403 + $selectedMeta = $getSelectedMetaFldValue['selected_meta'];
404 + $formFieldsNames = $getSelectedMetaFldValue['form_fields_names'];
405 + $all_values = $getSelectedMetaFldValue['all_values'];
406 + $condition['bitforms_form_entry_id'] = [$entryId];
407 + $group = $this->groupedCondition($condition, $all_values, []);
408 + $groupedCondition = $group['groupedCondition'];
409 + $all_values = $group['all_values'];
410 + $orderCondition = $this->orderCondition($formFieldsNames, null);
411 + $sql = "SELECT $selectedMeta FROM `$this->table_name` em";
412 + $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
413 + $sql .= $groupedCondition . $orderCondition;
414 + $result = $this->execute($sql, $all_values)->getResult();
259 415
260 - if (!empty($sqlQryByFldCondtion)) {
261 - $isFldCondition = true;
262 - if (strpos($groupedCondition, 'HAVING') !== false) {
263 - $groupedCondition .= " AND (" . $sqlQryByFldCondtion . ") ";
264 - } else {
265 - $groupedCondition .= " HAVING (" . $sqlQryByFldCondtion . ") ";
266 - }
416 + if (is_wp_error($result)) {
417 + return [];
418 + }
419 + return $result;
420 + }
267 421
268 - }
269 - return [
270 - 'groupedCondition' => $groupedCondition,
271 - 'all_values' => $all_values,
272 - 'isFldCondition' => $isFldCondition,
273 - ];
422 + private function csvInjectionPrevent($value)
423 + {
424 + $formula = ['=', '-', '+', '@', "\t", "\r"];
425 + $valueFilter = preg_replace('/[\]["]/i', '', $value);
426 + if (\in_array(substr($value, 0, 1), $formula, true)) {
427 + $valueFilter = "'" . trim($valueFilter);
274 428 }
275 429
276 - public function orderCondition($formFieldsNames, $sortBy) {
277 - $orderCondition = null;
278 - if (!empty($sortBy)) {
279 - $sortableFieldCount = count($sortBy);
280 - $sortableFieldChecker = 0;
281 - if ($sortableFieldCount > 0) {
282 - $orderCondition .= " ORDER BY ";
283 - }
284 - $orderList = '';
285 - foreach ($sortBy as $sortableFieldKey => $sortableFieldDetails) {
286 - // $orderCondition .=" ".$this->getFieldFormat($sortableFieldDetails->id);
287 - $sortableFieldChecker += 1;
288 - if (in_array($sortableFieldDetails->id, $formFieldsNames)) {
289 - $orderList .= " `$sortableFieldDetails->id` ";
290 - $orderFollow = $sortableFieldDetails->desc ? ' DESC ' : ' ASC ';
291 - $orderList .= " " . $orderFollow;
292 - if ($sortableFieldChecker < $sortableFieldCount) {
293 - $orderList .= ", ";
294 - }
295 - }
296 - }
297 - if (empty($orderList)) {
298 - $orderCondition = null;
299 - } else {
300 - $orderCondition .= $orderList;
301 - }
302 - }
303 - $orderCondition .= empty($orderCondition) ? " ORDER BY `bitforms_form_entry_id` DESC " : ",`bitforms_form_entry_id` DESC ";
304 - return $orderCondition;
430 + return $valueFilter;
431 + }
432 +
433 + private function unescapeString($str)
434 + {
435 + // return preg_replace_callback(
436 + // '/\\\\u([0-9a-fA-F]{4})/',
437 + // fn ($match) => mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'),
438 + // $str
439 + // );
440 + if (is_string($str) && '' !== $str) {
441 + // Handle JSON-style escaping
442 + $decoded = json_decode('"' . str_replace('"', '\\"', $str) . '"');
443 + return (null !== $decoded) ? $decoded : $str;
305 444 }
445 + return $str;
446 + }
306 447
307 - public function getEntryMeta($formFields, $entries, $limit = null, $offset = null, $filter = null, $sortBy = null, $fieldConditions = null) {
308 - $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
309 - $fieldCount = count($formFields);
310 - $getSelectedMetaFldValue = $this->selectedEntryMeta($formFields, $fieldCount);
448 + private function formatRepeaterValue($rawValue, $fieldMap)
449 + {
450 + if (empty($rawValue)) {
451 + return '';
452 + }
453 + $rows = [];
454 + preg_match_all('/\{([^}]+)\}/', $rawValue, $matches);
311 455
312 - $selectedMeta = $getSelectedMetaFldValue['selected_meta'];
313 - $formFieldsNames = $getSelectedMetaFldValue['form_fields_names'];
314 - $all_values = $getSelectedMetaFldValue['all_values'];
315 - $entryIDs = array();
316 - $entryCount = count($entries);
317 - // $paginateEntry = empty($sortBy) && empty($filter['field']) && empty($filter['global']);
318 - // $entries = $paginateEntry ? array_slice($entries, $offset, $limit) : $entries;
319 - $paginateEntry = false;
320 - foreach ($entries as $entryDetail) {
321 - $entryIDs[] = $entryDetail->id;
322 - }
323 - if (empty($entryIDs)) {
324 - return array(
325 - 'count' => 0,
326 - 'entries' => [],
327 - );
328 - }
329 - $condition['bitforms_form_entry_id'] = $entryIDs;
330 - $group = $this->groupedCondition($condition, $all_values, $fieldConditions);
331 - $groupedCondition = $group['groupedCondition'];
332 - $all_values = $group['all_values'];
333 - $isFldCondition = $group['isFldCondition'];
334 - $orderCondition = $this->orderCondition($formFieldsNames, $sortBy);
456 + foreach ($matches[1] as $row) {
457 + $pairs = explode(',', $row);
458 + $formattedPairs = [];
335 459
336 - $paginate = null;
337 - if (!\is_null($limit)) {
338 - $limit = \intval($limit);
339 - $paginate .= " LIMIT $limit ";
460 + foreach ($pairs as $pair) {
461 + if (false === strpos($pair, ':')) {
462 + continue;
340 463 }
341 - if (!\is_null($offset)) {
342 - $offset = \intval($offset);
343 - $paginate .= " OFFSET $offset ";
344 - }
345 - $sql = "SELECT $selectedMeta FROM `$this->table_name` em";
346 - $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
347 - $sql .= $groupedCondition . $orderCondition . $paginate;
348 - $result = $this->execute($sql, $all_values)->getResult();
349 - if (is_wp_error($result)) {
350 - return array(
351 - 'count' => $paginateEntry ? $entryCount : 0,
352 - 'entries' => [],
353 - 'error' => $result->get_error_message()
354 - );
355 - }
356 - if ($isFldCondition) {
357 - $condition['bitforms_form_entry_id'] = $entryIDs;
358 - $group = $this->groupedCondition($condition, $all_values, $fieldConditions);
359 - $all_values = $group['all_values'];
360 - $entryCount = $this->queryRecount($selectedMeta, $group['groupedCondition'], $orderCondition, $all_values);
361 - }
362 - $resultedEntries = array(
363 - 'count' => $entryCount,
364 - 'entries' => $result,
365 - );
366 - return $resultedEntries;
367 - }
464 + [$childKey, $value] = explode(':', $pair, 2);
465 + $childKey = trim($childKey);
466 + $value = trim($value);
368 467
369 - private function csvInjectionPrevent($value)
370 - {
371 - $formula= ['=', '-', '+', '@', "\t", "\r"];
372 - $valueFilter = preg_replace('/[\]["]/i', '', $value);
373 - if (\in_array(substr($value, 0, 1), $formula, true)) {
374 - $valueFilter = "'".trim($valueFilter);
375 - }
468 + // Get label from fieldMap or use key
469 + $label = $fieldMap[$childKey]['adminLbl'] ?? $childKey;
470 + $formattedPairs[] = "$label: " . self::unescapeString($value);
471 + }
376 472
377 - return $valueFilter;
473 + $rows[] = implode(', ', $formattedPairs);
378 474 }
379 475
476 + return implode('; ', $rows);
477 + }
380 478
381 - public function getExportEntry($formFields, $entries, $formId, $fieldLabels, $fileFormate, $limit = null, $sortBy = null, $sortByField = null) {
382 - $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
383 - $selectedEntryMeta = "`bitforms_form_entry_id` as entry_id,";
384 - $selectedEntryMeta .= "e.user_id as '__user_id',";
385 - $selectedEntryMeta .= "e.status as '__entry_status',";
386 - $selectedEntryMeta .= "e.user_ip as '__user_ip',";
387 - $selectedEntryMeta .= "e.user_location as '__user_location',";
388 - $selectedEntryMeta .= "e.user_device as '__user_device',";
389 - $selectedEntryMeta .= "e.referer as '__referer',";
390 - $selectedEntryMeta .= "e.created_at as '__created_at',";
391 - $selectedEntryMeta .= "e.updated_at as '__updated_at',";
392 - $metaChecker = 0;
479 + public function getExportEntry($formFields, $entries, $formId, $fieldLabels, $limit = null, $sortBy = null, $sortByField = null, $offset = null, $entryConditions = null)
480 + {
481 + $entry_table = $this->app_db->prefix . 'bitforms_form_entries';
482 + $selectedEntryMeta = '`bitforms_form_entry_id` as entry_id,';
483 + $selectedEntryMeta .= 'e.user_id as `__user_id`,';
484 + $selectedEntryMeta .= 'e.status as `__entry_status`,';
485 + $selectedEntryMeta .= 'e.user_ip as `__user_ip`,';
486 + $selectedEntryMeta .= 'e.user_location as `__user_location`,';
487 + $selectedEntryMeta .= 'e.user_device as `__user_device`,';
488 + $selectedEntryMeta .= 'e.referer as `__referer`,';
489 + $selectedEntryMeta .= 'e.created_at as `__created_at`,';
490 + $selectedEntryMeta .= 'e.updated_at as `__updated_at`,';
491 + $metaChecker = 0;
393 492
394 - $entryInfo = ['__user_id', '__user_ip', /* '__user_location', */'__user_device',
395 - '__referer', '__created_at', '__updated_at'];
396 - $all_values = array();
397 - if ($formFields == []) {
398 - $data = array(
399 - 'count' => 0,
400 - 'entries' => [],
401 - );
402 - wp_send_json_success($data, 200);
403 - }
404 - $fieldCount = count($formFields) - count(array_intersect($formFields, $entryInfo));
405 - $formFieldsNames = array();
406 - foreach ($formFields as $fldKey) {
407 - $formFieldsNames[] = $fldKey;
408 - if (in_array($fldKey, $entryInfo)) {
409 - continue;
410 - }
411 - $fieldFormat = $this->getFieldFormat($fldKey);
412 - $selectedEntryMeta .= "GROUP_CONCAT(
493 + $entryInfo = [
494 + '__user_id',
495 + '__user_ip', /* '__user_location', */
496 + '__user_device',
497 + '__entry_status',
498 + '__referer',
499 + '__created_at',
500 + '__updated_at'
501 + ];
502 + $all_values = [];
503 + if ([] === $formFields) {
504 + $data = [
505 + 'count' => 0,
506 + 'entries' => [],
507 + ];
508 + wp_send_json_success($data, 200);
509 + }
510 + $fieldCount = count($formFields) - count(array_intersect($formFields, $entryInfo));
511 + $formFieldsNames = [];
512 + foreach ($formFields as $fldKey) {
513 + $formFieldsNames[] = $fldKey;
514 + if (in_array($fldKey, $entryInfo)) {
515 + continue;
516 + }
517 + $fieldFormat = $this->getFieldFormat($fldKey);
518 + $selectedEntryMeta .= "GROUP_CONCAT(
413 519 CASE
414 520 `meta_key`
415 521 WHEN '$fieldFormat' THEN `meta_value`
416 522 END
417 523 ) AS '$fieldFormat'";
418 - $metaChecker += 1;
419 - $all_values[] = $fldKey;
420 - $all_values[] = $fldKey;
421 - if ($metaChecker < $fieldCount) {
422 - $selectedEntryMeta .= ",";
423 - }
524 + $metaChecker += 1;
525 + $all_values[] = $fldKey;
526 + $all_values[] = $fldKey;
527 + if ($metaChecker < $fieldCount) {
528 + $selectedEntryMeta .= ',';
529 + }
530 + }
531 + $entryIDs = [];
532 + foreach ($entries as $entryDetail) {
533 + $entryIDs[] = $entryDetail->id;
534 + }
535 + if (empty($entryIDs)) {
536 + return [
537 + 'count' => 0,
538 + 'entries' => [],
539 + ];
540 + }
541 + $condition['bitforms_form_entry_id'] = $entryIDs;
542 + $formattedCondition = $this->getFormatedCondition($condition);
543 + $groupedCondition = null;
544 + $grpCon = $this->groupedCondition($condition, $all_values, $entryConditions);
545 + $groupedCondition = $grpCon['groupedCondition'];
546 + $all_values = $grpCon['all_values'];
547 +
548 + // if ($formattedCondition) {
549 + // $groupedCondition = $formattedCondition['conditions'] . ' GROUP BY
550 + // `bitforms_form_entry_id` ';
551 + // $all_values = array_merge($all_values, $formattedCondition['values']);
552 + // }
553 + $order = 'DESC' === $sortBy ? 'DESC ' : 'ASC ';
554 + $orderField = \is_null($sortByField) ? 'bitforms_form_entry_id' : "`$sortByField`";
555 +
556 + $orderCondition = "ORDER BY $orderField $order ";
557 + // if (!\is_null($limit)) {
558 + // $limitInt = \intval($limit);
559 + // $limit = " LIMIT $limitInt ";
560 + // }
561 + $limitClause = '';
562 + if (!\is_null($limit)) {
563 + $limitInt = \intval($limit);
564 + $limitClause = " LIMIT $limitInt ";
565 + if (!\is_null($offset)) {
566 + $offsetInt = \intval($offset);
567 + $limitClause .= " OFFSET $offsetInt ";
568 + }
569 + }
570 +
571 + $sql = "SELECT $selectedEntryMeta FROM `$this->table_name` em";
572 + $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
573 + $sql .= $groupedCondition . $orderCondition . $limitClause;
574 + $result = $this->execute($sql, $all_values)->getResult();
575 + $allData = [];
576 + $entry_id = 'entry_id';
577 + $users = get_users(['fields' => ['ID', 'display_name']]);
578 + $userNames = [];
579 + $entryStatus = [
580 + '0' => 'Read',
581 + '1' => 'Unread',
582 + '2' => 'Unconfirmed',
583 + '3' => 'Confirmed',
584 + '9' => 'Draft',
585 + ];
586 + foreach ($users as $key => $value) {
587 + $userNames[$value->ID] = $value->display_name;
588 + }
589 + foreach ($result as $key => $value) {
590 + foreach ($formFieldsNames as $formFieldName) {
591 + $allData[$key]['entry_id'] = preg_replace('/[\]["]/i', '', $value->$entry_id);
592 + if ('__user_id' === $formFieldName && intval($value->$formFieldName) > 0) {
593 + $allData[$key][$formFieldName] = $userNames[$value->$formFieldName];
594 + } elseif ('__user_ip' === $formFieldName) {
595 + $allData[$key][$formFieldName] = long2ip((int) $value->$formFieldName);
596 + } elseif ('__entry_status' === $formFieldName) {
597 + // replace numeric marker for status with actual status text
598 + $allData[$key][$formFieldName] = $entryStatus[$value->{$formFieldName}];
599 + } else {
600 + $allData[$key][$formFieldName] = preg_replace('/[\]["]/i', '', $value->$formFieldName);
424 601 }
425 - $entryIDs = array();
426 - foreach ($entries as $entryDetail) {
427 - $entryIDs[] = $entryDetail->id;
602 + }
603 + }
604 +
605 + if (is_wp_error($result)) {
606 + wp_send_json_error('Internal server error', 500);
607 + } else {
608 + // Create mappings:
609 + $fieldMap = []; // fieldKey => fieldData
610 + $repeaterFields = []; // repeater fieldKeys
611 + $fileFields = [];
612 + $downloadableFieldType = ['file-up', 'signature', 'advanced-file-up'];
613 +
614 + foreach ($fieldLabels as $field) {
615 + $key = $field['key'];
616 + $fieldMap[$key] = $field;
617 + if ('repeater' === $field['type']) {
618 + $repeaterFields[] = $key;
619 + } elseif (in_array($field['type'], $downloadableFieldType, true)) {
620 + $fileFields[] = $key;
428 621 }
429 - if (empty($entryIDs)) {
430 - return array(
431 - 'count' => 0,
432 - 'entries' => [],
433 - );
622 + }
623 +
624 + // Step 4: Process all entries efficiently
625 + foreach ($allData as &$entry) {
626 + // Process all fields with unified unescaping
627 + foreach ($entry as $key => &$value) {
628 + if (is_string($value)) {
629 + $value = self::unescapeString($value);
630 + }
631 +
632 + // Process repeater fields
633 + if (in_array($key, $repeaterFields, true)) {
634 + $value = self::formatRepeaterValue($value, $fieldMap);
635 + }
434 636 }
435 - $condition['bitforms_form_entry_id'] = $entryIDs;
436 - $formattedCondition = $this->getFormatedCondition($condition);
437 - $groupedCondition = null;
438 - if ($formattedCondition) {
439 - $groupedCondition = $formattedCondition['conditions'] . " GROUP BY
440 - `bitforms_form_entry_id` ";
441 - $all_values = array_merge($all_values, $formattedCondition['values']);
442 - }
443 - $order = \is_null($sortBy) ? "DESC " : "$sortBy";
444 - $orderField = \is_null($sortByField) ? "bitforms_form_entry_id" : "`$sortByField`";
445 637
446 - $orderCondition = "ORDER BY $orderField $order ";
447 - if (!\is_null($limit)) {
448 - $limitInt = \intval($limit);
449 - $limit = " LIMIT $limitInt ";
450 - }
451 - $sql = "SELECT $selectedEntryMeta FROM `$this->table_name` em";
452 - $sql .= " INNER JOIN $entry_table e on e.id = em.bitforms_form_entry_id ";
453 - $sql .= $groupedCondition . $orderCondition . $limit;
638 + unset($value); // Break reference
639 + }
640 + unset($entry, $value); // Break references
454 641
455 - $result = $this->execute($sql, $all_values)->getResult();
456 - $allData = [];
457 - $entry_id = "entry_id";
458 - $users = get_users(['fields' => ['ID', 'display_name']]);
459 - $userNames = [];
460 - foreach ($users as $key => $value) {
461 - $userNames[$value->ID] = $value->display_name;
462 - }
463 - foreach ($result as $key => $value) {
464 - foreach ($formFieldsNames as $formFieldName) {
465 - $allData[$key]['entry_id'] = preg_replace('/[\]["]/i', '', $value->$entry_id);
466 - if ($formFieldName === '__user_id' && intval($value->$formFieldName) > 0) {
467 - $allData[$key][$formFieldName] = $userNames[$value->$formFieldName];
468 - } elseif ($formFieldName === '__user_ip') {
469 - $allData[$key][$formFieldName] = long2ip($value->$formFieldName);
470 - } else {
471 - $allData[$key][$formFieldName] = preg_replace('/[\]["]/i', '', $value->$formFieldName);
472 - }
473 - if (is_string($value->$formFieldName) && in_array($fileFormate, ['csv', 'xlsx', 'xls'])) {
474 - $allData[$key][$formFieldName] = $this->csvInjectionPrevent($value->$formFieldName);
475 - }
642 + // Process file fields (existing logic optimized)
643 + foreach ($allData as $index => &$entry) {
644 + $entryId = $entry['entry_id'];
645 + $_upload_dir = FileHandler::getEntriesFileUploadDir($formId, $entryId);
646 + foreach ($fileFields as $fileKey) {
647 + if (empty($entry[$fileKey])) {
648 + continue;
649 + }
476 650
651 + $fileIds = explode(',', $entry[$fileKey]);
652 + $urls = [];
477 653
654 + foreach ($fileIds as $fileId) {
655 + $path = "bitforms/bitforms-file/?formID=$formId&entryID=$entryId&fileID=$fileId";
656 + if (file_exists($_upload_dir . DIRECTORY_SEPARATOR . $fileId)) {
657 + $urls[] = site_url($path);
478 658 }
659 + }
660 +
661 + $entry[$fileKey] = implode(',', $urls);
479 662 }
663 + }
480 664
481 - if (is_wp_error($result)) {
482 - wp_send_json_error('Internal server error', 500);
483 - } else {
484 - foreach ($fieldLabels as $field) {
485 - foreach ($allData as $index => $entry) {
486 - if (array_key_exists($field['key'], $entry) && $field['type'] == 'file-up') {
487 - $key = $field['key'];
488 - if (empty($entry[$key])) {
489 - continue;
490 - }
491 - $_upload_dir = BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formId . DIRECTORY_SEPARATOR . $entry['entry_id'];
492 - if (is_array(explode(",", $entry[$key]))) {
493 - $fileData = array();
494 - foreach (explode(",", $entry[$key]) as $file) {
495 - $uploadedFile= explode("_", $file);
496 - $path = "bitforms/bitforms-file/?formID=$formId&entryID=" . $entry['entry_id'] . "&fileID=$uploadedFile[0]";
497 - if (file_exists($_upload_dir . DIRECTORY_SEPARATOR . $uploadedFile[0])) {
498 - $fileData[] = site_url($path, null);
499 - }
500 - }
501 - $allData[$index][$key] = implode(',', $fileData);
502 - } else {
503 - $uploadedFile= explode("_", $entry[$key]);
504 - $path = "bitforms/bitforms-file/?formID=$formId&entryID=" . $entry['entry_id'] . "&fileID=" . $uploadedFile[0];
505 - if (file_exists($_upload_dir . DIRECTORY_SEPARATOR . $uploadedFile[0])) {
506 - $allData[$index][$key] = site_url($path, null);
507 - }
508 - }
509 - }
510 - }
511 - }
512 - wp_send_json_success($allData, 200);
513 - }
665 + unset($entry); // Break reference
666 + wp_send_json_success($allData, 200);
514 667 }
668 + }
515 669 }