Completed
Push — update/conversation-dialogue-h... ( ee9834...6c384a )
by
unknown
97:35 queued 83:39
created

Sharing_Source::js_dialog()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 55

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 2
dl 0
loc 55
rs 8.9818
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
use Automattic\Jetpack\Device_Detection\User_Agent_Info;
4
5
abstract class Sharing_Source {
6
	public	  $button_style;
7
	public	  $smart;
8
	protected $open_link_in_new;
9
	protected $id;
10
11
	public function __construct( $id, array $settings ) {
12
		$this->id = $id;
13
		/**
14
		 * Filter the way sharing links open.
15
		 *
16
		 * By default, sharing links open in a new window.
17
		 *
18
		 * @module sharedaddy
19
		 *
20
		 * @since 3.4.0
21
		 *
22
		 * @param bool true Should Sharing links open in a new window. Default to true.
23
		 */
24
		$this->open_link_in_new = apply_filters( 'jetpack_open_sharing_in_new_window', true );
25
26
		if ( isset( $settings['button_style'] ) ) {
27
			$this->button_style = $settings['button_style'];
28
		}
29
30
		if ( isset( $settings['smart'] ) ) {
31
			$this->smart = $settings['smart'];
32
		}
33
	}
34
35
	public function is_deprecated() {
36
		return false;
37
	}
38
39
	public function http() {
40
		return is_ssl() ? 'https' : 'http';
41
	}
42
43
	public function get_id() {
44
		return $this->id;
45
	}
46
47
	public function get_class() {
48
		return $this->id;
49
	}
50
51
	public function get_share_url( $post_id ) {
52
		/**
53
		 * Filter the sharing permalink.
54
		 *
55
		 * @module sharedaddy
56
		 *
57
		 * @since 1.2.0
58
		 *
59
		 * @param string get_permalink( $post_id ) Post Permalink.
60
		 * @param int $post_id Post ID.
61
		 * @param int $this->id Sharing ID.
62
		 */
63
		return apply_filters( 'sharing_permalink', get_permalink( $post_id ), $post_id, $this->id );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post_id.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
64
	}
65
66
	public function get_share_title( $post_id ) {
67
		$post = get_post( $post_id );
68
		/**
69
		 * Filter the sharing title.
70
		 *
71
		 * @module sharedaddy
72
		 *
73
		 * @since 2.8.0
74
		 *
75
		 * @param string $post->post_title Post Title.
76
		 * @param int $post_id Post ID.
77
		 * @param int $this->id Sharing ID.
78
		 */
79
		$title = apply_filters( 'sharing_title', $post->post_title, $post_id, $this->id );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post_id.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
80
81
		return html_entity_decode( wp_kses( $title, null ) );
82
	}
83
84
	public function has_custom_button_style() {
85
		return false;
86
	}
87
88
	public function get_link( $url, $text, $title, $query = '', $id = false ) {
89
		$args = func_get_args();
90
		$klasses = array( 'share-' . $this->get_class(), 'sd-button' );
91
92
		if ( 'icon' == $this->button_style || 'icon-text' == $this->button_style ) {
93
			$klasses[] = 'share-icon';
94
		}
95
96
		if ( 'icon' == $this->button_style ) {
97
			$text = $title;
98
			$klasses[] = 'no-text';
99
100
			if ( true == $this->open_link_in_new ) {
101
				$text .= __( ' (Opens in new window)', 'jetpack' );
102
			}
103
		}
104
105
		/**
106
		 * Filter the sharing display ID.
107
		 *
108
		 * @module sharedaddy
109
		 *
110
		 * @since 3.4.0
111
		 *
112
		 * @param int|false $id Sharing ID.
113
		 * @param object $this Sharing service properties.
114
		 * @param array $args Array of sharing service options.
115
		 */
116
		$id = apply_filters( 'jetpack_sharing_display_id', $id, $this, $args );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
117
		/**
118
		 * Filter the sharing display link.
119
		 *
120
		 * @module sharedaddy
121
		 *
122
		 * @since 2.8.0
123
		 *
124
		 * @param string $url Post URL.
125
		 * @param object $this Sharing service properties.
126
		 * @param int|false $id Sharing ID.
127
		 * @param array $args Array of sharing service options.
128
		 */
129
		$url = apply_filters( 'sharing_display_link', $url, $this, $id, $args ); // backwards compatibility
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
130
		/**
131
		 * Filter the sharing display link.
132
		 *
133
		 * @module sharedaddy
134
		 *
135
		 * @since 2.8.0
136
		 *
137
		 * @param string $url Post URL.
138
		 * @param object $this Sharing service properties.
139
		 * @param int|false $id Sharing ID.
140
		 * @param array $args Array of sharing service options.
141
		 */
142
		$url = apply_filters( 'jetpack_sharing_display_link', $url, $this, $id, $args );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
143
		/**
144
		 * Filter the sharing display query.
145
		 *
146
		 * @module sharedaddy
147
		 *
148
		 * @since 2.8.0
149
		 *
150
		 * @param string $query Sharing service URL parameter.
151
		 * @param object $this Sharing service properties.
152
		 * @param int|false $id Sharing ID.
153
		 * @param array $args Array of sharing service options.
154
		 */
155
		$query = apply_filters( 'jetpack_sharing_display_query', $query, $this, $id, $args );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
156
157
		if ( ! empty( $query ) ) {
158
			if ( false === stripos( $url, '?' ) ) {
159
				$url .= '?' . $query;
160
			} else {
161
				$url .= '&amp;' . $query;
162
			}
163
		}
164
165
		if ( 'text' == $this->button_style ) {
166
			$klasses[] = 'no-icon';
167
		}
168
169
		/**
170
		 * Filter the sharing display classes.
171
		 *
172
		 * @module sharedaddy
173
		 *
174
		 * @since 3.4.0
175
		 *
176
		 * @param array $klasses Sharing service classes.
177
		 * @param object $this Sharing service properties.
178
		 * @param int|false $id Sharing ID.
179
		 * @param array $args Array of sharing service options.
180
		 */
181
		$klasses = apply_filters( 'jetpack_sharing_display_classes', $klasses, $this, $id, $args );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
182
		/**
183
		 * Filter the sharing display title.
184
		 *
185
		 * @module sharedaddy
186
		 *
187
		 * @since 3.4.0
188
		 *
189
		 * @param string $title Sharing service title.
190
		 * @param object $this Sharing service properties.
191
		 * @param int|false $id Sharing ID.
192
		 * @param array $args Array of sharing service options.
193
		 */
194
		$title = apply_filters( 'jetpack_sharing_display_title', $title, $this, $id, $args );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
195
		/**
196
		 * Filter the sharing display text.
197
		 *
198
		 * @module sharedaddy
199
		 *
200
		 * @since 3.4.0
201
		 *
202
		 * @param string $text Sharing service text.
203
		 * @param object $this Sharing service properties.
204
		 * @param int|false $id Sharing ID.
205
		 * @param array $args Array of sharing service options.
206
		 */
207
		$text = apply_filters( 'jetpack_sharing_display_text', $text, $this, $id, $args );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $this.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
208
209
		return sprintf(
210
			'<a rel="nofollow%s" data-shared="%s" class="%s" href="%s"%s title="%s"><span%s>%s</span></a>',
211
			( true == $this->open_link_in_new ) ? ' noopener noreferrer' : '',
212
			( $id ? esc_attr( $id ) : '' ),
213
			implode( ' ', $klasses ),
214
			$url,
215
			( true == $this->open_link_in_new ) ? ' target="_blank"' : '',
216
			$title,
217
			( 'icon' == $this->button_style ) ? '></span><span class="sharing-screen-reader-text"' : '',
218
			$text
219
		);
220
	}
221
222
	/**
223
	 * Get an unfiltered post permalink to use when generating a sharing URL with get_link.
224
	 * Use instead of get_share_url for non-official styles as get_permalink ensures that process_request
225
	 * will be executed more reliably, in the case that the filtered URL uses a service that strips query parameters.
226
	 *
227
	 * @since 3.7.0
228
	 * @param int $post_id Post ID.
229
	 * @uses get_permalink
230
	 * @return string get_permalink( $post_id ) Post permalink.
231
	 */
232
	public function get_process_request_url( $post_id ) {
233
		return get_permalink( $post_id );
234
	}
235
236
	abstract public function get_name();
237
	abstract public function get_display( $post );
238
239
	public function display_header() {
240
	}
241
242
	public function display_footer() {
243
	}
244
245
	public function has_advanced_options() {
246
		return false;
247
	}
248
249
	/**
250
	 * Get the AMP specific markup for a sharing button.
251
	 *
252
	 * @param \WP_Post $post The current post being viewed.
253
	 */
254
	public function get_amp_display( $post ) {
255
		// Only display markup if we're on a post.
256
		if ( empty( $post ) ) {
257
			return false;
258
		}
259
260
		return $this->build_amp_markup();
261
	}
262
263
	/**
264
	 * Generates and returns the markup for an AMP sharing button.
265
	 *
266
	 * @param array $attrs Custom attributes for rendering the social icon.
267
	 */
268
	protected function build_amp_markup( $attrs = array() ) {
269
270
		$title = sprintf(
271
			/* translators: placeholder is a service name, such as "Twitter" or "Facebook". */
272
			__( 'Click to share on %s', 'jetpack' ),
273
			$this->get_name()
274
		);
275
276
		$attrs        = array_merge(
277
			array(
278
				'type'       => $this->get_id(),
279
				'height'     => '32px',
280
				'width'      => '32px',
281
				'aria-label' => $title,
282
				'title'      => $title,
283
			),
284
			$attrs
285
		);
286
		$sharing_link = '<amp-social-share';
287
		foreach ( $attrs as $key => $value ) {
288
			$sharing_link .= sprintf( ' %s="%s"', sanitize_key( $key ), esc_attr( $value ) );
289
		}
290
		$sharing_link .= '></amp-social-share>';
291
		return $sharing_link;
292
	}
293
294
	public function display_preview( $echo = true, $force_smart = false, $button_style = null ) {
295
		$text = '&nbsp;';
296
		$button_style = ( ! empty( $button_style ) ) ? $button_style : $this->button_style;
297
		if ( ! $this->smart && ! $force_smart ) {
298
			if ( $button_style != 'icon' ) {
299
				$text = $this->get_name();
300
			}
301
		}
302
303
		$klasses = array( 'share-' . $this->get_class(), 'sd-button' );
304
305
		if ( $button_style == 'icon' || $button_style == 'icon-text' ) {
306
			$klasses[] = 'share-icon';
307
		}
308
309
		if ( $button_style == 'icon' ) {
310
			$klasses[] = 'no-text';
311
		}
312
313
		if ( $button_style == 'text' ) {
314
			$klasses[] = 'no-icon';
315
		}
316
317
		$is_deprecated = $this->is_deprecated();
318
319
		$link = sprintf(
320
			'<a rel="nofollow" class="%s" href="javascript:void(0)" title="%s"><span>%s</span></a>',
321
			implode( ' ', $klasses ),
322
			esc_attr(
323
				$is_deprecated
324
					/* translators: %1$s is the name of a deprecated Sharing Service like "Google+" */
325
					? sprintf( __( 'The %1$s service has shut down. This sharing button is not displayed to your visitors and should be removed.', 'jetpack' ), $this->get_name() )
326
					: $this->get_name()
327
			),
328
			esc_html(
329
				$is_deprecated
330
					/* translators: %1$s is the name of a deprecated Sharing Service like "Google+" */
331
					? sprintf( __( '%1$s has shut down', 'jetpack' ), $this->get_name() )
332
					: $text
333
			)
334
		);
335
336
		$smart = ( $this->smart || $force_smart ) ? 'on' : 'off';
337
		$return = "<div class='option option-smart-$smart'>$link</div>";
338
		if ( $echo ) {
339
			echo $return;
340
		}
341
342
		return $return;
343
	}
344
345
	public function get_total( $post = false ) {
346
		global $wpdb, $blog_id;
347
348
		$name = strtolower( $this->get_id() );
349
350
		if ( $post == false ) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
351
			// get total number of shares for service
352
			return (int) $wpdb->get_var( $wpdb->prepare( 'SELECT SUM( count ) FROM sharing_stats WHERE blog_id = %d AND share_service = %s', $blog_id, $name ) );
353
		}
354
355
		// get total shares for a post
356
		return (int) $wpdb->get_var( $wpdb->prepare( 'SELECT count FROM sharing_stats WHERE blog_id = %d AND post_id = %d AND share_service = %s', $blog_id, $post->ID, $name ) );
357
	}
