PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.1.5
Jetpack – WP Security, Backup, Speed, & Growth v13.1.5
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 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 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 / modules / widgets / wordpress-post-widget / class.jetpack-display-posts-widget.php
jetpack / modules / widgets / wordpress-post-widget Last commit date
class.jetpack-display-posts-widget-base.php 2 years ago class.jetpack-display-posts-widget.php 3 years ago style.css 7 years ago
class.jetpack-display-posts-widget.php
279 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 use Automattic\Jetpack\Status;
4
5 /**
6 * Display a list of recent posts from a WordPress.com or Jetpack-enabled blog.
7 */
8 class Jetpack_Display_Posts_Widget extends Jetpack_Display_Posts_Widget__Base {
9 /**
10 * Widget options key prefix.
11 *
12 * @var string
13 */
14 public $widget_options_key_prefix = 'display_posts_site_data_';
15
16 /**
17 * The name of the cron that will update widget data.
18 *
19 * @var string
20 */
21 public static $cron_name = 'jetpack_display_posts_widget_cron_update';
22
23 // DATA STORE.
24
25 /**
26 * Gets blog data from the cache.
27 *
28 * @param string $site Site.
29 *
30 * @return array|WP_Error
31 */
32 public function get_blog_data( $site ) {
33 // Load from cache, if nothing return an error.
34 $site_hash = $this->get_site_hash( $site );
35
36 $cached_data = $this->wp_get_option( $this->widget_options_key_prefix . $site_hash );
37
38 /**
39 * If the cache is empty, return an empty_cache error.
40 */
41 if ( false === $cached_data ) {
42 return new WP_Error(
43 'empty_cache',
44 __( 'Information about this blog is currently being retrieved.', 'jetpack' )
45 );
46 }
47
48 return $cached_data;
49 }
50
51 /**
52 * Update a widget instance.
53 *
54 * @param string $site The site to fetch the latest data for.
55 *
56 * @return array - the new data
57 */
58 public function update_instance( $site ) {
59
60 /**
61 * Fetch current information for a site.
62 */
63 $site_hash = $this->get_site_hash( $site );
64
65 $option_key = $this->widget_options_key_prefix . $site_hash;
66
67 $instance_data = $this->wp_get_option( $option_key );
68
69 /**
70 * Fetch blog data and save it in $instance_data.
71 */
72 $new_data = $this->fetch_blog_data( $site, $instance_data );
73
74 /**
75 * If the option doesn't exist yet - create a new option
76 */
77 if ( false === $instance_data ) {
78 $this->wp_add_option( $option_key, $new_data );
79 } else {
80 $this->wp_update_option( $option_key, $new_data );
81 }
82
83 return $new_data;
84 }
85
86 // WIDGET API.
87
88 /**
89 * Widget update function.
90 *
91 * @param array $new_instance New instance widget settings.
92 * @param array $old_instance Old instance widget settings.
93 */
94 public function update( $new_instance, $old_instance ) {
95 $instance = parent::update( $new_instance, $old_instance );
96
97 /**
98 * Forcefully activate the update cron when saving widget instance.
99 *
100 * So we can be sure that it will be running later.
101 */
102 $this->activate_cron();
103
104 return $instance;
105 }
106
107 // CRON.
108
109 /**
110 * Activates widget update cron task.
111 */
112 public static function activate_cron() {
113 if ( ! wp_next_scheduled( self::$cron_name ) ) {
114 wp_schedule_event( time(), 'minutes_10', self::$cron_name );
115 }
116 }
117
118 /**
119 * Deactivates widget update cron task.
120 *
121 * This is a wrapper over the static method as it provides some syntactic sugar.
122 */
123 public function deactivate_cron() {
124 self::deactivate_cron_static();
125 }
126
127 /**
128 * Deactivates widget update cron task.
129 */
130 public static function deactivate_cron_static() {
131 $next_scheduled_time = wp_next_scheduled( self::$cron_name );
132 wp_unschedule_event( $next_scheduled_time, self::$cron_name );
133 }
134
135 /**
136 * Checks if the update cron should be running and returns appropriate result.
137 *
138 * @return bool If the cron should be running or not.
139 */
140 public function should_cron_be_running() {
141 /**
142 * The cron doesn't need to run empty loops.
143 */
144 $widget_instances = $this->get_instances_sites();
145
146 if ( empty( $widget_instances ) || ! is_array( $widget_instances ) ) {
147 return false;
148 }
149
150 if ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) {
151 /**
152 * If Jetpack is not active or in offline mode, we don't want to update widget data.
153 */
154 if ( ! Jetpack::is_connection_ready() && ! ( new Status() )->is_offline_mode() ) {
155 return false;
156 }
157
158 /**
159 * If Extra Sidebar Widgets module is not active, we don't need to update widget data.
160 */
161 if ( ! Jetpack::is_module_active( 'widgets' ) ) {
162 return false;
163 }
164 }
165
166 /**
167 * If none of the above checks failed, then we definitely want to update widget data.
168 */
169 return true;
170 }
171
172 /**
173 * Main cron code. Updates all instances of the widget.
174 *
175 * @return bool
176 */
177 public function cron_task() {
178
179 /**
180 * If the cron should not be running, disable it.
181 */
182 if ( false === $this->should_cron_be_running() ) {
183 return true;
184 }
185
186 $instances_to_update = $this->get_instances_sites();
187
188 /**
189 * If no instances are found to be updated - stop.
190 */
191 if ( empty( $instances_to_update ) || ! is_array( $instances_to_update ) ) {
192 return true;
193 }
194
195 foreach ( $instances_to_update as $site_url ) {
196 $this->update_instance( $site_url );
197 }
198
199 return true;
200 }
201
202 /**
203 * Get a list of unique sites from all instances of the widget.
204 *
205 * @return array|bool
206 */
207 public function get_instances_sites() {
208
209 $widget_settings = $this->wp_get_option( 'widget_jetpack_display_posts_widget' );
210
211 /**
212 * If the widget still hasn't been added anywhere, the config will not be present.
213 *
214 * In such case we don't want to continue execution.
215 */
216 if ( false === $widget_settings || ! is_array( $widget_settings ) ) {
217 return false;
218 }
219
220 $urls = array();
221
222 foreach ( $widget_settings as $widget_instance_data ) {
223 if ( isset( $widget_instance_data['url'] ) && ! empty( $widget_instance_data['url'] ) ) {
224 $urls[] = $widget_instance_data['url'];
225 }
226 }
227
228 /**
229 * Make sure only unique URLs are returned.
230 */
231 $urls = array_unique( $urls );
232
233 return $urls;
234 }
235
236 // MOCKABLES.
237
238 /**
239 * This is just to make method mocks in the unit tests easier.
240 *
241 * @param string $param Option key to get.
242 *
243 * @return mixed
244 *
245 * @codeCoverageIgnore
246 */
247 public function wp_get_option( $param ) {
248 return get_option( $param );
249 }
250
251 /**
252 * This is just to make method mocks in the unit tests easier.
253 *
254 * @param string $option_name Option name to be added.
255 * @param mixed $option_value Option value.
256 *
257 * @return mixed
258 *
259 * @codeCoverageIgnore
260 */
261 public function wp_add_option( $option_name, $option_value ) {
262 return add_option( $option_name, $option_value );
263 }
264
265 /**
266 * This is just to make method mocks in the unit tests easier.
267 *
268 * @param string $option_name Option name to be updated.
269 * @param mixed $option_value Option value.
270 *
271 * @return mixed
272 *
273 * @codeCoverageIgnore
274 */
275 public function wp_update_option( $option_name, $option_value ) {
276 return update_option( $option_name, $option_value );
277 }
278 }
279