PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
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 / social-icons.php
jetpack / modules / widgets Last commit date
authors 7 months ago contact-info 7 months ago eu-cookie-law 7 months ago facebook-likebox 11 years ago flickr 7 months ago gallery 7 months ago goodreads 7 months ago google-translate 1 year ago image-widget 7 months ago instagram 4 months ago internet-defense-league 1 year ago milestone 4 months ago my-community 7 months ago social-icons 4 months ago social-media-icons 7 months ago top-posts 7 months ago wordpress-post-widget 1 week ago authors.php 7 months ago blog-stats.php 7 months ago class-jetpack-eu-cookie-law-widget.php 1 month ago class-jetpack-instagram-widget.php 6 months ago contact-info.php 1 month ago customizer-controls.css 7 months ago customizer-utils.js 1 year ago facebook-likebox.php 1 month ago flickr.php 7 months ago gallery.php 1 month ago goodreads.php 1 month ago google-translate.php 1 month ago gravatar-profile.css 7 months ago gravatar-profile.php 1 month ago image-widget.php 7 months ago internet-defense-league.php 7 months ago mailchimp.php 7 months ago milestone.php 7 months ago my-community.php 1 month ago rsslinks-widget.php 1 week ago simple-payments.php 7 months ago social-icons.php 1 month ago social-media-icons.php 7 months ago top-posts.php 1 month ago twitter-timeline-admin.js 1 year ago twitter-timeline.php 1 week ago upcoming-events.php 7 months ago wordpress-post-widget.php 7 months ago
social-icons.php
819 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit( 0 );
5 }
6
7 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
8
9 /**
10 * Social Icons Widget.
11 */
12 class Jetpack_Widget_Social_Icons extends WP_Widget {
13
14 const ID_BASE = 'jetpack_widget_social_icons';
15
16 /**
17 * Default widget options.
18 *
19 * @var array Default widget options.
20 */
21 protected $defaults;
22
23 /**
24 * Widget constructor.
25 */
26 public function __construct() {
27 global $pagenow;
28
29 $widget_ops = array(
30 'classname' => 'jetpack_widget_social_icons',
31 'description' => __( 'Add social-media icons to your site.', 'jetpack' ),
32 'show_instance_in_rest' => true,
33 'customize_selective_refresh' => true,
34 );
35
36 parent::__construct(
37 'jetpack_widget_social_icons',
38 /** This filter is documented in modules/widgets/facebook-likebox.php */
39 apply_filters( 'jetpack_widget_name', __( 'Social Icons', 'jetpack' ) ),
40 $widget_ops
41 );
42
43 $this->defaults = array(
44 'title' => __( 'Follow Us', 'jetpack' ),
45 'icon-size' => 'medium',
46 'new-tab' => false,
47 'icons' => array(
48 array(
49 'url' => '',
50 ),
51 ),
52 );
53
54 // Enqueue admin scrips and styles, only in the customizer or the old widgets page.
55 if ( is_customize_preview() || 'widgets.php' === $pagenow ) {
56 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) );
57 add_action( 'admin_print_footer_scripts', array( $this, 'render_admin_js' ) );
58 }
59
60 add_filter( 'widget_types_to_hide_from_legacy_widget_block', array( $this, 'hide_widget_in_block_editor' ) );
61 }
62
63 /**
64 * Remove the "Social Icons" widget from the Legacy Widget block
65 *
66 * @param array $widget_types List of widgets that are currently removed from the Legacy Widget block.
67 * @return array $widget_types New list of widgets that will be removed.
68 */
69 public function hide_widget_in_block_editor( $widget_types ) {
70 $widget_types[] = self::ID_BASE;
71 return $widget_types;
72 }
73
74 /**
75 * Script & styles for admin widget form.
76 */
77 public function enqueue_admin_scripts() {
78 wp_enqueue_script(
79 'jetpack-widget-social-icons-script',
80 plugins_url( 'social-icons/social-icons-admin.js', __FILE__ ),
81 array( 'jquery', 'jquery-ui-sortable' ),
82 '20170506',
83 true
84 );
85 wp_enqueue_style(
86 'jetpack-widget-social-icons-admin',
87 plugins_url( 'social-icons/social-icons-admin.css', __FILE__ ),
88 array(),
89 '20170506'
90 );
91 }
92
93 /**
94 * Styles for front-end widget.
95 */
96 public function enqueue_icon_scripts() {
97 wp_enqueue_style( 'jetpack-widget-social-icons-styles', plugins_url( 'social-icons/social-icons.css', __FILE__ ), array(), '20170506' );
98 }
99
100 /**
101 * JavaScript for admin widget form.
102 */
103 public function render_admin_js() {
104 ?>
105 <script type="text/html" id="tmpl-jetpack-widget-social-icons-template">
106 <?php self::render_icons_template(); ?>
107 </script>
108 <?php
109 }
110
111 /**
112 * Add SVG definitions to the footer.
113 */
114 public function include_svg_icons() {
115 // Define SVG sprite file in Jetpack.
116 $svg_icons = dirname( __DIR__ ) . '/theme-tools/social-menu/social-menu.svg';
117 $svg_icons = class_exists( 'Automattic\Jetpack\Classic_Theme_Helper\Main' ) ? JETPACK__PLUGIN_DIR . 'jetpack_vendor/automattic/jetpack-classic-theme-helper/src/social-menu/social-menu.svg' : dirname( __DIR__ ) . '/theme-tools/social-menu/social-menu.svg';
118 // Define SVG sprite file in WPCOM.
119 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
120 $svg_icons = class_exists( 'Automattic\Jetpack\Classic_Theme_Helper\Main' ) ? JETPACK__PLUGIN_DIR . 'jetpack_vendor/automattic/jetpack-classic-theme-helper/src/social-menu/social-menu.svg' : dirname( __DIR__ ) . '/social-menu/social-menu.svg';
121 }
122
123 // If it exists, include it.
124 if ( is_file( $svg_icons ) ) {
125 $svg_contents = file_get_contents( $svg_icons ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Only reading a local file.
126 }
127
128 if ( ! empty( $svg_contents ) ) {
129 $allowed_tags = array(
130 'svg' => array(
131 'style' => true,
132 'version' => true,
133 'xmlns' => true,
134 'xmlns:xlink' => true,
135 ),
136 'defs' => array(),
137 'symbol' => array(
138 'id' => true,
139 'viewbox' => true,
140 ),
141 'path' => array(
142 'd' => true,
143 'style' => true,
144 ),
145 );
146 echo wp_kses( $svg_contents, $allowed_tags );
147 }
148 }
149
150 /**
151 * Front-end display of widget.
152 *
153 * @see WP_Widget::widget()
154 *
155 * @param array $args Widget arguments.
156 * @param array $instance Saved values from database.
157 */
158 public function widget( $args, $instance ) {
159 $instance = wp_parse_args( $instance, $this->defaults );
160
161 // Enqueue front end assets.
162 $this->enqueue_icon_scripts();
163 add_action( 'wp_footer', array( $this, 'include_svg_icons' ), 9999 );
164
165 /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
166 $title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
167
168 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
169
170 if ( ! empty( $title ) ) {
171 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
172 }
173
174 if ( ! empty( $instance['icons'] ) ) :
175
176 // Get supported social icons.
177 $social_icons = $this->get_supported_icons();
178 $default_icon = $this->get_svg_icon( array( 'icon' => 'chain' ) );
179
180 ?>
181
182 <ul class="jetpack-social-widget-list size-<?php echo esc_attr( $instance['icon-size'] ); ?>">
183
184 <?php foreach ( $instance['icons'] as $icon ) : ?>
185
186 <?php if ( ! empty( $icon['url'] ) ) : ?>
187 <li class="jetpack-social-widget-item">
188 <?php
189 printf(
190 '<a href="%1$s" %2$s>',
191 esc_url( $icon['url'], array( 'http', 'https', 'mailto', 'sms' ) ),
192 true === $instance['new-tab'] ?
193 'target="_blank" rel="noopener noreferrer"' :
194 'target="_self"'
195 );
196
197 $found_icon = false;
198
199 foreach ( $social_icons as $social_icon ) {
200 foreach ( $social_icon['url'] as $url_fragment ) {
201 /*
202 * url_fragment can be a URL host, or a regex, starting with #.
203 * Let's check for both scenarios.
204 */
205 if (
206 // First Regex.
207 (
208 str_starts_with( $url_fragment, '#' ) && str_ends_with( $url_fragment, '#' )
209 && preg_match( $url_fragment, $icon['url'] )
210 )
211 // Then, regular host name.
212 || str_contains( $icon['url'], $url_fragment )
213 ) {
214 printf(
215 '<span class="screen-reader-text">%1$s</span>%2$s',
216 esc_attr( $social_icon['label'] ),
217 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
218 $this->get_svg_icon(
219 array(
220 'icon' => esc_attr( $social_icon['icon'] ),
221 )
222 )
223 );
224 $found_icon = true;
225 break 2;
226 }
227 }
228 }
229
230 if ( ! $found_icon ) {
231 echo $default_icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
232 }
233 ?>
234 </a>
235 </li>
236 <?php endif; ?>
237
238 <?php endforeach; ?>
239
240 </ul>
241
242 <?php
243 endif;
244
245 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
246
247 /** This action is documented in modules/widgets/gravatar-profile.php */
248 do_action( 'jetpack_stats_extra', 'widget_view', 'social_icons' );
249 }
250
251 /**
252 * Sanitize widget form values as they are saved.
253 *
254 * @see WP_Widget::update()
255 *
256 * @param array $new_instance Values just sent to be saved.
257 * @param array $old_instance Previously saved values from database.
258 *
259 * @return array Updated safe values to be saved.
260 */
261 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
262 $instance = array();
263
264 $instance['title'] = sanitize_text_field( $new_instance['title'] );
265 $instance['icon-size'] = $this->defaults['icon-size'];
266 $instance['url-icons'] = array_key_exists( 'url-icons', $new_instance ) ? $new_instance['url-icons'] : array();
267
268 if ( in_array( $new_instance['icon-size'], array( 'small', 'medium', 'large' ), true ) ) {
269 $instance['icon-size'] = $new_instance['icon-size'];
270 }
271
272 $instance['new-tab'] = isset( $new_instance['new-tab'] ) ? (bool) $new_instance['new-tab'] : false;
273 $instance['icons'] = array();
274
275 if ( array_key_exists( 'url-icons', $new_instance ) ) {
276 foreach ( $new_instance['url-icons'] as $url ) {
277 $url = filter_var( $url, FILTER_SANITIZE_URL );
278
279 if ( ! empty( $url ) ) {
280 $instance['icons'][] = array(
281 'url' => $url,
282 );
283 }
284 }
285 }
286
287 return $instance;
288 }
289
290 /**
291 * Back-end widget form.
292 *
293 * @see WP_Widget::form()
294 *
295 * @param array $instance Previously saved values from database.
296 *
297 * @return string|void
298 */
299 public function form( $instance ) {
300 $instance = wp_parse_args( $instance, $this->defaults );
301 $title = sanitize_text_field( $instance['title'] );
302 $sizes = array(
303 'small' => __( 'Small', 'jetpack' ),
304 'medium' => __( 'Medium', 'jetpack' ),
305 'large' => __( 'Large', 'jetpack' ),
306 );
307 $new_tab = isset( $instance['new-tab'] ) ? (bool) $instance['new-tab'] : false;
308 ?>
309
310 <p>
311 <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'jetpack' ); ?></label>
312 <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
313 </p>
314
315 <p>
316 <label for="<?php echo esc_attr( $this->get_field_id( 'icon-size' ) ); ?>"><?php esc_html_e( 'Size:', 'jetpack' ); ?></label>
317 <select class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'icon-size' ) ); ?>">
318 <?php foreach ( $sizes as $value => $label ) : ?>
319 <option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $instance['icon-size'] ); ?>><?php echo esc_attr( $label ); ?></option>
320 <?php endforeach; ?>
321 </select>
322 </p>
323
324 <div class="jetpack-social-icons-widget-list"
325 data-url-icon-id="<?php echo esc_attr( $this->get_field_id( 'url-icons' ) ); ?>"
326 data-url-icon-name="<?php echo esc_attr( $this->get_field_name( 'url-icons' ) ); ?>"
327 >
328
329 <?php
330 foreach ( $instance['icons'] as $icon ) {
331 self::render_icons_template(
332 array(
333 'url-icon-id' => $this->get_field_id( 'url-icons' ),
334 'url-icon-name' => $this->get_field_name( 'url-icons' ),
335 'url-value' => $icon['url'],
336 )
337 );
338 }
339 ?>
340
341 </div>
342
343 <p class="jetpack-social-icons-widget add-button">
344 <button type="button" class="button jetpack-social-icons-add-button">
345 <?php esc_html_e( 'Add an icon', 'jetpack' ); ?>
346 </button>
347 </p>
348
349 <?php
350 $lang = strtolower( substr( get_locale(), 0, 2 ) );
351 switch ( $lang ) {
352 case 'es':
353 $support = 'https://wordpress.com/es/support/wordpress-editor/blocks/social-icons-block/display-social-profiles/#iconos-sociales-compatibles';
354 break;
355
356 case 'pt':
357 $support = 'https://wordpress.com/pt-br/support/exibir-perfis-de-redes-sociais/#icones-de-redes-sociais-compativeis';
358 break;
359
360 default:
361 $support = 'https://wordpress.com/support/wordpress-editor/blocks/social-icons-block/display-social-profiles/#supported-social-icons';
362 break;
363 }
364 ?>
365
366 <p>
367 <em><a href="<?php echo esc_url( $support ); ?>" target="_blank" rel="noopener noreferrer">
368 <?php esc_html_e( 'View available icons', 'jetpack' ); ?>
369 </a></em>
370 </p>
371
372 <p>
373 <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id( 'new-tab' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'new-tab' ) ); ?>" <?php checked( $new_tab ); ?> />
374 <label for="<?php echo esc_attr( $this->get_field_id( 'new-tab' ) ); ?>"><?php esc_html_e( 'Open link in a new tab', 'jetpack' ); ?></label>
375 </p>
376
377 <?php
378 }
379
380 /**
381 * Generates template to add icons.
382 *
383 * @param array $args Template arguments.
384 */
385 private static function render_icons_template( $args = array() ) {
386 $defaults = array(
387 'url-icon-id' => '',
388 'url-icon-name' => '',
389 'url-value' => '',
390 );
391
392 $args = wp_parse_args( $args, $defaults );
393 ?>
394
395 <div class="jetpack-social-icons-widget-item">
396 <div class="jetpack-social-icons-widget-item-wrapper">
397 <div class="handle"></div>
398
399 <p class="jetpack-widget-social-icons-url">
400 <?php
401 printf(
402 '<input class="widefat" id="%1$s" name="%2$s[]" type="text" placeholder="%3$s" value="%4$s"/>',
403 esc_attr( $args['url-icon-id'] ),
404 esc_attr( $args['url-icon-name'] ),
405 esc_attr__( 'Account URL', 'jetpack' ),
406 esc_url( $args['url-value'], array( 'http', 'https', 'mailto', 'sms' ) )
407 );
408 ?>
409 </p>
410
411 <p class="jetpack-widget-social-icons-remove-item">
412 <a class="jetpack-widget-social-icons-remove-item-button" href="javascript:;">
413 <?php esc_html_e( 'Remove', 'jetpack' ); ?>
414 </a>
415 </p>
416 </div>
417 </div>
418
419 <?php
420 }
421
422 /**
423 * Return SVG markup.
424 *
425 * @param array $args {
426 * Parameters needed to display an SVG.
427 *
428 * @type string $icon Required SVG icon filename.
429 * }
430 * @return string SVG markup.
431 */
432 public function get_svg_icon( $args = array() ) {
433 // Make sure $args are an array.
434 if ( empty( $args ) ) {
435 return esc_html__( 'Please define default parameters in the form of an array.', 'jetpack' );
436 }
437
438 // Set defaults.
439 $defaults = array(
440 'icon' => '',
441 );
442
443 // Parse args.
444 $args = wp_parse_args( $args, $defaults );
445
446 // Define an icon.
447 if ( ! array_key_exists( 'icon', $args ) ) {
448 return esc_html__( 'Please define an SVG icon filename.', 'jetpack' );
449 }
450
451 // Set aria hidden.
452 $aria_hidden = ' aria-hidden="true"';
453
454 // Begin SVG markup.
455 $svg = '<svg class="icon icon-' . esc_attr( $args['icon'] ) . '"' . $aria_hidden . ' role="presentation">';
456
457 /*
458 * Display the icon.
459 *
460 * The whitespace around `<use>` is intentional - it is a work around to a keyboard navigation bug in Safari 10.
461 *
462 * See https://core.trac.wordpress.org/ticket/38387.
463 */
464 $svg .= ' <use href="#icon-' . esc_html( $args['icon'] ) . '" xlink:href="#icon-' . esc_html( $args['icon'] ) . '"></use> ';
465
466 $svg .= '</svg>';
467
468 return $svg;
469 }
470
471 /**
472 * Returns an array of supported social links (URL, icon, and label).
473 *
474 * @return array $social_links_icons
475 */
476 public function get_supported_icons() {
477 $social_links_icons = array(
478 array(
479 'url' => array( '500px.com' ),
480 'icon' => '500px',
481 'label' => '500px',
482 ),
483 array(
484 'url' => array(
485 '#https?:\/\/(www\.)?amazon\.(com|cn|in|fr|de|it|nl|es|co|ca)\/#',
486 ),
487 'icon' => 'amazon',
488 'label' => 'Amazon',
489 ),
490 array(
491 'url' => array( 'apple.com' ),
492 'icon' => 'apple',
493 'label' => 'Apple',
494 ),
495 array(
496 'url' => array( 'itunes.com' ),
497 'icon' => 'apple',
498 'label' => 'iTunes',
499 ),
500 array(
501 'url' => array( 'bandcamp.com' ),
502 'icon' => 'bandcamp',
503 'label' => 'Bandcamp',
504 ),
505 array(
506 'url' => array( 'behance.net' ),
507 'icon' => 'behance',
508 'label' => 'Behance',
509 ),
510 array(
511 'url' => array(
512 'blogger.com',
513 'blogspot.com',
514 ),
515 'icon' => 'blogger',
516 'label' => 'Blogger',
517 ),
518 array(
519 'url' => array( 'bsky.app' ),
520 'icon' => 'bluesky',
521 'label' => 'Bluesky',
522 ),
523 array(
524 'url' => array( 'codepen.io' ),
525 'icon' => 'codepen',
526 'label' => 'CodePen',
527 ),
528 array(
529 'url' => array( 'deviantart.com' ),
530 'icon' => 'deviantart',
531 'label' => 'DeviantArt',
532 ),
533 array(
534 'url' => array( 'digg.com' ),
535 'icon' => 'digg',
536 'label' => 'Digg',
537 ),
538 array(
539 'url' => array( '#discord\.gg|discordapp\.com#' ),
540 'icon' => 'discord',
541 'label' => 'Discord',
542 ),
543 array(
544 'url' => array( 'dribbble.com' ),
545 'icon' => 'dribbble',
546 'label' => 'Dribbble',
547 ),
548 array(
549 'url' => array( 'dropbox.com' ),
550 'icon' => 'dropbox',
551 'label' => 'Dropbox',
552 ),
553 array(
554 'url' => array( 'etsy.com' ),
555 'icon' => 'etsy',
556 'label' => 'Etsy',
557 ),
558 array(
559 'url' => array( 'eventbrite.com' ),
560 'icon' => 'eventbrite',
561 'label' => 'Eventbrite',
562 ),
563 array(
564 'url' => array( 'facebook.com' ),
565 'icon' => 'facebook',
566 'label' => 'Facebook',
567 ),
568 array(
569 'url' => array( 'flickr.com' ),
570 'icon' => 'flickr',
571 'label' => 'Flickr',
572 ),
573 array(
574 'url' => array( 'foursquare.com' ),
575 'icon' => 'foursquare',
576 'label' => 'Foursquare',
577 ),
578 array(
579 'url' => array( 'ghost.org' ),
580 'icon' => 'ghost',
581 'label' => 'Ghost',
582 ),
583 array(
584 'url' => array( 'goodreads.com' ),
585 'icon' => 'goodreads',
586 'label' => 'Goodreads',
587 ),
588 array(
589 'url' => array( '#google\.(com|co\.uk|ca|cn|it)#' ),
590 'icon' => 'google',
591 'label' => 'Google',
592 ),
593 array(
594 'url' => array( 'github.com' ),
595 'icon' => 'github',
596 'label' => 'GitHub',
597 ),
598 array(
599 'url' => array( 'instagram.com' ),
600 'icon' => 'instagram',
601 'label' => 'Instagram',
602 ),
603 array(
604 'url' => array( 'linkedin.com' ),
605 'icon' => 'linkedin',
606 'label' => 'LinkedIn',
607 ),
608 array(
609 'url' => array( 'mailto:' ),
610 'icon' => 'mail',
611 'label' => __( 'Email', 'jetpack' ),
612 ),
613 array(
614 'url' => jetpack_mastodon_get_instance_list(),
615 'icon' => 'mastodon',
616 'label' => 'Mastodon',
617 ),
618 array(
619 'url' => array( 'meetup.com' ),
620 'icon' => 'meetup',
621 'label' => 'Meetup',
622 ),
623 array(
624 'url' => array( 'medium.com' ),
625 'icon' => 'medium',
626 'label' => 'Medium',
627 ),
628 array(
629 'url' => array( 'nextdoor.com' ),
630 'icon' => 'nextdoor',
631 'label' => 'Nextdoor',
632 ),
633 array(
634 'url' => array( 'patreon.com' ),
635 'icon' => 'patreon',
636 'label' => 'Patreon',
637 ),
638 array(
639 'url' => array( 'pinterest.' ),
640 'icon' => 'pinterest',
641 'label' => 'Pinterest',
642 ),
643 array(
644 'url' => array( 'ravelry.com' ),
645 'icon' => 'ravelry',
646 'label' => 'Ravelry',
647 ),
648 array(
649 'url' => array( 'reddit.com' ),
650 'icon' => 'reddit',
651 'label' => 'Reddit',
652 ),
653 array(
654 'url' => array( 'slideshare.net' ),
655 'icon' => 'slideshare',
656 'label' => 'SlideShare',
657 ),
658 array(
659 'url' => array( 'sms:' ),
660 'icon' => 'sms',
661 'label' => 'SMS',
662 ),
663 array(
664 'url' => array( 'snapchat.com' ),
665 'icon' => 'snapchat',
666 'label' => 'Snapchat',
667 ),
668 array(
669 'url' => array( 'soundcloud.com' ),
670 'icon' => 'soundcloud',
671 'label' => 'SoundCloud',
672 ),
673 array(
674 'url' => array( 'spotify.com' ),
675 'icon' => 'spotify',
676 'label' => 'Spotify',
677 ),
678 array(
679 'url' => array( 'stackoverflow.com' ),
680 'icon' => 'stackoverflow',
681 'label' => 'Stack Overflow',
682 ),
683 array(
684 'url' => array( 'strava.com' ),
685 'icon' => 'strava',
686 'label' => 'Strava',
687 ),
688 array(
689 'url' => array( 'stumbleupon.com' ),
690 'icon' => 'stumbleupon',
691 'label' => 'StumbleUpon',
692 ),
693 array(
694 'url' => array( '#https?:\/\/(www\.)?(telegram|t)\.me#' ),
695 'icon' => 'telegram',
696 'label' => 'Telegram',
697 ),
698 array(
699 'url' => array( 'threads.net' ),
700 'icon' => 'threads',
701 'label' => 'Threads',
702 ),
703 array(
704 'url' => array( 'tiktok.com' ),
705 'icon' => 'tiktok',
706 'label' => 'TikTok',
707 ),
708 array(
709 'url' => array( 'tumblr.com' ),
710 'icon' => 'tumblr',
711 'label' => 'Tumblr',
712 ),
713 array(
714 'url' => array( 'twitch.tv' ),
715 'icon' => 'twitch',
716 'label' => 'Twitch',
717 ),
718 array(
719 'url' => array( 'vimeo.com' ),
720 'icon' => 'vimeo',
721 'label' => 'Vimeo',
722 ),
723 array(
724 'url' => array( 'vk.com' ),
725 'icon' => 'vk',
726 'label' => 'VK',
727 ),
728 array(
729 'url' => array( 'whatsapp.com' ),
730 'icon' => 'whatsapp',
731 'label' => 'WhatsApp',
732 ),
733 array(
734 'url' => array( 'woocommerce.com' ),
735 'icon' => 'woocommerce',
736 'label' => 'WooCommerce',
737 ),
738 array(
739 'url' => array( '#wordpress\.(com|org)#' ),
740 'icon' => 'wordpress',
741 'label' => 'WordPress',
742 ),
743 array(
744 'url' => array( 'yelp.com' ),
745 'icon' => 'yelp',
746 'label' => 'Yelp',
747 ),
748 array(
749 'url' => array( '#^https?:\/\/(www\.)?(twitter|x)\.com#' ),
750 'icon' => 'x',
751 'label' => 'X',
752 ),
753 array(
754 'url' => array( 'xanga.com' ),
755 'icon' => 'xanga',
756 'label' => 'Xanga',
757 ),
758 array(
759 'url' => array( 'youtube.com' ),
760 'icon' => 'youtube',
761 'label' => 'YouTube',
762 ),
763
764 // keep feed at the end so that more specific icons can take precedence.
765 array(
766 'url' => array(
767 '/feed/', // WordPress default feed url.
768 '/feeds/', // Blogspot and others.
769 '/blog/feed', // No trailing slash WordPress feed, could use /feed but may match unexpectedly.
770 'format=RSS', // Squarespace and others.
771 '/rss', // Tumblr.
772 '/.rss', // Reddit.
773 '/rss.xml', // Moveable Type, Typepad.
774 'http://rss.', // Old custom format.
775 'https://rss.', // Old custom format.
776 'rss=1',
777 '/feed=rss', // Catches feed=rss / feed=rss2.
778 '?feed=rss', // WordPress non-permalink - Catches feed=rss / feed=rss2.
779 '?feed=rdf', // WordPress non-permalink.
780 '?feed=atom', // WordPress non-permalink.
781 'http://feeds.', // FeedBurner.
782 'https://feeds.', // FeedBurner.
783 '/feed.xml', // Feedburner Alias, and others.
784 '/index.xml', // Moveable Type, and others.
785 '/atom.xml', // Typepad, Squarespace.
786 '.atom', // Shopify blog.
787 '/atom', // Some non-WordPress feeds.
788 'index.rdf', // Typepad.
789 ),
790 'icon' => 'feed',
791 'label' => __( 'RSS Feed', 'jetpack' ),
792 ),
793 );
794
795 /**
796 * Filter the list of services matching Social Media Icons available in the Social Icons SVG sprite.
797 *
798 * @since 12.3
799 *
800 * @param array $social_links_icons Array of social links icons.
801 */
802 return apply_filters(
803 'jetpack_social_icons_supported_icons',
804 $social_links_icons
805 );
806 }
807 } // Jetpack_Widget_Social_Icons
808
809 /**
810 * Register and load the widget.
811 *
812 * @access public
813 * @return void
814 */
815 function jetpack_widget_social_icons_load() {
816 register_widget( 'Jetpack_Widget_Social_Icons' );
817 }
818 add_action( 'widgets_init', 'jetpack_widget_social_icons_load' );
819