Completed
Push — update/sync-package ( 660c46 )
by
unknown
08:05
created

packages/sync/legacy/class.jetpack-sync-module.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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( null, 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 null;
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_interval_end = $state ? $state : '~0';
72
		$listener              = Jetpack_Sync_Listener::get_instance();
0 ignored issues
show
The method get_instance() does not seem to exist on object<Jetpack_Sync_Listener>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
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_interval_end} 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
				$remaining_items_with_previous_interval_end = $this->get_chunks_with_preceding_end( $remaining_items, $previous_interval_end );
84
				$listener->bulk_enqueue_full_sync_actions( $action_name, $remaining_items_with_previous_interval_end );
85
86
				$last_chunk = end( $remaining_items );
87
				return array( $remaining_items_count + $chunk_count, end( $last_chunk ) );
88
			}
89
			$chunked_ids_with_previous_end = $this->get_chunks_with_preceding_end( $chunked_ids, $previous_interval_end );
90
91
			$listener->bulk_enqueue_full_sync_actions( $action_name, $chunked_ids_with_previous_end );
92
93
			$chunk_count    += count( $chunked_ids );
94
			$page           += 1;
95
			// $ids are ordered in descending order
96
			$previous_interval_end = end( $ids );
97
		}
98
99
		return array( $chunk_count, true );
100
	}
101
102
	private function get_chunks_with_preceding_end( $chunks, $previous_interval_end ) {
103
		foreach( $chunks as $chunk ) {
104
			$chunks_with_ends[] = array(
105
				'ids' => $chunk,
106
				'previous_end' => $previous_interval_end
107
			);
108
			// Chunks are ordered in descending order
109
			$previous_interval_end = end( $chunk );
110
		}
111
		return $chunks_with_ends;
112
	}
113
114
	protected function get_metadata( $ids, $meta_type, $meta_key_whitelist ) {
115
		global $wpdb;
116
		$table = _get_meta_table( $meta_type );
117
		$id    = $meta_type . '_id';
118
		if ( ! $table ) {
119
			return array();
120
		}
121
122
		$private_meta_whitelist_sql = "'" . implode( "','", array_map( 'esc_sql', $meta_key_whitelist ) ) . "'";
123
124
		return array_map(
125
			array( $this, 'unserialize_meta' ),
126
			$wpdb->get_results(
127
				"SELECT $id, meta_key, meta_value, meta_id FROM $table WHERE $id IN ( " . implode( ',', wp_parse_id_list( $ids ) ) . ' )' .
128
				" AND meta_key IN ( $private_meta_whitelist_sql ) ",
129
				OBJECT
130
			)
131
		);
132
	}
133
134
	public function init_listeners_for_meta_type( $meta_type, $callable ) {
135
		add_action( "added_{$meta_type}_meta", $callable, 10, 4 );
136
		add_action( "updated_{$meta_type}_meta", $callable, 10, 4 );
137
		add_action( "deleted_{$meta_type}_meta", $callable, 10, 4 );
138
	}
139
140
	public function init_meta_whitelist_handler( $meta_type, $whitelist_handler ) {
141
		add_filter( "jetpack_sync_before_enqueue_added_{$meta_type}_meta", $whitelist_handler );
142
		add_filter( "jetpack_sync_before_enqueue_updated_{$meta_type}_meta", $whitelist_handler );
143
		add_filter( "jetpack_sync_before_enqueue_deleted_{$meta_type}_meta", $whitelist_handler );
144
	}
145
146
	protected function get_term_relationships( $ids ) {
147
		global $wpdb;
148
149
		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 );
150
	}
151
152
	public function unserialize_meta( $meta ) {
153
		$meta->meta_value = maybe_unserialize( $meta->meta_value );
154
		return $meta;
155
	}
156
157
	public function get_objects_by_id( $object_type, $ids ) {
158
		if ( empty( $ids ) || empty( $object_type ) ) {
159
			return array();
160
		}
161
162
		$objects = array();
163
		foreach ( (array) $ids as $id ) {
164
			$object = $this->get_object_by_id( $object_type, $id );
165
166
			// Only add object if we have the object.
167
			if ( $object ) {
168
				$objects[ $id ] = $object;
169
			}
170
		}
171
172
		return $objects;
173
	}
174
}
175