358
359 View Code Duplication
	public function get_posts_total() {
360
		global $wpdb, $blog_id;
361
362
		$totals = array();
363
		$name	= strtolower( $this->get_id() );
364
365
		$my_data = $wpdb->get_results( $wpdb->prepare( 'SELECT post_id as id, SUM( count ) as total FROM sharing_stats WHERE blog_id = %d AND share_service = %s GROUP BY post_id ORDER BY count DESC ', $blog_id, $name ) );
366
367
		if ( ! empty( $my_data ) ) {
368
			foreach ( $my_data as $row ) {
369
				$totals[] = new Sharing_Post_Total( $row->id, $row->total );
370
			}
371
		}
372
373
		usort( $totals, array( 'Sharing_Post_Total', 'cmp' ) );
374
375
		return $totals;
376
	}
377
378
	public function process_request( $post, array $post_data ) {
379
		/**
380
		 * Fires when a post is shared via one of the sharing buttons.
381
		 *
382
		 * @module sharedaddy
383
		 *
384
		 * @since 1.1.0
385
		 *
386
		 * @param array $args Aray of information about the sharing service.
387
		 */
388
		do_action( 'sharing_bump_stats', array( 'service' => $this, 'post' => $post ) );
389
	}
390
391
	public function js_dialog( $name, $params = array() ) {
392
		if ( true !== $this->open_link_in_new ) {
393
			return;
394
		}
395
396
		$defaults = array(
397
			'menubar'	=> 1,
398
			'resizable' => 1,
399
			'width'		=> 600,
400
			'height'	=> 400,
401
		);
402
		$params = array_merge( $defaults, $params );
403
		$opts = array();
404
		foreach ( $params as $key => $val ) {
405
			$opts[] = "$key=$val";
406
		}
407
		$opts = implode( ',', $opts );
408
409
		// Add JS after sharing-js has been enqueued.
410
		wp_add_inline_script( 'sharing-js',
411
			"var windowOpen;
412
			( function () {
413
				function matches( el, sel ) {
414
					return !! (
415
						el.matches && el.matches( sel ) ||
416
						el.msMatchesSelector && el.msMatchesSelector( sel )
417
					);
418
				}
419
420
				document.body.addEventListener( 'click', function ( event ) {
421
					if ( ! event.target ) {
422
						return;
423
					}
424
425
					var el;
426
					if ( matches( event.target, 'a.share-$name' ) ) {
427
						el = event.target;
428
					} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-$name' ) ) {
429
						el = event.target.parentNode;
430
					}
431
432
					if ( el ) {
433
						event.preventDefault();
434
435
						// If there's another sharing window open, close it.
436
						if ( typeof windowOpen !== 'undefined' ) {
437
							windowOpen.close();
438
						}
439
						windowOpen = window.open( el.getAttribute( 'href' ), 'wpcom$name', '$opts' );
440
						return false;
441
					}
442
				} );
443
			} )();"
444
		);
445
	}
