PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 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 All 508 releases
← All changes | modules/widgets/flickr.php +261 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,261 @@
1 +<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 +/**
3 + * Flickr Widget, pulling recent photos from Flickr using RSS feed.
4 + *
5 + * This widget is now deprecated.
6 + * Existing widgets will continue to work, but Flickr no longer displays RSS feeds,
7 + * making it impossible for site owners to configure this widget.
8 + * We consequently only register the widget if it's already in use on the site.
9 + *
10 + * @see https://github.com/Automattic/jetpack/issues/39824
11 + *
12 + * @package automattic/jetpack
13 + */
14 +
15 +// phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
16 +
17 +/**
18 + * Disable direct access/execution to/of the widget code.
19 + */
20 +if ( ! defined( 'ABSPATH' ) ) {
21 + exit( 0 );
22 +}
23 +
24 +if ( ! class_exists( 'Jetpack_Flickr_Widget' ) ) {
25 + /**
26 + * Flickr Widget
27 + *
28 + * Display your recent Flickr photos.
29 + */
30 + class Jetpack_Flickr_Widget extends WP_Widget {
31 + /**
32 + * Constructor.
33 + */
34 + public function __construct() {
35 + parent::__construct(
36 + 'flickr',
37 + /** This filter is documented in modules/widgets/facebook-likebox.php */
38 + apply_filters( 'jetpack_widget_name', esc_html__( 'Flickr', 'jetpack' ) ),
39 + array(
40 + 'description' => esc_html__( 'Display your recent Flickr photos.', 'jetpack' ),
41 + 'customize_selective_refresh' => true,
42 + ),
43 + array()
44 + );
45 + }
46 +
47 + /**
48 + * Enqueue style.
49 + */
50 + public function enqueue_style() {
51 + wp_enqueue_style( 'flickr-widget-style', plugins_url( 'flickr/style.css', __FILE__ ), array(), '20170405' );
52 + }
53 +
54 + /**
55 + * Return an associative array of default values.
56 + *
57 + * These values are used in new widgets.
58 + *
59 + * @return array Default values for the widget options.
60 + */
61 + public function defaults() {
62 + return array(
63 + 'title' => esc_html__( 'Flickr Photos', 'jetpack' ),
64 + 'items' => 4,
65 + 'target' => false,
66 + 'flickr_image_size' => 'thumbnail',
67 + 'flickr_rss_url' => '',
68 + );
69 + }
70 +
71 + /**
72 + * Front-end display of the widget.
73 + *
74 + * @html-template-var array $instance
75 + * @html-template-var string|null $flickr_home
76 + * @html-template-var string $photos';
77 + *
78 + * @param array $args Widget arguments.
79 + * @param array $instance Saved values from database.
80 + */
81 + public function widget( $args, $instance ) {
82 + $instance = wp_parse_args( $instance, $this->defaults() );
83 +
84 + // Enqueue front end assets.
85 + $this->enqueue_style();
86 +
87 + if ( ! empty( $instance['flickr_rss_url'] ) ) {
88 + /*
89 + * Parse the URL, and rebuild a URL that's sure to display images.
90 + * Some Flickr Feeds do not display images by default.
91 + */
92 + $flickr_parameters = wp_parse_url( htmlspecialchars_decode( $instance['flickr_rss_url'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 ) );
93 +
94 + // Is it a Flickr Feed.
95 + if (
96 + ! empty( $flickr_parameters['host'] )
97 + && ! empty( $flickr_parameters['query'] )
98 + && str_contains( $flickr_parameters['host'], 'flickr' )
99 + ) {
100 + parse_str( $flickr_parameters['query'], $vars );
101 +
102 + // Do we have an ID in the feed? Let's continue.
103 + if ( isset( $vars['id'] ) ) {
104 +
105 + // Flickr Feeds can be used for groups or for individuals.
106 + if (
107 + ! empty( $flickr_parameters['path'] )
108 + && str_contains( $flickr_parameters['path'], 'groups' )
109 + ) {
110 + $feed_url = 'https://api.flickr.com/services/feeds/groups_pool.gne';
111 + } else {
112 + $feed_url = 'https://api.flickr.com/services/feeds/photos_public.gne';
113 + }
114 +
115 + // Build our new RSS feed.
116 + $rss_url = sprintf(
117 + '%1$s?id=%2$s&format=rss_200_enc',
118 + esc_url( $feed_url ),
119 + esc_attr( $vars['id'] )
120 + );
121 + }
122 + }
123 + }
124 +
125 + // Still no RSS feed URL? Get a default feed from Flickr to grab interesting photos.
126 + if ( empty( $rss_url ) ) {
127 + $rss_url = 'https://api.flickr.com/services/feeds/photos_interesting.gne?format=rss_200';
128 + }
129 +
130 + $rss = fetch_feed( $rss_url );
131 +
132 + $photos = '';
133 + $flickr_home = null; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Used in flickr/widget.php template file.
134 + if ( ! is_wp_error( $rss ) ) {
135 + foreach ( $rss->get_items( 0, $instance['items'] ) as $photo ) {
136 + switch ( $instance['flickr_image_size'] ) {
137 + case 'thumbnail':
138 + $src = $photo->get_enclosure()->get_thumbnail();
139 + break;
140 + case 'small':
141 + $src = preg_match( '/src="(.*?)"/i', $photo->get_description(), $p );
142 + $src = $p[1];
143 + break;
144 + case 'large':
145 + $src = $photo->get_enclosure()->get_link();
146 + break;
147 + default:
148 + $src = '';
149 + break;
150 + }
151 +
152 + $photos .= '<a href="' . esc_url( $photo->get_permalink(), array( 'http', 'https' ) ) . '" ';
153 + if ( $instance['target'] ) {
154 + $photos .= 'target="_blank" rel="noopener noreferrer" ';
155 + }
156 + $photos .= '><img src="' . esc_url( $src, array( 'http', 'https' ) ) . '" ';
157 + $photos .= 'alt="' . esc_attr( $photo->get_title() ) . '" ';
158 + $photos .= 'title="' . esc_attr( $photo->get_title() ) . '" ';
159 + $photos .= ' /></a>';
160 + }
161 + if ( ! empty( $photos ) ) {
162 + $photos = apply_filters( 'jetpack_image_cdn_content', $photos );
163 + }
164 +
165 + $flickr_home = $rss->get_link(); // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Used in flickr/widget.php template file.
166 + }
167 +
168 + echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
169 + if ( empty( $photos ) ) {
170 + if ( current_user_can( 'edit_theme_options' ) ) {
171 + printf(
172 + '<p>%1$s<br />%2$s</p>',
173 + esc_html__( 'There are no photos to display. Make sure your Flickr feed URL is correct, and that your pictures are publicly accessible.', 'jetpack' ),
174 + esc_html__( '(Only admins can see this message)', 'jetpack' )
175 + );
176 + }
177 + } else {
178 + echo $args['before_title'] . $instance['title'] . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
179 + require __DIR__ . '/flickr/widget.php';
180 + }
181 + echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
182 + /** This action is already documented in modules/widgets/gravatar-profile.php */
183 + do_action( 'jetpack_stats_extra', 'widget_view', 'flickr' );
184 + }
185 +
186 + /**
187 + * Back-end widget form.
188 + *
189 + * @html-template-var array $instance
190 + *
191 + * @param array $instance Previously saved values from database.
192 + * @return string|void
193 + */
194 + public function form( $instance ) {
195 + $instance = wp_parse_args( $instance, $this->defaults() );
196 + require __DIR__ . '/flickr/form.php';
197 + }
198 +
199 + /**
200 + * Sanitize widget form values as they are saved.
201 + *
202 + * @param array $new_instance Values just sent to be saved.
203 + * @param array $old_instance Previously saved values from database.
204 + * @return array Updated safe values to be saved.
205 + */
206 + public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
207 + $instance = array();
208 +
209 + if ( isset( $new_instance['title'] ) ) {
210 + $instance['title'] = wp_kses( $new_instance['title'], array() );
211 + }
212 +
213 + if ( isset( $new_instance['items'] ) ) {
214 + $instance['items'] = (int) $new_instance['items'];
215 + }
216 +
217 + if ( isset( $new_instance['target'] ) ) {
218 + $instance['target'] = (bool) $new_instance['target'];
219 + }
220 +
221 + if (
222 + isset( $new_instance['flickr_image_size'] ) &&
223 + in_array( $new_instance['flickr_image_size'], array( 'thumbnail', 'small', 'large' ), true )
224 + ) {
225 + $instance['flickr_image_size'] = $new_instance['flickr_image_size'];
226 + } else {
227 + $instance['flickr_image_size'] = 'thumbnail';
228 + }
229 +
230 + if ( isset( $new_instance['flickr_rss_url'] ) ) {
231 + $instance['flickr_rss_url'] = esc_url( $new_instance['flickr_rss_url'], array( 'http', 'https' ) );
232 +
233 + if ( strlen( $instance['flickr_rss_url'] ) < 10 ) {
234 + $instance['flickr_rss_url'] = '';
235 + }
236 + }
237 +
238 + return $instance;
239 + }
240 + }
241 +
242 + /**
243 + * Register Jetpack_Flickr_Widget widget.
244 + */
245 + function jetpack_register_flickr_widget() {
246 + $transient = 'jetpack_flickr_widget::is_active';
247 + $has_widget = get_transient( $transient );
248 +
249 + if ( false === $has_widget ) {
250 + $is_active_widget = is_active_widget( false, false, 'flickr', false );
251 + $has_widget = (int) ! empty( $is_active_widget );
252 + set_transient( $transient, $has_widget, 1 * HOUR_IN_SECONDS );
253 + }
254 +
255 + // [DEPRECATION]: Only register widget if active widget exists already
256 + if ( $has_widget ) {
257 + register_widget( 'Jetpack_Flickr_Widget' );
258 + }
259 + }
260 + add_action( 'widgets_init', 'jetpack_register_flickr_widget' );
261 +}