PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.3.2
Adminify – White Label, Admin Menu Editor, Login Customizer v4.3.2
4.3.2 4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 All 165 releases
← All changes | Inc/Modules/PostDuplicator/PostDuplicator.php +21 -17 4.2.124.3.2 View file →
@@ -196,24 +196,20 @@
196 196 wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false);
197 197 }
198 198
199 199 /*
200 - * duplicate all post meta just in two SQL queries
200 + * duplicate all post meta
201 + * get_post_meta() without a key returns raw (still serialized) values,
202 + * so rows are copied byte-for-byte via parameterized $wpdb->insert().
201 203 */
202 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- direct query required for copying all post meta rows; not cached intentionally.
203 - $post_meta_infos = $wpdb->get_results($wpdb->prepare("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=%d", $post_id));
204 - if (count($post_meta_infos) != 0) {
205 - $sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
206 - foreach ($post_meta_infos as $meta_info) {
207 - $meta_key = $meta_info->meta_key;
208 -
204 + $new_post_id = absint($new_post_id);
205 + $post_metas = $new_post_id ? get_post_meta($post_id) : [];
206 + if (!empty($post_metas) && is_array($post_metas)) {
207 + foreach ($post_metas as $meta_key => $meta_values) {
209 208 // Do not copy these values
210 - if ($meta_key == '_wp_old_slug') {
209 + if (in_array($meta_key, ['_wp_old_slug', '_elementor_css'], true)) {
211 210 continue;
212 211 }
213 - if ($meta_key == '_elementor_css') {
214 - continue;
215 - }
216 212
217 213 // Delete already added meta data triggered by wp_insert_post hook
218 214 if ($meta_key == '_elementor_template_type') {
219 215 delete_post_meta($new_post_id, '_elementor_template_type');
@@ -218,14 +214,22 @@
218 214 if ($meta_key == '_elementor_template_type') {
219 215 delete_post_meta($new_post_id, '_elementor_template_type');
220 216 }
221 217
222 - $meta_value = $meta_info->meta_value;
223 - $sql_query_sel[] = $wpdb->prepare('SELECT %d, %s, %s', $new_post_id, $meta_key, $meta_value);
218 + foreach ((array) $meta_values as $meta_value) {
219 + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- raw copy keeps serialized values intact; $wpdb->insert() is parameterized.
220 + $wpdb->insert(
221 + $wpdb->postmeta,
222 + [
223 + 'post_id' => $new_post_id,
224 + 'meta_key' => $meta_key, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_query_meta_key
225 + 'meta_value' => $meta_value, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_query_meta_value
226 + ],
227 + ['%d', '%s', '%s']
228 + );
229 + }
224 230 }
225 - $sql_query .= implode(' UNION ALL ', $sql_query_sel);
226 - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,PluginCheck.Security.DirectDB.UnescapedDBParameter -- $sql_query is built from $wpdb->prepare() fragments above; direct query required for bulk meta insert, not cached intentionally.
227 - $wpdb->query($sql_query);
231 + wp_cache_delete($new_post_id, 'post_meta');
228 232 }
229 233
230 234 /*
231 235 * finally, redirect to the edit post screen for the new draft