446
}
447
448
abstract class Deprecated_Sharing_Source extends Sharing_Source {
449
	public	  $button_style = 'text';
450
	public	  $smart = false;
451
	protected $open_link_in_new = false;
452
	protected $id;
453
	protected $deprecated = true;
454
455
	final public function __construct( $id, array $settings ) {
456
		$this->id = $id;
457
458
		if ( isset( $settings['button_style'] ) ) {
459
			$this->button_style = $settings['button_style'];
460
		}
461
	}
462
463
	final public function is_deprecated() {
464
		return true;
465
	}
466
467
	final public function get_share_url( $post_id ) {
468
		return get_permalink( $post_id );
469
	}
470
471
	/**
472
	 * No AMP display for deprecated sources.
473
	 *
474
	 * @param \WP_Post $post The current post being viewed.
475
	 */
476
	final public function get_amp_display( $post ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
477
		return false;
478
	}
479
480
	final public function display_preview( $echo = true, $force_smart = false, $button_style = null ) {
481
		return parent::display_preview( $echo, false, $button_style );
482
	}
483
484
	final public function get_total( $post = false ) {
485
		return 0;
486
	}
487
488
	final public function get_posts_total() {
489
		return 0;
490
	}
491
492
	final public function process_request( $post, array $post_data ) {
493
		parent::process_request( $post, $post_data );
494
	}
495
496
	final public function get_display( $post ) {
497
		if ( current_user_can( 'manage_options' ) ) {
498
			return $this->display_deprecated( $post );
499
		}
500
501
		return '';
502
	}
503
504
	public function display_deprecated( $post ) {
505
		return $this->get_link(
506
			$this->get_share_url( $post->ID ),
507
			/* translators: %1$s is the name of a deprecated Sharing Service like "Google+" */
508
			sprintf( __( '%1$s has shut down', 'jetpack' ), $this->get_name() ),
509
			/* translators: %1$s is the name of a deprecated Sharing Service like "Google+" */
510
			sprintf( __( 'The %1$s service has shut down. This sharing button is not displayed to your visitors and should be removed.', 'jetpack' ), $this->get_name() )
511
		);
512
	}
513
}
514
515
abstract class Sharing_Advanced_Source extends Sharing_Source {
516
	public function has_advanced_options() {
517
		return true;
518
	}
519
520
	abstract public function display_options();
521
	abstract public function update_options( array $data );
522
	abstract public function get_options();
523
}
524
525
class Share_Email extends Sharing_Source {
526
	public $shortname = 'email';
527
	public $icon = '\f410';
528 View Code Duplication
	public function __construct( $id, array $settings ) {
529
		parent::__construct( $id, $settings );
530
531
		if ( 'official' == $this->button_style ) {
532
			$this->smart = true;
533
		} else {
534
			$this->smart = false;
535
		}
536
	}
537
538
	public function get_name() {
539
		return _x( 'Email', 'as sharing source', 'jetpack' );
540
	}
541
542
	// Default does nothing
543
	public function process_request( $post, array $post_data ) {
544
		$ajax = false;
545
		if ( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && strtolower( $_SERVER['HTTP_X_REQUESTED_WITH'] ) == 'xmlhttprequest' ) {
546
			$ajax = true;
547
		}
548
549
		$source_email = $target_email = $source_name = false;
0 ignored issues
show
Unused Code introduced by
$source_name is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
550
551
		if ( isset( $post_data['source_email'] ) && is_email( $post_data['source_email'] ) ) {
552
			$source_email = $post_data['source_email'];
553
		}
554
555
		if ( isset( $post_data['target_email'] ) && is_email( $post_data['target_email'] ) ) {
556
			$target_email = $post_data['target_email'];
557
		}
558
559
		if ( isset( $post_data['source_name'] ) && strlen( $post_data['source_name'] ) < 200 ) {
560
			$source_name = $post_data['source_name'];
561
		} elseif ( isset( $post_data['source_name'] ) ) {
562
			$source_name = substr( $post_data['source_name'], 0, 200 );
563
		} else {
564
			$source_name = '';
565
		}
566
567
		// Test email
568
		$error = 1;	  // Failure in data
569
		if ( empty( $post_data['source_f_name'] ) && $source_email && $target_email && $source_name ) {
570
			/**
571
			 * Allow plugins to stop the email sharing button from running the shared message through Akismet.
572
			 *
573
			 * @module sharedaddy
574
			 *
575
			 * @since 1.1.0
576
			 *
577
			 * @param bool true Should we check if the message isn't spam?
578
			 * @param object $post Post information.
579
			 * @param array $post_data Information about the shared message.
580
			 */
581
			if ( apply_filters( 'sharing_email_check', true, $post, $post_data ) ) {
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
582
				$data = array(
583
					'post'           => $post,
584
					'source'         => $source_email,
585
					'target'         => $target_email,
586
					'name'           => $source_name,
587
					'sharing_source' => $this,
588
				);
589
				// todo: implement an error message when email doesn't get sent.
590
				/**
591
				 * Filter whether an email can be sent from the Email sharing button.
592
				 *
593
				 * @module sharedaddy
594
				 *
595
				 * @since 1.1.0
596
				 *
597
				 * @param array $data Array of information about the shared message.
598
				 */
599
				if ( ( $data = apply_filters( 'sharing_email_can_send', $data ) ) !== false ) {
600
					// Record stats
601
					parent::process_request( $data['post'], $post_data );
602
603
					/**
604
					 * Fires when an email is sent via the Email sharing button.
605
					 *
606
					 * @module sharedaddy
607
					 *
608
					 * @since 1.1.0
609
					 *
610
					 * @param array $data Array of information about the shared message.
611
					 */
612
					do_action( 'sharing_email_send_post', $data );
613
				}
614
615
				// Return a positive regardless of whether the user is subscribed or not
616
				if ( $ajax ) {
617
?>
618
<div class="response">
619
	<div class="response-title"><?php _e( 'This post has been shared!', 'jetpack' ); ?></div>
620
	<div class="response-sub"><?php printf( __( 'You have shared this post with %s', 'jetpack' ), esc_html( $target_email ) ); ?></div>
621
	<div class="response-close"><a href="#" class="sharing_cancel"><?php _e( 'Close', 'jetpack' ); ?></a></div>
622
</div>
623
<?php
624
				} else {
625
					wp_safe_redirect( get_permalink( $post->ID ) . '?shared=email' );
626
				}
627
628
				die();
629
			} else {
630
				$error = 2;	  // Email check failed
631
			}
632
		}
633
634
		if ( $ajax ) {
635
			echo $error;
636
		} else {
637
			wp_safe_redirect( get_permalink( $post->ID ) . '?shared=email&msg=fail' );
638
		}
639
640
		die();
641
	}
642
643
	public function get_display( $post ) {
644
		return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Email', 'share to', 'jetpack' ), __( 'Click to email this to a friend', 'jetpack' ), 'share=email' );
645
	}
646
647
	/**
648
	 * No AMP display for email.
649
	 *
650
	 * @param \WP_Post $post The current post being viewed.
651
	 */
652
	public function get_amp_display( $post ) { // phpcs:ignore
653
		return false;
654
	}
655
656
	/**
657
	 * Outputs the hidden email dialog
658
	 */
659
	public function display_footer() {
660
		global $current_user;
661
662
		$visible = $status = false;
0 ignored issues
show
Unused Code introduced by
$status is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
Unused Code introduced by
$visible is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
663
?>
664
	<div id="sharing_email" style="display: none;">
665
		<form action="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>" method="post">
666
			<label for="target_email"><?php _e( 'Send to Email Address', 'jetpack' ) ?></label>
667
			<input type="email" name="target_email" id="target_email" value="" />
668
669
			<?php if ( is_user_logged_in() ) : ?>
670
				<input type="hidden" name="source_name" value="<?php echo esc_attr( $current_user->display_name ); ?>" />
671
				<input type="hidden" name="source_email" value="<?php echo esc_attr( $current_user->user_email ); ?>" />
672
			<?php else : ?>
673
674
				<label for="source_name"><?php _e( 'Your Name', 'jetpack' ) ?></label>
675
				<input type="text" name="source_name" id="source_name" value="" />
676
677
				<label for="source_email"><?php _e( 'Your Email Address', 'jetpack' ) ?></label>
678
				<input type="email" name="source_email" id="source_email" value="" />
679
680
			<?php endif; ?>
681
			<input type="text" id="jetpack-source_f_name" name="source_f_name" class="input" value="" size="25" autocomplete="off" title="<?php esc_attr_e( 'This field is for validation and should not be changed', 'jetpack' ); ?>" />
682
			<?php
683
				/**
684
				 * Fires when the Email sharing dialog is loaded.
685
				 *
686
				 * @module sharedaddy
687
				 *
688
				 * @since 1.1.0
689
				 *
690
				 * @param string jetpack Eail sharing source.
691
				 */
692
				do_action( 'sharing_email_dialog', 'jetpack' );
693
			?>
694
695
			<img style="float: right; display: none" class="loading" src="<?php
696
			/** This filter is documented in modules/stats.php */
697
			echo apply_filters( 'jetpack_static_url', plugin_dir_url( __FILE__ ) . 'images/loading.gif' ); ?>" alt="loading" width="16" height="16" />
698
			<input type="submit" value="<?php esc_attr_e( 'Send Email', 'jetpack' ); ?>" class="sharing_send" />
699
			<a rel="nofollow" href="#cancel" class="sharing_cancel" role="button"><?php _e( 'Cancel', 'jetpack' ); ?></a>
700
701
			<div class="errors errors-1" style="display: none;">
702
				<?php _e( 'Post was not sent - check your email addresses!', 'jetpack' ); ?>
703
			</div>
704
705
			<div class="errors errors-2" style="display: none;">
706
				<?php _e( 'Email check failed, please try again', 'jetpack' ); ?>
707
			</div>
708
709
			<div class="errors errors-3" style="display: none;">
710
				<?php _e( 'Sorry, your blog cannot share posts by email.', 'jetpack' ); ?>
711
			</div>
712
		</form>
713
	</div>
714
<?php
715
	}
716
}
717
718
class Share_Twitter extends Sharing_Source {
719
	public $shortname = 'twitter';
720
	public $icon = '\f202';
721
	// 'https://dev.twitter.com/rest/reference/get/help/configuration' ( 2015/02/06 ) short_url_length is 22, short_url_length_https is 23
722
	public $short_url_length = 24;
723
724 View Code Duplication
	public function __construct( $id, array $settings ) {
725
		parent::__construct( $id, $settings );
726
727
		if ( 'official' == $this->button_style ) {
728
			$this->smart = true;
729
		} else {
730
			$this->smart = false;
731
		}
732
	}
733
734
	public function get_name() {
735
		return __( 'Twitter', 'jetpack' );
736
	}
737
738
	/**
739
	 * Determine the Twitter 'via' value for a post.
740
	 *
741
	 * @param  WP_Post|int $post Post object or post ID.
742
	 * @return string Twitter handle without the preceding @.
743
	 **/
744
	public static function sharing_twitter_via( $post ) {
745
		$post = get_post( $post );
746
		/**
747
		 * Allow third-party plugins to customize the Twitter username used as "twitter:site" Twitter Card Meta Tag.
748
		 *
749
		 * @module sharedaddy
750
		 *
751
		 * @since 3.0.0
752
		 *
753
		 * @param string $string Twitter Username.
754
		 * @param array $args Array of Open Graph Meta Tags and Twitter Cards tags.
755
		 */
756
		$twitter_site_tag_value = apply_filters(
757
			'jetpack_twitter_cards_site_tag',
758
			'',
759
			/** This action is documented in modules/sharedaddy/sharing-sources.php */
760
			array( 'twitter:creator' => apply_filters( 'jetpack_sharing_twitter_via', '', $post->ID ) )
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
Unused Code introduced by
The call to apply_filters() has too many arguments starting with array('twitter:creator' ...r_via', '', $post->ID)).

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
761
		);
762
763
		/*
764
		 * Hack to remove the unwanted behavior of adding 'via @jetpack' which
765
		 * was introduced with the adding of the Twitter cards.
766
		 * This should be a temporary solution until a better method is setup.
767
		 */
768
		if ( 'jetpack' == $twitter_site_tag_value ) {
769
			$twitter_site_tag_value = '';
770
		}
771
772
		/**
773
		 * Filters the Twitter username used as "via" in the Twitter sharing button.
774
		 *
775
		 * @module sharedaddy
776
		 *
777
		 * @since 1.7.0
778
		 *
779
		 * @param string $twitter_site_tag_value Twitter Username.
780
		 * @param int $post->ID Post ID.
781
		 */
782
		$twitter_site_tag_value = apply_filters( 'jetpack_sharing_twitter_via', $twitter_site_tag_value, $post->ID );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
783
784
		// Strip out anything other than a letter, number, or underscore.
785
		// This will prevent the inadvertent inclusion of an extra @, as well as normalizing the handle.
786
		return preg_replace( '/[^\da-z_]+/i', '', $twitter_site_tag_value );
787
	}
788
789
	/**
790
	 * Determine the 'related' Twitter accounts for a post.
791
	 *
792
	 * @param  WP_Post|int $post Post object or post ID.
793
	 * @return string Comma-separated list of Twitter handles.
794
	 **/
795
	public static function get_related_accounts( $post ) {
796
		$post = get_post( $post );
797
		/**
798
		 * Filter the list of related Twitter accounts added to the Twitter sharing button.
799
		 *
800
		 * @module sharedaddy
801
		 *
802
		 * @since 1.7.0
803
		 *
804
		 * @param array $args Array of Twitter usernames. Format is 'username' => 'Optional description'
805
		 * @param int $post->ID Post ID.
806
		 */
807
		$related_accounts = apply_filters( 'jetpack_sharing_twitter_related', array(), $post->ID );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
808
809
		// Example related string: account1,account2:Account 2 description,account3
810
		$related = array();
811
812
		foreach ( $related_accounts as $related_account_username => $related_account_description ) {
813
			// Join the description onto the end of the username
814
			if ( $related_account_description ) {
815
				$related_account_username .= ':' . $related_account_description;
816
			}
817
818
			$related[] = $related_account_username;
819
		}
820
821
		return implode( ',', $related );
822
	}
823
824
	public function get_display( $post ) {
825
		$via = $this->sharing_twitter_via( $post );
826
827
		if ( $via ) {
828
			$via = 'data-via="' . esc_attr( $via ) . '"';
829
		} else {
830
			$via = '';
831
		}
832
833
		$related = $this->get_related_accounts( $post );
834
		if ( ! empty( $related ) && $related !== $via ) {
835
			$related = 'data-related="' . esc_attr( $related ) . '"';
836
		} else {
837
			$related = '';
838
		}
839
840
		if ( $this->smart ) {
841
			$share_url = $this->get_share_url( $post->ID );
842
			$post_title = $this->get_share_title( $post->ID );
843
			return sprintf(
844
				'<a href="https://twitter.com/share" class="twitter-share-button" data-url="%1$s" data-text="%2$s" %3$s %4$s>Tweet</a>',
845
				esc_url( $share_url ),
846
				esc_attr( $post_title ),
847
				$via,
848
				$related
849
			);
850
		} else {
851
			if (
852
				/**
853
				 * Allow plugins to disable sharing counts for specific sharing services.
854
				 *
855
				 * @module sharedaddy
856
				 *
857
				 * @since 3.0.0
858
				 *
859
				 * @param bool true Should sharing counts be enabled for this specific service. Default to true.
860
				 * @param int $post->ID Post ID.
861
				 * @param string $str Sharing service name.
862
				 */
863
				apply_filters( 'jetpack_register_post_for_share_counts', true, $post->ID, 'twitter' )
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
864
			) {
865
				sharing_register_post_for_share_counts( $post->ID );
866
			}
867
			return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Twitter', 'share to', 'jetpack' ), __( 'Click to share on Twitter', 'jetpack' ), 'share=twitter', 'sharing-twitter-' . $post->ID );
868
		}
869
	}
870
871
	public function process_request( $post, array $post_data ) {
872
		$post_title = $this->get_share_title( $post->ID );
873
		$post_link = $this->get_share_url( $post->ID );
874
875
		if ( function_exists( 'mb_stripos' ) ) {
876
			$strlen = 'mb_strlen';
877
			$substr = 'mb_substr';
878
		} else {
879
			$strlen = 'strlen';
880
			$substr = 'substr';
881
		}
882
883
		$via = $this->sharing_twitter_via( $post );
884
		$related = $this->get_related_accounts( $post );
885
		if ( $via ) {
886
			$sig = " via @$via";
887
			if ( $related === $via ) {
888
				$related = false;
889
			}
890
		} else {
891
			$via = false;
892
			$sig = '';
893
		}
894
895
		$suffix_length = $this->short_url_length + $strlen( $sig );
896
		// $sig is handled by twitter in their 'via' argument.
897
		// $post_link is handled by twitter in their 'url' argument.
898
		if ( 280 < $strlen( $post_title ) + $suffix_length ) {
899
			// The -1 is for "\xE2\x80\xA6", a UTF-8 ellipsis.
900
			$text = $substr( $post_title, 0, 280 - $suffix_length - 1 ) . "\xE2\x80\xA6";
901
		} else {
902
			$text = $post_title;
903
		}
904
905
		// Record stats
906
		parent::process_request( $post, $post_data );
907
908
		$url = $post_link;
909
		$twitter_url = add_query_arg(
910
			rawurlencode_deep( array_filter( compact( 'via', 'related', 'text', 'url' ) ) ),
911
			'https://twitter.com/intent/tweet'
912
		);
913
914
		// Redirect to Twitter
915
		wp_redirect( $twitter_url );
916
		die();
917
	}
918
919
	public function has_custom_button_style() {
920
		return $this->smart;
921
	}
922
923
	public function display_footer() {
924
		if ( $this->smart ) {
925
			?>
926
			<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
927
			<?php
928
		} else {
929
			$this->js_dialog( $this->shortname, array( 'height' => 350 ) );
930
		}
931
	}
932
}
933
934
935
class Share_Reddit extends Sharing_Source {
936
	public $shortname = 'reddit';
937
	public $icon = '\f222';
938 View Code Duplication
	public function __construct( $id, array $settings ) {
939
		parent::__construct( $id, $settings );
940
941
		if ( 'official' == $this->button_style ) {
942
			$this->smart = true;
943
		} else {
944
			$this->smart = false;
945
		}
946
	}
947
948
	public function get_name() {
949
		return __( 'Reddit', 'jetpack' );
950
	}
951
952
	public function get_display( $post ) {
953
		if ( $this->smart ) {
954
			return '<div class="reddit_button"><iframe src="' . $this->http() . '://www.reddit.com/static/button/button1.html?newwindow=true&width=120&amp;url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&amp;title=' . rawurlencode( $this->get_share_title( $post->ID ) ) . '" height="22" width="120" scrolling="no" frameborder="0"></iframe></div>';
955 View Code Duplication
		} else {
956
			return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Reddit', 'share to', 'jetpack' ), __( 'Click to share on Reddit', 'jetpack' ), 'share=reddit' );
957
		}
958
	}
959
960
	/**
961
	 * AMP display for Reddit.
962
	 *
963
	 * @param \WP_Post $post The current post being viewed.
964
	 */
965 View Code Duplication
	public function get_amp_display( $post ) {
966
		$attrs = array(
967
			'data-share-endpoint' => esc_url_raw( 'https://reddit.com/submit?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&title=' . rawurlencode( $this->get_share_title( $post->ID ) ) ),
968
		);
969
970
		return $this->build_amp_markup( $attrs );
971
	}
972
973 View Code Duplication
	public function process_request( $post, array $post_data ) {
974
		$reddit_url = $this->http() . '://reddit.com/submit?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&title=' . rawurlencode( $this->get_share_title( $post->ID ) );
975
976
		// Record stats
977
		parent::process_request( $post, $post_data );
978
979
		// Redirect to Reddit
980
		wp_redirect( $reddit_url );
981
		die();
982
	}
983
}
984
985
class Share_LinkedIn extends Sharing_Source {
986
	public $shortname = 'linkedin';
987
	public $icon = '\f207';
988 View Code Duplication
	public function __construct( $id, array $settings ) {
989
		parent::__construct( $id, $settings );
990
991
		if ( 'official' == $this->button_style ) {
992
			$this->smart = true;
993
		} else {
994
			$this->smart = false;
995
		}
996
	}
997
998
	public function get_name() {
999
		return __( 'LinkedIn', 'jetpack' );
1000
	}
1001
1002
	public function has_custom_button_style() {
1003
		return $this->smart;
1004
	}
1005
1006
	public function get_display( $post ) {
1007
		$display = '';
1008
1009
		if ( $this->smart ) {
1010
			$share_url = $this->get_share_url( $post->ID );
1011
			$display .= sprintf( '<div class="linkedin_button"><script type="in/share" data-url="%s" data-counter="right"></script></div>', esc_url( $share_url ) );
1012 View Code Duplication
		} else {
1013
			$display = $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'LinkedIn', 'share to', 'jetpack' ), __( 'Click to share on LinkedIn', 'jetpack' ), 'share=linkedin', 'sharing-linkedin-' . $post->ID );
1014
		}
1015
1016
		/** This filter is already documented in modules/sharedaddy/sharing-sources.php */
1017
		if ( apply_filters( 'jetpack_register_post_for_share_counts', true, $post->ID, 'linkedin' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
1018
			sharing_register_post_for_share_counts( $post->ID );
1019
		}
1020
1021
		return $display;
1022
	}
1023
1024 View Code Duplication
	public function process_request( $post, array $post_data ) {
1025
1026
		$post_link = $this->get_share_url( $post->ID );
1027
1028
		// Using the same URL as the official button, which is *not* LinkedIn's documented sharing link
1029
		// https://www.linkedin.com/cws/share?url={url}&token=&isFramed=false
1030
		$linkedin_url = add_query_arg( array(
1031
			'url' => rawurlencode( $post_link ),
1032
		), 'https://www.linkedin.com/cws/share?token=&isFramed=false' );
1033
1034
		// Record stats
1035
		parent::process_request( $post, $post_data );
1036
1037
		// Redirect to LinkedIn
1038
		wp_redirect( $linkedin_url );
1039
		die();
1040
	}
1041
1042 View Code Duplication
	public function display_footer() {
1043
		if ( ! $this->smart ) {
1044
			$this->js_dialog( $this->shortname, array( 'width' => 580, 'height' => 450 ) );
1045
		} else {
1046
			?>
1047
			<script type="text/javascript">
1048
				( function () {
1049
					var currentScript = document.currentScript;
1050
1051
					// Helper function to load an external script.
1052
					function loadScript( url, cb ) {
1053
						var script = document.createElement( 'script' );
1054
						var prev = currentScript || document.getElementsByTagName( 'script' )[ 0 ];
1055
						script.setAttribute( 'async', true );
1056
						script.setAttribute( 'src', url );
1057
						prev.parentNode.insertBefore( script, prev );
1058
						script.addEventListener( 'load', cb );
1059
					}
1060
1061
					function init() {
1062
						loadScript( 'https://platform.linkedin.com/in.js?async=true', function () {
1063
							if ( typeof IN !== 'undefined' ) {
1064
								IN.init();
1065
							}
1066
						} );
1067
					}
1068
1069
					if ( document.readyState === 'loading' ) {
1070
						document.addEventListener( 'DOMContentLoaded', init );
1071
					} else {
1072
						init();
1073
					}
1074
1075
					document.body.addEventListener( 'is.post-load', function() {
1076
						if ( typeof IN !== 'undefined' ) {
1077
							IN.parse();
1078
						}
1079
					} );
1080
				} )();
1081
			</script>
1082
			<?php
1083
		}
1084
	}
1085
}
1086
1087
class Share_Facebook extends Sharing_Source {
1088
	public $shortname = 'facebook';
1089
	public $icon = '\f204';
1090
	private $share_type = 'default';
1091
1092 View Code Duplication
	public function __construct( $id, array $settings ) {
1093
		parent::__construct( $id, $settings );
1094
1095
		if ( isset( $settings['share_type'] ) ) {
1096
			$this->share_type = $settings['share_type'];
1097
		}
1098
1099
		if ( 'official' == $this->button_style ) {
1100
			$this->smart = true;
1101
		} else {
1102
			$this->smart = false;
1103
		}
1104
	}
1105
1106
	public function get_name() {
1107
		return __( 'Facebook', 'jetpack' );
1108
	}
1109
1110
	public function display_header() {
1111
	}
1112
1113 View Code Duplication
	function guess_locale_from_lang( $lang ) {
1114
		if ( 'en' == $lang || 'en_US' == $lang || ! $lang ) {
1115
			return 'en_US';
1116
		}
1117
1118
		if ( ! class_exists( 'GP_Locales' ) ) {
1119
			if ( ! defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) || ! file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
1120
				return false;
1121
			}
1122
1123
			require JETPACK__GLOTPRESS_LOCALES_PATH;
1124
		}
1125
1126
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
1127
			// WP.com: get_locale() returns 'it'
1128
			$locale = GP_Locales::by_slug( $lang );
1129
		} else {
1130
			// Jetpack: get_locale() returns 'it_IT';
1131
			$locale = GP_Locales::by_field( 'wp_locale', $lang );
1132
		}
