PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.9.2
Jetpack – WP Security, Backup, Speed, & Growth v13.9.2
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 / rsslinks-widget.php
jetpack / modules / widgets Last commit date
authors 8 years ago contact-info 5 years ago eu-cookie-law 2 years ago facebook-likebox 11 years ago flickr 2 years ago gallery 2 years ago goodreads 2 years ago google-translate 4 years ago image-widget 8 years ago instagram 6 years ago internet-defense-league 2 years ago migrate-to-core 3 years ago milestone 2 years ago my-community 8 years ago simple-payments 2 years ago social-icons 4 years ago social-media-icons 5 years ago top-posts 8 years ago wordpress-post-widget 2 years ago authors.php 3 years ago blog-stats.php 2 years ago class-jetpack-eu-cookie-law-widget.php 2 years ago class-jetpack-instagram-widget.php 2 years ago contact-info.php 2 years ago customizer-controls.css 9 years ago customizer-utils.js 6 years ago facebook-likebox.php 2 years ago flickr.php 2 years ago gallery.php 2 years ago goodreads.php 2 years ago google-translate.php 2 years ago gravatar-profile.css 10 years ago gravatar-profile.php 2 years ago image-widget.php 3 years ago internet-defense-league.php 3 years ago mailchimp.php 3 years ago milestone.php 5 years ago my-community.php 2 years ago rsslinks-widget.php 3 years ago simple-payments.php 2 years ago social-icons.php 2 years ago social-media-icons.php 2 years ago top-posts.php 2 years ago twitter-timeline-admin.js 6 years ago twitter-timeline.php 3 years ago upcoming-events.php 2 years ago wordpress-post-widget.php 4 years ago
rsslinks-widget.php
311 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * RSS Links Widget
4 *
5 * @package automattic/jetpack
6 */
7
8 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
9
10 /**
11 * Register the widget.
12 */
13 function jetpack_rss_links_widget_init() {
14 register_widget( Jetpack_RSS_Links_Widget::class );
15 }
16 add_action( 'widgets_init', 'jetpack_rss_links_widget_init' );
17
18 /**
19 * RSS Links Widget class.
20 */
21 class Jetpack_RSS_Links_Widget extends WP_Widget {
22 /**
23 * Constructor
24 */
25 public function __construct() {
26 $widget_ops = array(
27 'classname' => 'widget_rss_links',
28 'description' => __( "Links to your blog's RSS feeds", 'jetpack' ),
29 'customize_selective_refresh' => true,
30 );
31 parent::__construct(
32 'rss_links',
33 /** This filter is documented in modules/widgets/facebook-likebox.php */
34 apply_filters( 'jetpack_widget_name', __( 'RSS Links', 'jetpack' ) ),
35 $widget_ops
36 );
37 }
38
39 /**
40 * Display the widget.
41 *
42 * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget.
43 * @param array $instance The settings for the particular instance of the widget.
44 */
45 public function widget( $args, $instance ) {
46 $instance = wp_parse_args( (array) $instance, $this->defaults() );
47
48 $before_widget = isset( $args['before_widget'] ) ? $args['before_widget'] : '';
49 $before_title = isset( $args['before_title'] ) ? $args['before_title'] : '';
50 $after_title = isset( $args['after_title'] ) ? $args['after_title'] : '';
51 $after_widget = isset( $args['after_widget'] ) ? $args['after_widget'] : '';
52
53 /** This filter is documented in core/src/wp-includes/default-widgets.php */
54 $title = apply_filters( 'widget_title', $instance['title'] );
55 echo $before_widget; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
56
57 if ( $title ) {
58 echo $before_title . $title . $after_title; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
59 }
60
61 if ( 'text' === $instance['format'] ) {
62 echo '<ul>';
63 }
64
65 if ( 'posts' === $instance['display'] ) {
66 $this->rss_link( 'posts', $instance );
67 } elseif ( 'comments' === $instance['display'] ) {
68 $this->rss_link( 'comments', $instance );
69 } elseif ( 'posts-comments' === $instance['display'] ) {
70 $this->rss_link( 'posts', $instance );
71 $this->rss_link( 'comments', $instance );
72 }
73
74 if ( 'text' === $instance['format'] ) {
75 echo '</ul>';
76 }
77
78 echo "\n" . $after_widget; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
79
80 /** This action is documented in modules/widgets/gravatar-profile.php */
81 do_action( 'jetpack_stats_extra', 'widget_view', 'rss-links' );
82 }
83
84 /**
85 * Return an associative array of default values
86 * These values are used in new widgets as well as when sanitizing input.
87 *
88 * @return array Array of default values for the Widget's options
89 */
90 public function defaults() {
91 return array(
92 'title' => '',
93 'display' => 'posts-comments',
94 'format' => 'text',
95 );
96 }
97
98 /**
99 * Sanitize widget form values as they are saved.
100 *
101 * @see WP_Widget::update()
102 *
103 * @param array $new_instance Values just sent to be saved.
104 * @param array $old_instance Previously saved values from database.
105 *
106 * @return array Updated safe values to be saved.
107 */
108 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
109 $instance = $old_instance;
110
111 $instance['title'] = wp_filter_nohtml_kses( $new_instance['title'] );
112 $instance['display'] = $new_instance['display'];
113 $instance['format'] = $new_instance['format'];
114 $instance['imagesize'] = $new_instance['imagesize'];
115 $instance['imagecolor'] = $new_instance['imagecolor'];
116
117 return $instance;
118 }
119
120 /**
121 * Back end widget form.
122 *
123 * @see WP_Widget::form()
124 *
125 * @param array $instance Previously saved values from database.
126 *
127 * @return string|void
128 */
129 public function form( $instance ) {
130 $instance = wp_parse_args( (array) $instance, $this->defaults() );
131
132 $title = stripslashes( $instance['title'] );
133 $display = $instance['display'];
134 $format = $instance['format'];
135 $image_size = isset( $instance['imagesize'] ) ? $instance['imagesize'] : 0;
136 $image_color = isset( $instance['imagecolor'] ) ? $instance['imagecolor'] : 'red';
137
138 echo '<p><label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">' . esc_html__( 'Title:', 'jetpack' ) . '
139 <input class="widefat" id="' . esc_attr( $this->get_field_id( 'title' ) ) . '" name="' . esc_attr( $this->get_field_name( 'title' ) ) . '" type="text" value="' . esc_attr( $title ) . '" />
140 </label></p>';
141
142 $displays = array(
143 'posts' => __( 'Posts', 'jetpack' ),
144 'comments' => __( 'Comments', 'jetpack' ),
145 'posts-comments' => __( 'Posts & Comments', 'jetpack' ),
146 );
147 echo '<p><label for="' . esc_attr( $this->get_field_id( 'display' ) ) . '">' . esc_html__( 'Feed(s) to Display:', 'jetpack' ) . '
148 <select class="widefat" id="' . esc_attr( $this->get_field_id( 'display' ) ) . '" name="' . esc_attr( $this->get_field_name( 'display' ) ) . '">';
149 foreach ( $displays as $display_option => $label ) {
150 echo '<option value="' . esc_attr( $display_option ) . '"';
151 if ( $display_option === $display ) {
152 echo ' selected="selected"';
153 }
154 echo '>' . esc_html( $label ) . '</option>' . "\n";
155 }
156 echo '</select></label></p>';
157
158 $formats = array(
159 'text' => __( 'Text Link', 'jetpack' ),
160 'image' => __( 'Image Link', 'jetpack' ),
161 'text-image' => __( 'Text & Image Links', 'jetpack' ),
162 );
163 echo '<p><label for="' . esc_attr( $this->get_field_id( 'format' ) ) . '">' . esc_html_x( 'Format:', 'Noun', 'jetpack' ) . '
164 <select class="widefat" id="' . esc_attr( $this->get_field_id( 'format' ) ) . '" name="' . esc_attr( $this->get_field_name( 'format' ) ) . '" onchange="if ( this.value == \'text\' ) jQuery( \'#' . esc_js( $this->get_field_id( 'image-settings' ) ) . '\' ).fadeOut(); else jQuery( \'#' . esc_js( $this->get_field_id( 'image-settings' ) ) . '\' ).fadeIn();">';
165 foreach ( $formats as $format_option => $label ) {
166 echo '<option value="' . esc_attr( $format_option ) . '"';
167 if ( $format_option === $format ) {
168 echo ' selected="selected"';
169 }
170 echo '>' . esc_html( $label ) . '</option>' . "\n";
171 }
172 echo '</select></label></p>';
173
174 echo '<div id="' . esc_attr( $this->get_field_id( 'image-settings' ) ) . '"';
175 if ( 'text' === $format ) {
176 echo ' style="display: none;"';
177 }
178 echo '><h3>' . esc_html__( 'Image Settings:', 'jetpack' ) . '</h3>';
179
180 $sizes = array(
181 'small' => __( 'Small', 'jetpack' ),
182 'medium' => __( 'Medium', 'jetpack' ),
183 'large' => __( 'Large', 'jetpack' ),
184 );
185 echo '<p><label for="' . esc_attr( $this->get_field_id( 'imagesize' ) ) . '">' . esc_html__( 'Image Size:', 'jetpack' ) . '
186 <select class="widefat" id="' . esc_attr( $this->get_field_id( 'imagesize' ) ) . '" name="' . esc_attr( $this->get_field_name( 'imagesize' ) ) . '">';
187 foreach ( $sizes as $size => $label ) {
188 echo '<option value="' . esc_attr( $size ) . '"';
189 if ( $size === $image_size ) {
190 echo ' selected="selected"';
191 }
192 echo '>' . esc_html( $label ) . '</option>' . "\n";
193 }
194 echo '</select></label></p>';
195
196 $colors = array(
197 'red' => __( 'Red', 'jetpack' ),
198 'orange' => __( 'Orange', 'jetpack' ),
199 'green' => __( 'Green', 'jetpack' ),
200 'blue' => __( 'Blue', 'jetpack' ),
201 'purple' => __( 'Purple', 'jetpack' ),
202 'pink' => __( 'Pink', 'jetpack' ),
203 'silver' => __( 'Silver', 'jetpack' ),
204 );
205 echo '<p><label for="' . esc_attr( $this->get_field_id( 'imagecolor' ) ) . '">' . esc_html__( 'Image Color:', 'jetpack' ) . '
206 <select class="widefat" id="' . esc_attr( $this->get_field_id( 'imagecolor' ) ) . '" name="' . esc_attr( $this->get_field_name( 'imagecolor' ) ) . '">';
207 foreach ( $colors as $color => $label ) {
208 echo '<option value="' . esc_attr( $color ) . '"';
209 if ( $color === $image_color ) {
210 echo ' selected="selected"';
211 }
212 echo '>' . esc_html( $label ) . '</option>' . "\n";
213 }
214 echo '</select></label></p></div>';
215 }
216
217 /**
218 * Output a link with a link to the feed.
219 *
220 * @param string $type Widget type (posts or comments).
221 * @param array $args Widget arguments.
222 */
223 private function rss_link( $type, $args ) {
224 $link_text = null;
225 $rss_type = null;
226 $subscribe_to = null;
227
228 if ( 'posts' === $type ) {
229 $subscribe_to = esc_html__( 'Subscribe to posts', 'jetpack' );
230 $link_text = esc_html__( 'RSS - Posts', 'jetpack' );
231 $rss_type = 'rss2_url';
232 } elseif ( 'comments' === $type ) {
233 $subscribe_to = esc_html__( 'Subscribe to comments', 'jetpack' );
234 $link_text = esc_html__( 'RSS - Comments', 'jetpack' );
235 $rss_type = 'comments_rss2_url';
236 }
237
238 /**
239 * Filters the target link attribute for the RSS link in the RSS widget.
240 *
241 * @module widgets
242 *
243 * @since 3.4.0
244 *
245 * @param bool false Control whether the link should open in a new tab. Default to false.
246 */
247 if ( apply_filters( 'jetpack_rsslinks_widget_target_blank', false ) ) {
248 $link_target = '_blank';
249 } else {
250 $link_target = '_self';
251 }
252
253 $link_contents = null;
254 $format = $args['format'];
255 if ( 'image' === $format ) {
256 $link_contents = $this->get_image_tag( $args );
257 } elseif ( 'text-image' === $format ) {
258 $link_contents = sprintf(
259 '%1$s&nbsp;%2$s',
260 $this->get_image_tag( $args ),
261 $link_text
262 );
263 } elseif ( 'text' === $format ) {
264 $link_contents = $link_text;
265 }
266
267 printf(
268 '%1$s<a target="%3$s" href="%4$s" title="%5$s">%6$s</a>%2$s',
269 'text' === $format ? '<li>' : '<p>', // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
270 'text' === $format ? '</li>' : '</p>', // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
271 esc_attr( $link_target ),
272 esc_url( get_bloginfo( $rss_type ) ),
273 esc_attr( $subscribe_to ),
274 $link_contents // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- we are escaping this above.
275 );
276 }
277
278 /**
279 * Return an image tag for the RSS icon.
280 *
281 * @param array $args Widget arguments.
282 */
283 private function get_image_tag( $args ) {
284 $image_path = sprintf(
285 'images/rss/%1$s-%2$s.png',
286 $args['imagecolor'],
287 $args['imagesize']
288 );
289
290 /**
291 * Filters the image used as RSS icon in the RSS widget.
292 *
293 * @module widgets
294 *
295 * @since 3.6.0
296 *
297 * @param string $var URL of RSS Widget icon.
298 */
299 $image = apply_filters(
300 'jetpack_rss_widget_icon',
301 plugins_url( $image_path, dirname( __DIR__ ) )
302 );
303
304 return sprintf(
305 '<img src="%1$s" alt="%2$s" />',
306 esc_url( $image ),
307 esc_attr__( 'RSS feed', 'jetpack' )
308 );
309 }
310 } // Class Jetpack_RSS_Links_Widget
311