diff options
Diffstat (limited to 'plugins/jetpack/sync/class.jetpack-sync-module-meta.php')
-rw-r--r-- | plugins/jetpack/sync/class.jetpack-sync-module-meta.php | 87 |
1 files changed, 82 insertions, 5 deletions
diff --git a/plugins/jetpack/sync/class.jetpack-sync-module-meta.php b/plugins/jetpack/sync/class.jetpack-sync-module-meta.php index 5fff16a3..b0e70355 100644 --- a/plugins/jetpack/sync/class.jetpack-sync-module-meta.php +++ b/plugins/jetpack/sync/class.jetpack-sync-module-meta.php @@ -7,6 +7,68 @@ class Jetpack_Sync_Module_Meta extends Jetpack_Sync_Module { return 'meta'; } + /** + * This implementation of get_objects_by_id() is a bit hacky since we're not passing in an array of meta IDs, + * but instead an array of post or comment IDs for which to retrieve meta for. On top of that, + * we also pass in an associative array where we expect there to be 'meta_key' and 'ids' keys present. + * + * This seemed to be required since if we have missing meta on WP.com and need to fetch it, we don't know what + * the meta key is, but we do know that we have missing meta for a given post or comment. + * + * @param string $object_type The type of object for which we retrieve meta. Either 'post' or 'comment' + * @param array $config Must include 'meta_key' and 'ids' keys + * + * @return array + */ + public function get_objects_by_id( $object_type, $config ) { + global $wpdb; + if ( ! in_array( $object_type, $this->meta_types ) ) { + return array(); + } + + if ( ! isset( $config['meta_key'] ) || ! isset( $config['ids'] ) || ! is_array( $config['ids'] ) ) { + return array(); + } + + $meta_key = $config['meta_key']; + $ids = $config['ids']; + + if ( ! $this->is_meta_key_allowed( $meta_key ) ) { + return array(); + } + + if ( 'post' == $object_type ) { + $table = $wpdb->postmeta; + $object_id_column = 'post_id'; + } else { + $table = $wpdb->commentmeta; + $object_id_column = 'comment_id'; + } + + // Sanitize so that the array only has integer values + $ids_string = implode( ', ', array_map( 'intval', $ids ) ); + $metas = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM {$table} WHERE {$object_id_column} IN ( {$ids_string} ) AND meta_key = %s", + $meta_key + ) + ); + + $meta_objects = array(); + foreach( (array) $metas as $meta_object ) { + $meta_object = (array) $meta_object; + $meta_objects[ $meta_object[ $object_id_column ] ] = array( + 'meta_type' => $object_type, + 'meta_id' => $meta_object['meta_id'], + 'meta_key' => $meta_key, + 'meta_value' => $meta_object['meta_value'], + 'object_id' => $meta_object[ $object_id_column ], + ); + } + + return $meta_objects; + } + public function init_listeners( $callable ) { $whitelist_handler = array( $this, 'filter_meta' ); @@ -21,15 +83,30 @@ class Jetpack_Sync_Module_Meta extends Jetpack_Sync_Module { } } - function filter_meta( $args ) { - if ( '_' === $args[2][0] && - ! in_array( $args[2], Jetpack_Sync_Defaults::$default_whitelist_meta_keys ) && - ! wp_startswith( $args[2], '_wpas_skip_' ) + /** + * Should we allow the meta key to be synced? + * + * @param string $meta_key The meta key. + * + * @return bool + */ + function is_meta_key_allowed( $meta_key ) { + if ( '_' === $meta_key[0] && + ! in_array( $meta_key, Jetpack_Sync_Defaults::$default_whitelist_meta_keys ) && + ! wp_startswith( $meta_key, '_wpas_skip_' ) ) { return false; } - if ( in_array( $args[2], Jetpack_Sync_Settings::get_setting( 'meta_blacklist' ) ) ) { + if ( in_array( $meta_key, Jetpack_Sync_Settings::get_setting( 'meta_blacklist' ) ) ) { + return false; + } + + return true; + } + + function filter_meta( $args ) { + if ( ! $this->is_meta_key_allowed( $args[2] ) ) { return false; } |