1133
1134
		if ( ! $locale ) {
1135
			return false;
1136
		}
1137
1138
		if ( empty( $locale->facebook_locale ) ) {
1139
			if ( empty( $locale->wp_locale ) ) {
1140
				return false;
1141
			} else {
1142
				// Facebook SDK is smart enough to fall back to en_US if a
1143
				// locale isn't supported. Since supported Facebook locales
1144
				// can fall out of sync, we'll attempt to use the known
1145
				// wp_locale value and rely on said fallback.
1146
				return $locale->wp_locale;
1147
			}
1148
		}
1149
1150
		return $locale->facebook_locale;
1151
	}
1152
1153
	public function get_display( $post ) {
1154
		if ( $this->smart ) {
1155
			$share_url = $this->get_share_url( $post->ID );
1156
			$fb_share_html = '<div class="fb-share-button" data-href="' . esc_attr( $share_url ) . '" data-layout="button_count"></div>';
1157
			/**
1158
			 * Filter the output of the Facebook Sharing button.
1159
			 *
1160
			 * @module sharedaddy
1161
			 *
1162
			 * @since 3.6.0
1163
			 *
1164
			 * @param string $fb_share_html Facebook Sharing button HTML.
1165
			 * @param string $share_url URL of the post to share.
1166
			 */
1167
			return apply_filters( 'jetpack_sharing_facebook_official_button_output', $fb_share_html, $share_url );
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $share_url.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
1168
		}
1169
1170
		/** This filter is already documented in modules/sharedaddy/sharing-sources.php */
1171
		if ( apply_filters( 'jetpack_register_post_for_share_counts', true, $post->ID, 'facebook' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
1172
			sharing_register_post_for_share_counts( $post->ID );
1173
		}
1174
		return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Facebook', 'share to', 'jetpack' ), __( 'Click to share on Facebook', 'jetpack' ), 'share=facebook', 'sharing-facebook-' . $post->ID );
1175
	}
1176
1177
	/**
1178
	 * AMP display for Facebook.
1179
	 *
1180
	 * @param \WP_Post $post The current post being viewed.
1181
	 */
1182
	public function get_amp_display( $post ) {
1183
		$attrs = array(
1184
			/** This filter is documented in modules/sharedaddy/sharing-sources.php */
1185
			'data-param-app_id' => apply_filters( 'jetpack_sharing_facebook_app_id', '249643311490' ),
1186
		);
1187
1188
		return $this->build_amp_markup( $attrs );
1189
	}
1190
1191 View Code Duplication
	public function process_request( $post, array $post_data ) {
1192
		$fb_url = $this->http() . '://www.facebook.com/sharer.php?u=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&t=' . rawurlencode( $this->get_share_title( $post->ID ) );
1193
1194
		// Record stats
1195
		parent::process_request( $post, $post_data );
1196
1197
		// Redirect to Facebook
1198
		wp_redirect( $fb_url );
1199
		die();
1200
	}
1201
1202
	public function display_footer() {
1203
		$this->js_dialog( $this->shortname );
1204
		if ( $this->smart ) {
1205
			$locale = $this->guess_locale_from_lang( get_locale() );
1206
			if ( ! $locale ) {
1207
				$locale = 'en_US';
1208
			}
1209
			/**
1210
			 * Filter the App ID used in the official Facebook Share button.
1211
			 *
1212
			 * @since 3.8.0
1213
			 *
1214
			 * @param int $fb_app_id Facebook App ID. Default to 249643311490 (WordPress.com's App ID).
1215
			 */
1216
			$fb_app_id = apply_filters( 'jetpack_sharing_facebook_app_id', '249643311490' );
1217
			if ( is_numeric( $fb_app_id ) ) {
1218
				$fb_app_id = '&appId=' . $fb_app_id;
1219
			} else {
1220
				$fb_app_id = '';
1221
			}
1222
			?><div id="fb-root"></div>
1223
			<script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = 'https://connect.facebook.net/<?php echo $locale; ?>/sdk.js#xfbml=1<?php echo $fb_app_id; ?>&version=v2.3'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script>
1224
			<script>
1225
			document.body.addEventListener( 'is.post-load', function() {
1226
				if ( 'undefined' !== typeof FB ) {
1227
					FB.XFBML.parse();
1228
				}
1229
			} );
1230
			</script>
1231
			<?php
1232
		}
1233
	}
1234
}
1235
1236
class Share_Print extends Sharing_Source {
1237
	public $shortname = 'print';
1238
	public $icon = '\f469';
1239 View Code Duplication
	public function __construct( $id, array $settings ) {
1240
		parent::__construct( $id, $settings );
1241
1242
		if ( 'official' == $this->button_style ) {
1243
			$this->smart = true;
1244
		} else {
1245
			$this->smart = false;
1246
		}
1247
	}
1248
1249
	public function get_name() {
1250
		return __( 'Print', 'jetpack' );
1251
	}
1252
1253
	public function get_display( $post ) {
1254
		return $this->get_link( $this->get_process_request_url( $post->ID ) . ( ( is_single() || is_page() ) ? '#print': '' ), _x( 'Print', 'share to', 'jetpack' ), __( 'Click to print', 'jetpack' ) );
1255
	}
1256
1257
	/**
1258
	 * AMP display for Print.
1259
	 *
1260
	 * @param \WP_Post $post The current post being viewed.
1261
	 */
1262
	public function get_amp_display( $post ) {
1263
		if ( empty( $post ) ) {
1264
			return false;
1265
		}
1266
1267
		return '<button class="amp-social-share print" on="tap:AMP.print">Print</button>';
1268
	}
1269
}
1270
1271
class Share_PressThis extends Sharing_Source {
1272
	public $shortname = 'pressthis';
1273
	public $icon = '\f205';
1274 View Code Duplication
	public function __construct( $id, array $settings ) {
1275
		parent::__construct( $id, $settings );
1276
1277
		if ( 'official' == $this->button_style ) {
1278
			$this->smart = true;
1279
		} else {
1280
			$this->smart = false;
1281
		}
1282
	}
1283
1284
	public function get_name() {
1285
		return __( 'Press This', 'jetpack' );
1286
	}
1287
1288
	public function process_request( $post, array $post_data ) {
1289
		global $current_user;
1290
1291
		$primary_blog = (int) get_user_meta( $current_user->ID, 'primary_blog', true );
1292
		if ( $primary_blog ) {
1293
			$primary_blog_details = get_blog_details( $primary_blog );
1294
		} else {
1295
			$primary_blog_details = false;
1296
		}
1297
1298
		if ( $primary_blog_details ) {
1299
			$blogs = array( $primary_blog_details );
1300
		} elseif ( function_exists( 'get_active_blogs_for_user' ) ) {
1301
			$blogs = get_active_blogs_for_user();
1302
			if ( empty( $blogs ) ) {
1303
				$blogs = get_blogs_of_user( $current_user->ID );
1304
			}
1305
		} else {
1306
			$blogs = get_blogs_of_user( $current_user->ID );
1307
		}
1308
1309
		if ( empty( $blogs ) ) {
1310
			wp_safe_redirect( get_permalink( $post->ID ) );
1311
			die();
1312
		}
1313
1314
		$blog = current( $blogs );
1315
1316
		$args = array(
1317
			'u' => rawurlencode( $this->get_share_url( $post->ID ) ),
1318
			);
1319
1320
		$args[ 'url-scan-submit' ] = 'Scan';
1321
		$args[ '_wpnonce' ]        = wp_create_nonce( 'scan-site' );
1322
1323
		$url = $blog->siteurl . '/wp-admin/press-this.php';
1324
		$url = add_query_arg( $args, $url );
1325
1326
		// Record stats
1327
		parent::process_request( $post, $post_data );
1328
1329
		// Redirect to Press This
1330
		wp_redirect( $url );
1331
		die();
1332
	}
1333
1334
	public function get_display( $post ) {
1335
		return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Press This', 'share to', 'jetpack' ), __( 'Click to Press This!', 'jetpack' ), 'share=press-this' );
1336
	}
1337
1338
	/**
1339
	 * No AMP display for PressThis.
1340
	 *
1341
	 * @param \WP_Post $post The current post being viewed.
1342
	 */
1343
	public function get_amp_display( $post ) { // phpcs:ignore
1344
		return false;
1345
	}
1346
}
1347
1348
class Share_Custom extends Sharing_Advanced_Source {
1349
	private $name;
1350
	private $icon;
1351
	private $url;
1352
	public $smart = true;
1353
	public $shortname;
1354
1355
	public function get_class() {
1356
		return 'custom share-custom-' . sanitize_html_class( strtolower( $this->name ) );
1357
	}
1358
1359
	public function __construct( $id, array $settings ) {
1360
		parent::__construct( $id, $settings );
1361
1362
		$opts = $this->get_options();
0 ignored issues
show
Unused Code introduced by
$opts is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1363
1364
		if ( isset( $settings['name'] ) ) {
1365
			$this->name = $settings['name'];
1366
			$this->shortname = preg_replace( '/[^a-z0-9]*/', '', $settings['name'] );
1367
		}
1368
1369
		if ( isset( $settings['icon'] ) ) {
1370
			$this->icon = $settings['icon'];
1371
1372
			$new_icon = esc_url_raw( wp_specialchars_decode( $this->icon, ENT_QUOTES ) );
1373
			$i = 0;
1374
			while ( $new_icon != $this->icon ) {
1375
				if ( $i > 5 ) {
1376
					$this->icon = false;
1377
					break;
1378
				} else {
1379
					$this->icon = $new_icon;
1380
					$new_icon = esc_url_raw( wp_specialchars_decode( $this->icon, ENT_QUOTES ) );
1381
				}
1382
				$i++;
1383
			}
1384
		}
1385
1386
		if ( isset( $settings['url'] ) ) {
1387
			$this->url = $settings['url'];
1388
		}
1389
	}
1390
1391
	public function get_name() {
1392
		return $this->name;
1393
	}
1394
1395
	public function get_display( $post ) {
1396
		$str = $this->get_link( $this->get_process_request_url( $post->ID ), esc_html( $this->name ), sprintf( __( 'Click to share on %s', 'jetpack' ), esc_attr( $this->name ) ), 'share=' . $this->id );
1397
		return str_replace( '<span>', '<span style="' . esc_attr( 'background-image:url("' . addcslashes( esc_url_raw( $this->icon ), '"' ) . '");' ) . '">', $str );
1398
	}
1399
1400
	/**
1401
	 * No AMP display for custom elements.
1402
	 *
1403
	 * @param \WP_Post $post The current post being viewed.
1404
	 */
1405
	public function get_amp_display( $post ) { // phpcs:ignore
1406
		return false;
1407
	}
1408
1409
	public function process_request( $post, array $post_data ) {
1410
		$url = str_replace( '&amp;', '&', $this->url );
1411
		$url = str_replace( '%post_id%', rawurlencode( $post->ID ), $url );
1412
		$url = str_replace( '%post_url%', rawurlencode( $this->get_share_url( $post->ID ) ), $url );
1413
		$url = str_replace( '%post_full_url%', rawurlencode( get_permalink( $post->ID ) ), $url );
1414
		$url = str_replace( '%post_title%', rawurlencode( $this->get_share_title( $post->ID ) ), $url );
1415
		$url = str_replace( '%home_url%', rawurlencode( home_url() ), $url );
1416
		$url = str_replace( '%post_slug%', rawurlencode( $post->post_name ), $url );
1417
1418
		if ( strpos( $url, '%post_tags%' ) !== false ) {
1419
			$tags	= get_the_tags( $post->ID );
1420
			$tagged = '';
1421
1422
			if ( $tags ) {
1423
				$tagged_raw = array();
1424
				foreach ( $tags as $tag ) {
1425
					$tagged_raw[] = rawurlencode( $tag->name );
1426
				}
1427
1428
				$tagged = implode( ',', $tagged_raw );
1429
			}
1430
1431
			$url = str_replace( '%post_tags%', $tagged, $url );
1432
		}
1433
1434
		if ( strpos( $url, '%post_excerpt%' ) !== false ) {
1435
			$url_excerpt = $post->post_excerpt;
1436
			if ( empty( $url_excerpt ) ) {
1437
				$url_excerpt = $post->post_content;
1438
			}
1439
1440
			$url_excerpt = strip_tags( strip_shortcodes( $url_excerpt ) );
1441
			$url_excerpt = wp_html_excerpt( $url_excerpt, 100 );
1442
			$url_excerpt = rtrim( preg_replace( '/[^ .]*$/', '', $url_excerpt ) );
1443
			$url = str_replace( '%post_excerpt%', rawurlencode( $url_excerpt ), $url );
1444
		}
1445
1446
		// Record stats
1447
		parent::process_request( $post, $post_data );
1448
1449
		// Redirect
1450
		wp_redirect( $url );
1451
		die();
1452
	}
1453
1454
	public function display_options() {
1455
?>
1456
<div class="input">
1457
	<table class="form-table">
1458
		<tbody>
1459
			<tr>
1460
				<th scope="row"><?php _e( 'Label', 'jetpack' ); ?></th>
1461
				<td><input type="text" name="name" value="<?php echo esc_attr( $this->name ); ?>" /></td>
1462
			</tr>
1463
1464
			<tr>
1465
				<th scope="row"><?php _e( 'URL', 'jetpack' ); ?></th>
1466
				<td><input type="text" name="url" value="<?php echo esc_attr( $this->url ); ?>" /></td>
1467
			</tr>
1468
1469
			<tr>
1470
				<th scope="row"><?php _e( 'Icon', 'jetpack' ); ?></th>
1471
				<td><input type="text" name="icon" value="<?php echo esc_attr( $this->icon ); ?>" /></td>
1472
			</tr>
1473
1474
			<tr>
1475
				<th scope="row"></th>
1476
				<td>
1477
					<input class="button-secondary" type="submit" value="<?php esc_attr_e( 'Save', 'jetpack' ); ?>" />
1478
					<a href="#" class="remove"><small><?php _e( 'Remove Service', 'jetpack' ); ?></small></a>
1479
				</td>
1480
			</tr>
1481
		</tbody>
1482
	</table>
1483
</div>
1484
<?php
1485
	}
1486
1487
	public function update_options( array $data ) {
1488
		$name  = trim( wp_html_excerpt( wp_kses( stripslashes( $data['name'] ), array() ), 30 ) );
1489
		$url   = trim( esc_url_raw( $data['url'] ) );
1490
		$icon  = trim( esc_url_raw( $data['icon'] ) );
1491
1492
		if ( $name ) {
1493
			$this->name = $name;
1494
		}
1495
1496
		if ( $url ) {
1497
			$this->url	= $url;
1498
		}
1499
1500
		if ( $icon ) {
1501
			$this->icon = $icon;
1502
		}
1503
	}
1504
1505
	public function get_options() {
1506
		return array(
1507
			'name' => $this->name,
1508
			'icon' => $this->icon,
1509
			'url'  => $this->url,
1510
		);
1511
	}
1512
1513
	public function display_preview( $echo = true, $force_smart = false, $button_style = null ) {
1514
		$opts = $this->get_options();
1515
1516
		$text = '&nbsp;';
1517
		if ( ! $this->smart ) {
1518
			if ( $this->button_style != 'icon' ) {
1519
				$text = $this->get_name();
1520
			}
1521
		}
1522
1523
		$klasses = array( 'share-' . $this->shortname );
1524
1525
		if ( $this->button_style == 'icon' || $this->button_style == 'icon-text' ) {
1526
			$klasses[] = 'share-icon';
1527
		}
1528
1529
		if ( $this->button_style == 'icon' ) {
1530
			$text = '';
1531
			$klasses[] = 'no-text';
1532
		}
1533
1534
		if ( $this->button_style == 'text' ) {
1535
			$klasses[] = 'no-icon';
1536
		}
1537
1538
		$link = sprintf(
1539
			'<a rel="nofollow" class="%s" href="javascript:void(0)" title="%s"><span style="background-image:url(&quot;%s&quot;) !important;background-position:left center;background-repeat:no-repeat;">%s</span></a>',
1540
			implode( ' ', $klasses ),
1541
			$this->get_name(),
1542
			addcslashes( esc_url_raw( $opts['icon'] ), '"' ),
1543
			$text
1544
		);
1545
		?>
1546
		<div class="option option-smart-off">
1547
		<?php echo $link ; ?>
1548
		</div><?php
1549
	}
1550
}
1551
1552
class Share_Tumblr extends Sharing_Source {
1553
	public $shortname = 'tumblr';
1554
	public $icon = '\f214';
1555 View Code Duplication
	public function __construct( $id, array $settings ) {
1556
		parent::__construct( $id, $settings );
1557
		if ( 'official' == $this->button_style ) {
1558
			$this->smart = true;
1559
		} else {
1560
			$this->smart = false;
1561
		}
1562
	}
1563
1564
	public function get_name() {
1565
		return __( 'Tumblr', 'jetpack' );
1566
	}
1567
1568
	public function get_display( $post ) {
1569
		if ( $this->smart ) {
1570
			$target = '';
1571
			if ( true == $this->open_link_in_new ) {
1572
				$target = '_blank';
1573
			}
1574
1575
			/**
1576
			 * If we are looking at a single post, let Tumblr figure out the post type (text, photo, link, quote, chat, or video)
1577
			 * based on the content available on the page.
1578
			 * If we are not looking at a single post, content from other posts can appear on the page and Tumblr will pick that up.
1579
			 * In this case, we want Tumblr to focus on our current post, so we will limit the post type to link, where we can give Tumblr a link to our post.
1580
			 */
1581
			if ( ! is_single() ) {
1582
				$posttype = 'data-posttype="link"';
1583
			} else {
1584
				$posttype = '';
1585
			}
1586
1587
			// Documentation: https://www.tumblr.com/docs/en/share_button
1588
			return sprintf(
1589
				'<a class="tumblr-share-button" target="%1$s" href="%2$s" data-title="%3$s" data-content="%4$s" title="%5$s"%6$s>%5$s</a>',
1590
				$target,
1591
				'https://www.tumblr.com/share',
1592
				$this->get_share_title( $post->ID ),
1593
				$this->get_share_url( $post->ID ),
1594
				__( 'Share on Tumblr', 'jetpack' ),
1595
				$posttype
1596
			);
1597 View Code Duplication
		 } else {
1598
			return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Tumblr', 'share to', 'jetpack' ), __( 'Click to share on Tumblr', 'jetpack' ), 'share=tumblr' );
1599
		}
1600
	}
1601
1602 View Code Duplication
	public function process_request( $post, array $post_data ) {
1603
		// Record stats
1604
		parent::process_request( $post, $post_data );
1605
1606
		// Redirect to Tumblr's sharing endpoint (a la their bookmarklet)
1607
		$url = 'https://www.tumblr.com/share?v=3&u=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&t=' . rawurlencode( $this->get_share_title( $post->ID ) ) . '&s=';
1608
		wp_redirect( $url );
1609
		die();
1610
	}
1611
1612 View Code Duplication
	public function display_footer() {
1613
		if ( $this->smart ) {
1614
			?><script id="tumblr-js" type="text/javascript" src="https://assets.tumblr.com/share-button.js"></script><?php
1615
		} else {
1616
			$this->js_dialog( $this->shortname, array( 'width' => 450, 'height' => 450 ) );
1617
		}
1618
	}
1619
}
1620
1621
class Share_Pinterest extends Sharing_Source {
1622
	public $shortname = 'pinterest';
1623
	public $icon = '\f209';
1624
1625 View Code Duplication
	public function __construct( $id, array $settings ) {
1626
		parent::__construct( $id, $settings );
1627
		if ( 'official' == $this->button_style ) {
1628
			$this->smart = true;
1629
		} else {
1630
			$this->smart = false;
1631
		}
1632
	}
1633
1634
	public function get_name() {
1635
		return __( 'Pinterest', 'jetpack' );
1636
	}
1637
1638
	public function get_image( $post ) {
1639
		if ( class_exists( 'Jetpack_PostImages' ) ) {
1640
			$image = Jetpack_PostImages::get_image( $post->ID, array( 'fallback_to_avatars' => true ) );
1641
			if ( ! empty( $image ) ) {
1642
				return $image['src'];
1643
			}
1644
		}
1645
1646
		/**
1647
		 * Filters the default image used by the Pinterest Pin It share button.
1648
		 *
1649
		 * @module sharedaddy
1650
		 *
1651
		 * @since 3.6.0
1652
		 *
1653
		 * @param string $url Default image URL.
1654
		 */
1655
		return apply_filters( 'jetpack_sharing_pinterest_default_image', 'https://s0.wp.com/i/blank.jpg' );
1656
	}
1657
1658
	public function get_external_url( $post ) {
1659
		$url = 'https://www.pinterest.com/pin/create/button/?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&media=' . rawurlencode( $this->get_image( $post ) ) . '&description=' . rawurlencode( $post->post_title );
1660
1661
		/**
1662
		 * Filters the Pinterest share URL used in sharing button output.
1663
		 *
1664
		 * @module sharedaddy
1665
		 *
1666
		 * @since 3.6.0
1667
		 *
1668
		 * @param string $url Pinterest share URL.
1669
		 */
1670
		return apply_filters( 'jetpack_sharing_pinterest_share_url', $url );
1671
	}
1672
1673
	public function get_widget_type() {
1674
		/**
1675
		 * Filters the Pinterest widget type.
1676
		 *
1677
		 * @see https://business.pinterest.com/en/widget-builder
1678
		 *
1679
		 * @module sharedaddy
1680
		 *
1681
		 * @since 3.6.0
1682
		 *
1683
		 * @param string $type Pinterest widget type. Default of 'buttonPin' for single-image selection. 'buttonBookmark' for multi-image modal.
1684
		 */
1685
		return apply_filters( 'jetpack_sharing_pinterest_widget_type', 'buttonPin' );
1686
	}
1687
1688
	public function get_display( $post ) {
1689
		$display = '';
0 ignored issues
show
Unused Code introduced by
$display is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1690
1691
		if ( $this->smart ) {
1692
			$display = sprintf(
1693
				'<div class="pinterest_button"><a href="%s" data-pin-do="%s" data-pin-config="beside"><img src="//assets.pinterest.com/images/pidgets/pinit_fg_en_rect_gray_20.png" /></a></div>',
1694
				esc_url( $this->get_external_url( $post ) ),
1695
				esc_attr( $this->get_widget_type() )
1696
			);
1697 View Code Duplication
		} else {
1698
			$display = $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Pinterest', 'share to', 'jetpack' ), __( 'Click to share on Pinterest', 'jetpack' ), 'share=pinterest', 'sharing-pinterest-' . $post->ID );
1699
		}
1700
1701
		/** This filter is already documented in modules/sharedaddy/sharing-sources.php */
1702
		if ( apply_filters( 'jetpack_register_post_for_share_counts', true, $post->ID, 'linkedin' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
1703
			sharing_register_post_for_share_counts( $post->ID );
1704
		}
1705
1706
		return $display;
1707
	}
1708
1709
	public function process_request( $post, array $post_data ) {
1710
		// Record stats
1711
		parent::process_request( $post, $post_data );
1712
		// If we're triggering the multi-select panel, then we don't need to redirect to Pinterest
1713
		if ( ! isset( $_GET['js_only'] ) ) {
1714
			$pinterest_url = esc_url_raw( $this->get_external_url( $post ) );
1715
			wp_redirect( $pinterest_url );
1716
		} else {
1717
			echo '// share count bumped';
1718
		}
1719
		die();
1720
	}
1721
1722
	public function display_footer() {
1723
		/**
1724
		 * Filter the Pin it button appearing when hovering over images when using the official button style.
1725
		 *
1726
		 * @module sharedaddy
1727
		 *
1728
		 * @since 3.6.0
1729
		 *
1730
		 * @param bool $jetpack_pinit_over True by default, displays the Pin it button when hovering over images.
1731
		 */
1732
		$jetpack_pinit_over = apply_filters( 'jetpack_pinit_over_button', true );
1733
		?>
1734
		<?php if ( $this->smart ) : ?>
1735
			<script type="text/javascript">
1736
				( function () {
1737
					// Pinterest shared resources
1738
					var s = document.createElement( 'script' );
1739
					s.type = 'text/javascript';
1740
					s.async = true;
1741
					<?php
1742
					if ( $jetpack_pinit_over ) {
1743
						echo "s.setAttribute( 'data-pin-hover', true );";
1744
					}
1745
					?>
1746
					s.src = window.location.protocol + '//assets.pinterest.com/js/pinit.js';
1747
					var x = document.getElementsByTagName( 'script' )[ 0 ];
1748
					x.parentNode.insertBefore(s, x);
1749
					// if 'Pin it' button has 'counts' make container wider
1750
					function init() {
1751
						var shares = document.querySelectorAll( 'li.share-pinterest' );
1752
						for ( var i = 0; i < shares.length; i++ ) {
1753
							var share = shares[ i ];
1754
							if ( share.querySelector( 'a span:visible' ) ) {
1755
								share.style.width = '80px';
1756
							}
1757
						}
1758
					}
1759
1760
					if ( document.readyState !== 'complete' ) {
1761
						document.addEventListener( 'load', init );
1762
					} else {
1763
						init();
1764
					}
1765
				} )();
1766
			</script>
1767
		<?php elseif ( 'buttonPin' != $this->get_widget_type() ) : ?>
1768
			<script type="text/javascript">
1769
				( function () {
1770
					function init() {
1771
						document.body.addEventListener( 'click', function ( e ) {
1772
							if ( e.target && (
1773
								e.target.matches && e.target.matches( 'a.share-pinterest' ) ||
1774
								e.target.msMatchesSelector && e.target.msMatchesSelector( 'a.share-pinterest' )
1775
							) ) {
1776
								e.preventDefault();
1777
								// Load Pinterest Bookmarklet code
1778
								var s = document.createElement( 'script' );
1779
								s.type = 'text/javascript';
1780
								s.src = window.location.protocol + '//assets.pinterest.com/js/pinmarklet.js?r=' + ( Math.random() * 99999999 );
1781
								var x = document.getElementsByTagName( 'script' )[ 0 ];
1782
								x.parentNode.insertBefore( s, x );
1783
								// Trigger Stats
1784
								var s = document.createElement( 'script' );
1785
								s.type = 'text/javascript';
1786
								s.src = e.target.href + ( e.target.href.indexOf( '?' ) ? '&' : '?' ) + 'js_only=1';
1787
								var x = document.getElementsByTagName( 'script' )[ '0' ];
1788
								x.parentNode.insertBefore( s, x );
1789
							}
1790
						} );
1791
					}
1792
1793
					if ( document.readyState === 'loading' ) {
1794
						document.addEventListener( 'DOMContentLoaded', init );
1795
					} else {
1796
						init();
1797
					}
1798
				} )();
1799
			</script>
1800
		<?php endif;
1801
	}
1802
}
1803
1804
class Share_Pocket extends Sharing_Source {
1805
	public $shortname = 'pocket';
1806
	public $icon = '\f224';
1807
1808 View Code Duplication
	public function __construct( $id, array $settings ) {
1809
		parent::__construct( $id, $settings );
1810
1811
		if ( 'official' == $this->button_style ) {
1812
			$this->smart = true;
1813
		} else {
1814
			$this->smart = false;
1815
		}
1816
	}
1817
1818
	public function get_name() {
1819
		return __( 'Pocket', 'jetpack' );
1820
	}
1821
1822 View Code Duplication
	public function process_request( $post, array $post_data ) {
1823
		// Record stats
1824
		parent::process_request( $post, $post_data );
1825
1826
		$pocket_url = esc_url_raw( 'https://getpocket.com/save/?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&title=' . rawurlencode( $this->get_share_title( $post->ID ) ) );
1827
		wp_redirect( $pocket_url );
1828
		exit;
1829
	}
1830
1831
	public function get_display( $post ) {
1832
		if ( $this->smart ) {
1833
			$post_count = 'horizontal';
1834
1835
			$button = '';
1836
			$button .= '<div class="pocket_button">';
1837
			$button .= sprintf( '<a href="https://getpocket.com/save" class="pocket-btn" data-lang="%s" data-save-url="%s" data-pocket-count="%s" >%s</a>', 'en', esc_attr( $this->get_share_url( $post->ID ) ), $post_count, esc_attr__( 'Pocket', 'jetpack' ) );
1838
			$button .= '</div>';
1839
1840
			return $button;
1841 View Code Duplication
		} else {
1842
			return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Pocket', 'share to', 'jetpack' ), __( 'Click to share on Pocket', 'jetpack' ), 'share=pocket' );
1843
		}
1844
1845
	}
1846
1847
	/**
1848
	 * AMP display for Pocket.
1849
	 *
1850
	 * @param \WP_Post $post The current post being viewed.
1851
	 */
1852 View Code Duplication
	public function get_amp_display( $post ) {
1853
		$attrs = array(
1854
			'data-share-endpoint' => esc_url_raw( 'https://getpocket.com/save/?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&title=' . rawurlencode( $this->get_share_title( $post->ID ) ) ),
1855
		);
1856
1857
		return $this->build_amp_markup( $attrs );
1858
	}
1859
1860 View Code Duplication
	function display_footer() {
1861
		if ( $this->smart ) :
1862
		?>
1863
		<script>
1864
		( function () {
1865
			var currentScript = document.currentScript;
1866
1867
			// Don't use Pocket's default JS as it we need to force init new Pocket share buttons loaded via JS.
1868
			function jetpack_sharing_pocket_init() {
1869
				var script = document.createElement( 'script' );
1870
				var prev = currentScript || document.getElementsByTagName( 'script' )[ 0 ];
1871
				script.setAttribute( 'async', true );
1872
				script.setAttribute( 'src', 'https://widgets.getpocket.com/v1/j/btn.js?v=1' );
1873
				prev.parentNode.insertBefore( script, prev );
1874
			}
1875
1876
			if ( document.readyState === 'loading' ) {
1877
				document.addEventListener( 'DOMContentLoaded', jetpack_sharing_pocket_init );
1878
			} else {
1879
				jetpack_sharing_pocket_init();
1880
			}
1881
			document.body.addEventListener( 'is.post-load', jetpack_sharing_pocket_init );
1882
		} )();
1883
		</script>
1884
		<?php
1885
		else :
1886
			$this->js_dialog( $this->shortname, array( 'width' => 450, 'height' => 450 ) );
1887
		endif;
1888
1889
	}
1890
1891
}
1892
1893
class Share_Telegram extends Sharing_Source {
1894
	public $shortname = 'telegram';
1895
1896
	public function __construct( $id, array $settings ) {
1897
		parent::__construct( $id, $settings );
1898
	}
1899
1900
	public function get_name() {
1901
		return __( 'Telegram', 'jetpack' );
1902
	}
1903 View Code Duplication
	public function process_request( $post, array $post_data ) {
1904
		// Record stats
1905
		parent::process_request( $post, $post_data );
1906
		$telegram_url = esc_url_raw( 'https://telegram.me/share/url?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&text=' . rawurlencode( $this->get_share_title( $post->ID ) ) );
1907
		wp_redirect( $telegram_url );
1908
		exit;
1909
	}
1910
1911
	public function get_display( $post ) {
1912
		return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'Telegram', 'share to', 'jetpack' ), __( 'Click to share on Telegram', 'jetpack' ), 'share=telegram' );
1913
	}
