Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
83.33% covered (warning)
83.33%
45 / 54
0.00% covered (danger)
0.00%
0 / 1
CRAP
n/a
0 / 0
slideshare_shortcode
88.24% covered (warning)
88.24%
45 / 51
0.00% covered (danger)
0.00%
0 / 1
22.79
1<?php
2/**
3 * Slideshare shortcode
4 *
5 * Formats:
6 * Old style (still compatible): [slideshare id=5342235&doc=camprock-101002163655-phpapp01&w=300&h=200]
7 * New style: [slideshare id=5342235&w=300&h=200&fb=0&mw=0&mh=0&sc=no]
8 *
9 * Legend:
10 *  id    = Document ID provided by Slideshare
11 *  w     = Width of iFrame     (int)
12 *  h     = Height of iFrame    (int)
13 *  fb    = iFrame frameborder  (int)
14 *  mw    = iFrame marginwidth  (int)
15 *  mh    = iFrame marginheight (int)
16 *  sc    = iFrame Scrollbar    (yes/no)
17 *  pro   = Slideshare Pro      (yes/no)
18 *  style = Inline CSS          (string)
19 *
20 * @package automattic/jetpack
21 */
22
23if ( ! defined( 'ABSPATH' ) ) {
24    exit( 0 );
25}
26
27/**
28 * Register and display shortcode.
29 *
30 * @param array $atts Shortcode attributes.
31 */
32function slideshare_shortcode( $atts ) {
33    global $content_width;
34
35    $params = shortcode_new_to_old_params( $atts );
36    parse_str( $params, $arguments );
37
38    if ( empty( $arguments ) ) {
39        return '<!-- SlideShare error: no arguments -->';
40    }
41
42    $attr = shortcode_atts(
43        array(
44            'id'    => '',
45            'w'     => '',
46            'h'     => '',
47            'fb'    => '',
48            'mw'    => '',
49            'mh'    => '',
50            'sc'    => '',
51            'pro'   => '',
52            'style' => '',
53        ),
54        $arguments
55    );
56
57    // check that the Slideshare ID contains letters, numbers and query strings.
58    $pattern = '/[^-_a-zA-Z0-9?=&]/';
59    if ( empty( $attr['id'] ) || preg_match( $pattern, $attr['id'] ) ) {
60        return '<!-- SlideShare error: id is missing or has illegal characters -->';
61    }
62
63    // check the width/height.
64    $w = (int) $attr['w'];
65
66    // If no width was specified (or uses the wrong format), and if we have a $content_width, use that.
67    if ( empty( $w ) && ! empty( $content_width ) ) {
68        $w = (int) $content_width;
69    } elseif ( $w < 300 || $w > 1600 ) { // If width was specified, but is too small/large, set default value.
70        $w = 425;
71    }
72
73    $h = ceil( $w * 348 / 425 ); // Note: user-supplied height is ignored.
74
75    if ( ! empty( $attr['pro'] ) ) {
76        $source = 'https://www.slideshare.net/slidesharepro/' . $attr['id'];
77    } else {
78        $source = 'https://www.slideshare.net/slideshow/embed_code/' . $attr['id'];
79    }
80
81    if ( isset( $attr['rel'] ) ) {
82        $source = add_query_arg( 'rel', (int) $attr['rel'], $source );
83    }
84
85    if ( ! empty( $attr['startSlide'] ) ) {
86        $source = add_query_arg( 'startSlide', (int) $attr['startSlide'], $source );
87    }
88
89    $player = sprintf( "<iframe src='%s' width='%d' height='%d'", esc_url( $source ), $w, $h );
90
91    // check the frameborder.
92    if ( ! empty( $attr['fb'] ) || '0' === $attr['fb'] ) {
93        $player .= " frameborder='" . (int) $attr['fb'] . "'";
94    }
95
96    $is_amp = ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() );
97
98    if ( ! $is_amp ) {
99        // check the margin width; if not empty, cast as int.
100        if ( ( ! empty( $attr['mw'] ) || '0' === $attr['mw'] ) ) {
101            $player .= " marginwidth='" . (int) $attr['mw'] . "'";
102        }
103
104        // check the margin height, if not empty, cast as int.
105        if ( ( ! empty( $attr['mh'] ) || '0' === $attr['mh'] ) ) {
106            $player .= " marginheight='" . (int) $attr['mh'] . "'";
107        }
108    }
109
110    if ( ! empty( $attr['style'] ) ) {
111        $player .= " style='" . esc_attr( $attr['style'] ) . "'";
112    }
113
114    // check the scrollbar; cast as a lowercase string for comparison.
115    if ( ! empty( $attr['sc'] ) ) {
116        $sc = strtolower( $attr['sc'] );
117
118        if ( in_array( $sc, array( 'yes', 'no' ), true ) ) {
119            $player .= " scrolling='" . $sc . "'";
120        }
121    }
122
123    $player .= ' sandbox="allow-popups allow-scripts allow-same-origin allow-presentation" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>';
124
125    /**
126     * Filter the returned SlideShare shortcode.
127     *
128     * @module shortcodes
129     *
130     * @since 4.7.0
131     *
132     * @param string $player The iframe to return.
133     * @param array  $atts   The attributes specified in the shortcode.
134     */
135    return apply_filters( 'jetpack_slideshare_shortcode', $player, $atts );
136}
137add_shortcode( 'slideshare', 'slideshare_shortcode' );