PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-sync / src / modules / class-meta.php
jetpack / jetpack_vendor / automattic / jetpack-sync / src / modules Last commit date
class-attachments.php 8 months ago class-callables.php 1 month ago class-comments.php 2 months ago class-constants.php 8 months ago class-full-sync-immediately.php 3 months ago class-full-sync.php 2 months ago class-import.php 8 months ago class-menus.php 2 months ago class-meta.php 2 months ago class-module.php 5 months ago class-network-options.php 8 months ago class-options.php 2 months ago class-plugins.php 2 months ago class-posts.php 2 months ago class-protect.php 8 months ago class-search.php 2 months ago class-stats.php 6 months ago class-term-relationships.php 8 months ago class-terms.php 2 months ago class-themes.php 2 months ago class-updates.php 8 months ago class-users.php 1 month ago class-woocommerce-hpos-orders.php 1 month ago class-woocommerce-products.php 8 months ago class-woocommerce.php 1 month ago class-wp-super-cache.php 8 months ago
class-meta.php
197 lines
1 <?php
2 /**
3 * Meta sync module.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8 namespace Automattic\Jetpack\Sync\Modules;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit( 0 );
12 }
13
14 /**
15 * Class to handle sync for meta.
16 */
17 class Meta extends Module {
18 /**
19 * Sync module name.
20 *
21 * @access public
22 *
23 * @return string
24 */
25 public function name() {
26 return 'meta';
27 }
28
29 /**
30 * This implementation of get_objects_by_id() is a bit hacky since we're not passing in an array of meta IDs,
31 * but instead an array of post or comment IDs for which to retrieve meta for. On top of that,
32 * we also pass in an associative array where we expect there to be 'meta_key' and 'ids' keys present.
33 *
34 * This seemed to be required since if we have missing meta on WP.com and need to fetch it, we don't know what
35 * the meta key is, but we do know that we have missing meta for a given post or comment.
36 *
37 * @todo Refactor the $wpdb->prepare call to use placeholders.
38 *
39 * @param string $object_type The type of object for which we retrieve meta. Either 'post' or 'comment'.
40 * @param array $config Must include 'meta_key' and 'ids' keys.
41 *
42 * @return array
43 */
44 public function get_objects_by_id( $object_type, $config ) {
45 global $wpdb;
46
47 $table = _get_meta_table( $object_type );
48
49 if ( ! $table ) {
50 return array();
51 }
52
53 if ( ! is_array( $config ) ) {
54 return array();
55 }
56
57 $object_id_column = $object_type . '_id';
58 $object_key_pairs = array();
59
60 foreach ( $config as $item ) {
61 if ( isset( $item['id'] ) && isset( $item['meta_key'] ) ) {
62 $object_key_pairs[ (int) $item['id'] ][] = (string) $item['meta_key'];
63 }
64 }
65
66 $meta_objects = array();
67 $where_sql = '';
68 $current_query_length = 0;
69
70 foreach ( $object_key_pairs as $object_id => $keys ) {
71 $keys_placeholders = implode( ',', array_fill( 0, count( $keys ), '%s' ) );
72 $where_condition = trim(
73 $wpdb->prepare(
74 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
75 "( `$object_id_column` = %d AND meta_key IN ( $keys_placeholders ) )",
76 array_merge( array( $object_id ), $keys )
77 )
78 );
79
80 $where_sql = empty( $where_sql ) ? $where_condition : $where_sql . ' OR ' . $where_condition;
81
82 $current_query_length += strlen( $where_sql );
83
84 if ( $current_query_length > self::MAX_DB_QUERY_LENGTH ) {
85 $meta_objects = $this->fetch_prepared_meta_from_db( $object_type, $where_sql, $meta_objects );
86 $where_sql = '';
87 $current_query_length = 0;
88 }
89 }
90
91 if ( ! empty( $where_sql ) ) {
92 $meta_objects = $this->fetch_prepared_meta_from_db( $object_type, $where_sql, $meta_objects );
93 }
94
95 return $meta_objects;
96 }
97
98 /**
99 * Get a single Meta Result.
100 *
101 * @param string $object_type post, comment, term, user.
102 * @param int|null $id Object ID.
103 * @param string|null $meta_key Meta Key.
104 *
105 * @return mixed|null
106 */
107 public function get_object_by_id( $object_type, $id = null, $meta_key = null ) {
108 global $wpdb;
109
110 if ( ! is_int( $id ) || ! is_string( $meta_key ) ) {
111 return null;
112 }
113
114 $table = _get_meta_table( $object_type );
115
116 if ( ! $table ) {
117 return null;
118 }
119
120 $object_id_column = $object_type . '_id';
121
122 // Sanitize so that the array only has integer values.
123 $where_condition = $wpdb->prepare(
124 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
125 "{$object_id_column} = %d AND meta_key = %s",
126 $id,
127 $meta_key
128 );
129
130 $meta_objects = $this->fetch_prepared_meta_from_db( $object_type, $where_condition );
131
132 $key = $id . '-' . $meta_key;
133
134 return $meta_objects[ $key ] ?? null;
135 }
136
137 /**
138 * Fetch meta from DB and return them in a standard format.
139 *
140 * @param string $object_type The meta object type, eg 'post', 'user' etc.
141 * @param string $where Prepared SQL 'where' statement.
142 * @param array $meta_objects An existing array of meta to populate. Defaults to an empty array.
143 * @return array
144 */
145 private function fetch_prepared_meta_from_db( $object_type, $where, $meta_objects = array() ) {
146 global $wpdb;
147
148 $table = _get_meta_table( $object_type );
149 $object_id_column = $object_type . '_id';
150
151 $meta = $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.DirectQuery
152 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
153 "SELECT * FROM {$table} WHERE {$where}",
154 ARRAY_A
155 );
156
157 if ( ! is_wp_error( $meta ) && ! empty( $meta ) ) {
158 foreach ( $meta as $meta_entry ) {
159 $object_id = $meta_entry[ $object_id_column ];
160 $meta_key = $meta_entry['meta_key'];
161 $key = $object_id . '-' . $meta_key;
162
163 if ( ! isset( $meta_objects[ $key ] ) ) {
164 $meta_objects[ $key ] = array();
165 }
166
167 $meta_objects[ $key ][] = $this->get_prepared_meta_object( $object_type, $meta_entry );
168 }
169 }
170
171 return $meta_objects;
172 }
173
174 /**
175 * Accepts a DB meta entry and returns it in a standard format.
176 *
177 * @param string $object_type The meta object type, eg 'post', 'user' etc.
178 * @param array $meta_entry A meta array.
179 * @return array
180 */
181 private function get_prepared_meta_object( $object_type, $meta_entry ) {
182 $object_id_column = $object_type . '_id';
183
184 if ( 'post' === $object_type && isset( $meta_entry['meta_value'] ) && is_string( $meta_entry['meta_value'] ) && strlen( $meta_entry['meta_value'] ) >= Posts::MAX_META_LENGTH ) {
185 $meta_entry['meta_value'] = '';
186 }
187
188 return array(
189 'meta_type' => $object_type,
190 'meta_id' => $meta_entry['meta_id'],
191 'meta_key' => $meta_entry['meta_key'],
192 'meta_value' => $meta_entry['meta_value'],
193 'object_id' => $meta_entry[ $object_id_column ],
194 );
195 }
196 }
197