| @@ -1,8 +1,8 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | /** |
| 3 | 3 | * @package FireBox |
| 4 | - * @version 3.1.8 Free | |
| 4 | + * @version 3.1.14 Free | |
| 5 | 5 | * |
| 6 | 6 | * @author FirePlugins <[email protected]> |
| 7 | 7 | * @link https://www.fireplugins.com |
| 8 | 8 | * @copyright Copyright © 2026 FirePlugins All Rights Reserved |
| @@ -34,10 +34,11 @@ | ||
| 34 | 34 | return []; |
| 35 | 35 | } |
| 36 | 36 | |
| 37 | 37 | $meta = []; |
| 38 | - | |
| 39 | - // Save submission meta | |
| 38 | + $rows = []; | |
| 39 | + | |
| 40 | + // Build submission meta | |
| 40 | 41 | foreach ($fields_values as $key => $value) |
| 41 | 42 | { |
| 42 | 43 | $submission_meta_payload = [ |
| 43 | 44 | 'submission_id' => $submission_id, |
| @@ -46,21 +47,100 @@ | ||
| 46 | 47 | 'meta_value' => is_array($value) ? wp_json_encode($value) : $value, |
| 47 | 48 | 'created_at' => gmdate('Y-m-d H:i:s'), |
| 48 | 49 | 'modified_at' => null |
| 49 | 50 | ]; |
| 50 | - | |
| 51 | - if ($save) | |
| 51 | + | |
| 52 | + $rows[] = $submission_meta_payload; | |
| 53 | + $meta[] = $submission_meta_payload; | |
| 54 | + } | |
| 55 | + | |
| 56 | + if ($save) | |
| 57 | + { | |
| 58 | + if (!self::insertMany($rows)) | |
| 52 | 59 | { |
| 53 | - if (!firebox()->tables->submissionmeta->insert($submission_meta_payload)) | |
| 54 | - { | |
| 55 | - return; | |
| 56 | - } | |
| 60 | + return; | |
| 57 | 61 | } |
| 62 | + } | |
| 58 | 63 | |
| 59 | - $meta[] = $submission_meta_payload; | |
| 64 | + return $meta; | |
| 65 | + } | |
| 66 | + | |
| 67 | + /** | |
| 68 | + * Batch-inserts multiple submission meta rows using a single multi-row INSERT | |
| 69 | + * instead of one INSERT per field. | |
| 70 | + * | |
| 71 | + * @param array $rows | |
| 72 | + * | |
| 73 | + * @return bool | |
| 74 | + */ | |
| 75 | + private static function insertMany($rows) | |
| 76 | + { | |
| 77 | + if (!$rows) | |
| 78 | + { | |
| 79 | + return true; | |
| 60 | 80 | } |
| 61 | 81 | |
| 62 | - return $meta; | |
| 82 | + global $wpdb; | |
| 83 | + | |
| 84 | + $table = firebox()->tables->submissionmeta->getFullTableName(); | |
| 85 | + | |
| 86 | + $placeholders = []; | |
| 87 | + $values = []; | |
| 88 | + | |
| 89 | + foreach ($rows as $row) | |
| 90 | + { | |
| 91 | + $placeholders[] = '(%d, %s, %s, %s, %s, %s)'; | |
| 92 | + | |
| 93 | + $values[] = $row['submission_id']; | |
| 94 | + $values[] = $row['meta_type']; | |
| 95 | + $values[] = $row['meta_key']; | |
| 96 | + $values[] = $row['meta_value']; | |
| 97 | + $values[] = $row['created_at']; | |
| 98 | + $values[] = $row['modified_at']; | |
| 99 | + } | |
| 100 | + | |
| 101 | + $sql = "INSERT INTO `{$table}` (`submission_id`, `meta_type`, `meta_key`, `meta_value`, `created_at`, `modified_at`) VALUES " . implode(', ', $placeholders); | |
| 102 | + | |
| 103 | + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared | |
| 104 | + $result = $wpdb->query($wpdb->prepare($sql, $values)); | |
| 105 | + | |
| 106 | + return false !== $result; | |
| 107 | + } | |
| 108 | + | |
| 109 | + /** | |
| 110 | + * Retrieves submission meta for multiple submissions in chunked IN() queries, | |
| 111 | + * grouped by submission_id, to avoid one query per submission. | |
| 112 | + * | |
| 113 | + * @param array $submission_ids | |
| 114 | + * | |
| 115 | + * @return array | |
| 116 | + */ | |
| 117 | + public static function getMetaForSubmissions($submission_ids = []) | |
| 118 | + { | |
| 119 | + if (!$submission_ids) | |
| 120 | + { | |
| 121 | + return []; | |
| 122 | + } | |
| 123 | + | |
| 124 | + $meta_by_submission = []; | |
| 125 | + | |
| 126 | + foreach (array_chunk($submission_ids, 500) as $id_chunk) | |
| 127 | + { | |
| 128 | + $ids_in = implode(',', array_map('absint', $id_chunk)); | |
| 129 | + | |
| 130 | + $chunk_meta = firebox()->tables->submissionmeta->getResults([ | |
| 131 | + 'where' => [ | |
| 132 | + 'submission_id' => " IN (" . $ids_in . ")" | |
| 133 | + ] | |
| 134 | + ]); | |
| 135 | + | |
| 136 | + foreach ($chunk_meta as $meta_item) | |
| 137 | + { | |
| 138 | + $meta_by_submission[$meta_item->submission_id][] = $meta_item; | |
| 139 | + } | |
| 140 | + } | |
| 141 | + | |
| 142 | + return $meta_by_submission; | |
| 63 | 143 | } |
| 64 | 144 | |
| 65 | 145 | /** |
| 66 | 146 | * Retrieves the meta row. |