1914
1915
	/**
1916
	 * AMP display for Telegram.
1917
	 *
1918
	 * @param \WP_Post $post The current post being viewed.
1919
	 */
1920 View Code Duplication
	public function get_amp_display( $post ) {
1921
		$attrs = array(
1922
			'data-share-endpoint' => esc_url_raw( 'https://telegram.me/share/url?url=' . rawurlencode( $this->get_share_url( $post->ID ) ) . '&text=' . rawurlencode( $this->get_share_title( $post->ID ) ) ),
1923
		);
1924
1925
		return $this->build_amp_markup( $attrs );
1926
	}
1927
1928
	function display_footer() {
1929
		$this->js_dialog( $this->shortname, array( 'width' => 450, 'height' => 450 ) );
1930
	}
1931
}
1932
1933
class Jetpack_Share_WhatsApp extends Sharing_Source {
1934
	public $shortname = 'jetpack-whatsapp';
1935
1936
	public function __construct( $id, array $settings ) {
1937
		parent::__construct( $id, $settings );
1938
	}
1939
1940
	public function get_name() {
1941
		return __( 'WhatsApp', 'jetpack' );
1942
	}
1943
1944
	public function get_display( $post ) {
1945
		return $this->get_link( $this->get_process_request_url( $post->ID ), _x( 'WhatsApp', 'share to', 'jetpack' ), __( 'Click to share on WhatsApp', 'jetpack' ), 'share=jetpack-whatsapp' );
1946
	}
1947
1948
	/**
1949
	 * AMP display for Whatsapp.
1950
	 *
1951
	 * @param \WP_Post $post The current post being viewed.
1952
	 */
1953
	public function get_amp_display( $post ) {
1954
		$attrs = array(
1955
			'type' => 'whatsapp',
1956
		);
1957
1958
		return $this->build_amp_markup( $attrs );
1959
	}
1960
1961
	public function process_request( $post, array $post_data ) {
1962
		// Record stats
1963
		parent::process_request( $post, $post_data );
1964
1965
		// Firefox for desktop doesn't handle the "api.whatsapp.com" URL properly, so use "web.whatsapp.com"
1966
		if ( User_Agent_Info::is_firefox_desktop() ) {
1967
			$url = 'https://web.whatsapp.com/send?text=';
1968
		} else {
1969
			$url = 'https://api.whatsapp.com/send?text=';
1970
		}
1971
1972
		$url .= rawurlencode( $this->get_share_title( $post->ID ) . ' ' . $this->get_share_url( $post->ID ) );
1973
		wp_redirect( $url );
1974
		exit;
1975
	}
1976
}
1977
1978
class Share_Skype extends Sharing_Source {
1979
	public $shortname = 'skype';
1980
	public $icon = '\f220';
1981
	private $share_type = 'default';
1982
1983 View Code Duplication
	public function __construct( $id, array $settings ) {
1984
		parent::__construct( $id, $settings );
1985
1986
		if ( isset( $settings['share_type'] ) ) {
1987
			$this->share_type = $settings['share_type'];
1988
		}
1989
1990
		if ( 'official' == $this->button_style ) {
1991
			$this->smart = true;
1992
		} else {
1993
			$this->smart = false;
1994
		}
1995
1996
	}
1997
1998
	public function get_name() {
1999
		return __( 'Skype', 'jetpack' );
2000
	}
2001
2002
	public function get_display( $post ) {
2003
		if ( $this->smart ) {
2004
			$skype_share_html = sprintf(
2005
				'<div class="skype-share" data-href="%1$s" data-lang="%2$s" data-style="small" data-source="jetpack" ></div>',
2006
				esc_attr( $this->get_share_url( $post->ID ) ),
2007
				'en-US'
2008
			);
2009
			return $skype_share_html;
2010
		}
2011
2012
		/** This filter is already documented in modules/sharedaddy/sharing-sources.php */
2013
		if ( apply_filters( 'jetpack_register_post_for_share_counts', true, $post->ID, 'skype' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $post->ID.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
2014
			sharing_register_post_for_share_counts( $post->ID );
2015
		}
2016
		return $this->get_link(
2017
			$this->get_process_request_url( $post->ID ), _x( 'Skype', 'share to', 'jetpack' ), __( 'Click to share on Skype', 'jetpack' ), 'share=skype', 'sharing-skype-' . $post->ID );
2018
	}
2019
2020
	/**
2021
	 * AMP display for Skype.
2022
	 *
2023
	 * @param \WP_Post $post The current post being viewed.
2024
	 */
2025
	public function get_amp_display( $post ) {
2026
		$attrs = array(
2027
			'data-share-endpoint' => sprintf(
2028
				'https://web.skype.com/share?url=%1$s&lang=%2$s=&source=jetpack',
2029
				rawurlencode( $this->get_share_url( $post->ID ) ),
2030
				'en-US'
2031
			),
2032
		);
2033
2034
		return $this->build_amp_markup( $attrs );
2035
	}
2036
2037 View Code Duplication
	public function process_request( $post, array $post_data ) {
2038
		$skype_url = sprintf(
2039
			'https://web.skype.com/share?url=%1$s&lang=%2$s=&source=jetpack',
2040
			rawurlencode( $this->get_share_url( $post->ID ) ),
2041
			'en-US'
2042
		);
2043
2044
		// Record stats
2045
		parent::process_request( $post, $post_data );
2046
2047
		// Redirect to Skype
2048
		wp_redirect( $skype_url );
2049
		die();
2050
	}
2051
2052 View Code Duplication
	public function display_footer() {
2053
		if ( $this->smart ) :
2054
			?>
2055
			<script>
2056
				(function(r, d, s) {
2057
					r.loadSkypeWebSdkAsync = r.loadSkypeWebSdkAsync || function(p) {
2058
							var js, sjs = d.getElementsByTagName(s)[0];
2059
							if (d.getElementById(p.id)) { return; }
2060
							js = d.createElement(s);
2061
							js.id = p.id;
2062
							js.src = p.scriptToLoad;
2063
							js.onload = p.callback
2064
							sjs.parentNode.insertBefore(js, sjs);
2065
						};
2066
					var p = {
2067
						scriptToLoad: 'https://swx.cdn.skype.com/shared/v/latest/skypewebsdk.js',
2068
						id: 'skype_web_sdk'
2069
					};
2070
					r.loadSkypeWebSdkAsync(p);
2071
				})(window, document, 'script');
2072
			</script>
2073
			<?php
2074
		else :
2075
			$this->js_dialog( $this->shortname, array( 'width' => 305, 'height' => 665 ) );
2076
		endif;
2077
	}
2078
}
2079