PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 7.1.4
Jetpack – WP Security, Backup, Speed, & Growth v7.1.4
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 All 500 releases
jetpack / sync / class.jetpack-sync-module.php
class.jetpack-sync-module.php
161 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Basic methods implemented by Jetpack Sync extensions
5 */
6 abstract class Jetpack_Sync_Module {
7 const ARRAY_CHUNK_SIZE = 10;
8
9 abstract public function name();
10
11 public function get_object_by_id( $object_type, $id ) {
12 return false;
13 }
14
15 // override these to set up listeners and set/reset data/defaults
16 public function init_listeners( $callable ) {
17 }
18
19 public function init_full_sync_listeners( $callable ) {
20 }
21
22 public function init_before_send() {
23 }
24
25 public function set_defaults() {
26 }
27
28 public function reset_data() {
29 }
30
31 public function enqueue_full_sync_actions( $config, $max_items_to_enqueue, $state ) {
32 // in subclasses, return the number of actions enqueued, and next module state (true == done)
33 return array( 0, true );
34 }
35
36 public function estimate_full_sync_actions( $config ) {
37 // in subclasses, return the number of items yet to be enqueued
38 return 0;
39 }
40
41 public function get_full_sync_actions() {
42 return array();
43 }
44
45 protected function count_actions( $action_names, $actions_to_count ) {
46 return count( array_intersect( $action_names, $actions_to_count ) );
47 }
48
49 protected function get_check_sum( $values ) {
50 return crc32( wp_json_encode( jetpack_json_wrap( $values ) ) );
51 }
52
53 protected function still_valid_checksum( $sums_to_check, $name, $new_sum ) {
54 if ( isset( $sums_to_check[ $name ] ) && $sums_to_check[ $name ] === $new_sum ) {
55 return true;
56 }
57
58 return false;
59 }
60
61 protected function enqueue_all_ids_as_action( $action_name, $table_name, $id_field, $where_sql, $max_items_to_enqueue, $state ) {
62 global $wpdb;
63
64 if ( ! $where_sql ) {
65 $where_sql = '1 = 1';
66 }
67
68 $items_per_page = 1000;
69 $page = 1;
70 $chunk_count = 0;
71 $previous_max_id = $state ? $state : '~0';
72 $listener = Jetpack_Sync_Listener::get_instance();
73
74 // count down from max_id to min_id so we get newest posts/comments/etc first
75 while ( $ids = $wpdb->get_col( "SELECT {$id_field} FROM {$table_name} WHERE {$where_sql} AND {$id_field} < {$previous_max_id} ORDER BY {$id_field} DESC LIMIT {$items_per_page}" ) ) {
76 // Request posts in groups of N for efficiency
77 $chunked_ids = array_chunk( $ids, self::ARRAY_CHUNK_SIZE );
78
79 // if we hit our row limit, process and return
80 if ( $chunk_count + count( $chunked_ids ) >= $max_items_to_enqueue ) {
81 $remaining_items_count = $max_items_to_enqueue - $chunk_count;
82 $remaining_items = array_slice( $chunked_ids, 0, $remaining_items_count );
83
84 $listener->bulk_enqueue_full_sync_actions( $action_name, $remaining_items );
85
86 $last_chunk = end( $remaining_items );
87 return array( $remaining_items_count + $chunk_count, end( $last_chunk ) );
88 }
89
90 $listener->bulk_enqueue_full_sync_actions( $action_name, $chunked_ids );
91
92 $chunk_count += count( $chunked_ids );
93 $page += 1;
94 $previous_max_id = end( $ids );
95 }
96
97 return array( $chunk_count, true );
98 }
99
100 protected function get_metadata( $ids, $meta_type, $meta_key_whitelist ) {
101 global $wpdb;
102 $table = _get_meta_table( $meta_type );
103 $id = $meta_type . '_id';
104 if ( ! $table ) {
105 return array();
106 }
107
108 $private_meta_whitelist_sql = "'" . implode( "','", array_map( 'esc_sql', $meta_key_whitelist ) ) . "'";
109
110 return array_map(
111 array( $this, 'unserialize_meta' ),
112 $wpdb->get_results(
113 "SELECT $id, meta_key, meta_value, meta_id FROM $table WHERE $id IN ( " . implode( ',', wp_parse_id_list( $ids ) ) . ' )' .
114 " AND meta_key IN ( $private_meta_whitelist_sql ) ",
115 OBJECT
116 )
117 );
118 }
119
120 public function init_listeners_for_meta_type( $meta_type, $callable ) {
121 add_action( "added_{$meta_type}_meta", $callable, 10, 4 );
122 add_action( "updated_{$meta_type}_meta", $callable, 10, 4 );
123 add_action( "deleted_{$meta_type}_meta", $callable, 10, 4 );
124 }
125
126 public function init_meta_whitelist_handler( $meta_type, $whitelist_handler ) {
127 add_filter( "jetpack_sync_before_enqueue_added_{$meta_type}_meta", $whitelist_handler );
128 add_filter( "jetpack_sync_before_enqueue_updated_{$meta_type}_meta", $whitelist_handler );
129 add_filter( "jetpack_sync_before_enqueue_deleted_{$meta_type}_meta", $whitelist_handler );
130 }
131
132 protected function get_term_relationships( $ids ) {
133 global $wpdb;
134
135 return $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id IN ( " . implode( ',', wp_parse_id_list( $ids ) ) . ' )', OBJECT );
136 }
137
138 public function unserialize_meta( $meta ) {
139 $meta->meta_value = maybe_unserialize( $meta->meta_value );
140 return $meta;
141 }
142
143 public function get_objects_by_id( $object_type, $ids ) {
144 if ( empty( $ids ) || empty( $object_type ) ) {
145 return array();
146 }
147
148 $objects = array();
149 foreach ( (array) $ids as $id ) {
150 $object = $this->get_object_by_id( $object_type, $id );
151
152 // Only add object if we have the object.
153 if ( $object ) {
154 $objects[ $id ] = $object;
155 }
156 }
157
158 return $objects;
159 }
160 }
161