PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / shortcodes / instagram.php
jetpack / modules / shortcodes Last commit date
css 1 month ago images 1 year ago img 2 months ago js 7 months ago archiveorg-book.php 7 months ago archiveorg.php 1 month ago archives.php 1 week ago bandcamp.php 7 months ago brightcove.php 6 months ago cartodb.php 7 months ago class.filter-embedded-html-objects.php 7 months ago codepen.php 7 months ago crowdsignal.php 6 months ago dailymotion.php 7 months ago descript.php 7 months ago facebook.php 7 months ago flatio.php 7 months ago flickr.php 7 months ago getty.php 7 months ago gist.php 7 months ago googleapps.php 7 months ago googlemaps.php 1 month ago googleplus.php 7 months ago gravatar.php 7 months ago houzz.php 7 months ago inline-pdfs.php 7 months ago instagram.php 7 months ago kickstarter.php 7 months ago mailchimp.php 1 month ago medium.php 7 months ago mixcloud.php 7 months ago others.php 7 months ago pinterest.php 7 months ago presentations.php 7 months ago quiz.php 7 months ago recipe.php 2 weeks ago scribd.php 7 months ago shortcode-utils.php 7 months ago sitemap.php 7 months ago slideshare.php 7 months ago slideshow.php 2 weeks ago smartframe.php 7 months ago soundcloud.php 1 month ago spotify.php 7 months ago ted.php 7 months ago tweet.php 7 months ago twitchtv.php 2 weeks ago twitter-timeline.php 7 months ago twitter.php 7 months ago unavailable.php 7 months ago untappd-menu.php 7 months ago upcoming-events.php 7 months ago ustream.php 7 months ago videopress.php 7 months ago vimeo.php 1 month ago vine.php 7 months ago vr.php 1 month ago wufoo.php 7 months ago youtube.php 4 months ago
instagram.php
340 lines
1 <?php
2 /**
3 * Instagram Embeds.
4 *
5 * Full links: https://www.instagram.com/p/BnMOk_FFsxg/
6 * https://www.instagram.com/tv/BkQjCfsBIzi/
7 * [instagram url=https://www.instagram.com/p/BnMOk_FFsxg/]
8 * [instagram url=https://www.instagram.com/p/BZoonmAHvHf/ width=320]
9 * Embeds can be converted to a shortcode when the author does not have unfiltered_html caps:
10 * <blockquote class="instagram-media" data-instgrm-captioned data-instgrm-version="2" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:8px;"><div style=" background:#F8F8F8; line-height:0; margin-top:40px; padding-bottom:55%; padding-top:45%; text-align:center; width:100%;"><div style="position:relative;"><div style=" -webkit-animation:dkaXkpbBxI 1s ease-out infinite; animation:dkaXkpbBxI 1s ease-out infinite; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAAGFBMVEUiIiI9PT0eHh4gIB4hIBkcHBwcHBwcHBydr+JQAAAACHRSTlMABA4YHyQsM5jtaMwAAADfSURBVDjL7ZVBEgMhCAQBAf//42xcNbpAqakcM0ftUmFAAIBE81IqBJdS3lS6zs3bIpB9WED3YYXFPmHRfT8sgyrCP1x8uEUxLMzNWElFOYCV6mHWWwMzdPEKHlhLw7NWJqkHc4uIZphavDzA2JPzUDsBZziNae2S6owH8xPmX8G7zzgKEOPUoYHvGz1TBCxMkd3kwNVbU0gKHkx+iZILf77IofhrY1nYFnB/lQPb79drWOyJVa/DAvg9B/rLB4cC+Nqgdz/TvBbBnr6GBReqn/nRmDgaQEej7WhonozjF+Y2I/fZou/qAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-44px; width:44px;"></div><span style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:12px; font-style:normal; font-weight:bold; position:relative; top:15px;">Loading</span></div></div><p style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin:8px 0 0 0; padding:0 4px; word-wrap:break-word;"> Balloons</p><p style=" line-height:32px; margin-bottom:0; margin-top:8px; padding:0; text-align:center;"> <a href="https://instagram.com/p/r9vfPrmjeB/" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; text-decoration:none;" target="_top"> View on Instagram</a></p></div><style>@-webkit-keyframes"dkaXkpbBxI"{ 0%{opacity:0.5;} 50%{opacity:1;} 100%{opacity:0.5;} } @keyframes"dkaXkpbBxI"{ 0%{opacity:0.5;} 50%{opacity:1;} 100%{opacity:0.5;} }</style></blockquote>
11 * <script async defer src="https://platform.instagram.com/en_US/embeds.js"></script>
12 *
13 * @package automattic/jetpack
14 */
15
16 use Automattic\Jetpack\Connection\Client;
17 use Automattic\Jetpack\Constants;
18 use Automattic\Jetpack\Status;
19
20 if ( ! defined( 'ABSPATH' ) ) {
21 exit( 0 );
22 }
23
24 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
25 add_action( 'init', 'jetpack_instagram_enable_embeds' );
26 } else {
27 jetpack_instagram_enable_embeds();
28 }
29
30 /**
31 * Register Instagram as oembed provider, and add required filters for the API request.
32 * Add filter to reverse iframes to shortcode. Register [instagram] shortcode.
33 *
34 * @since 9.1.0
35 */
36 function jetpack_instagram_enable_embeds() {
37 wp_oembed_add_provider(
38 '#https?://(www\.)?instagr(\.am|am\.com)/(p|tv|reel)/.*#i',
39 'https://graph.facebook.com/v5.0/instagram_oembed/',
40 true
41 );
42
43 /**
44 * Handle an alternate Instagram URL format, where the username is also part of the URL.
45 */
46 wp_oembed_add_provider(
47 '#https?://(?:www\.)?instagr(?:\.am|am\.com)/(?:[^/]*)/(p|tv|reel)/([^\/]*)#i',
48 'https://graph.facebook.com/v5.0/instagram_oembed/',
49 true
50 );
51
52 /**
53 * Add auth token required by Instagram's oEmbed REST API, or proxy through WP.com.
54 */
55 add_filter( 'oembed_fetch_url', 'jetpack_instagram_oembed_fetch_url', 10, 3 );
56
57 /**
58 * Add JP auth headers if we're proxying through WP.com.
59 */
60 add_filter( 'oembed_remote_get_args', 'jetpack_instagram_oembed_remote_get_args', 10, 2 );
61
62 /**
63 * Embed reversal: Convert an embed code from Instagram.com to an oEmbeddable URL.
64 */
65 if ( jetpack_shortcodes_should_hook_pre_kses() ) {
66 add_filter( 'pre_kses', 'jetpack_instagram_embed_reversal' );
67 }
68
69 /**
70 * Add the shortcode.
71 */
72 add_shortcode( 'instagram', 'jetpack_shortcode_instagram' );
73 }
74
75 /**
76 * Embed Reversal for Instagram
77 *
78 * Hooked to pre_kses, converts an embed code from Instagram.com to an oEmbeddable URL.
79 *
80 * @param string $content Post content.
81 *
82 * @return string The filtered or the original content.
83 **/
84 function jetpack_instagram_embed_reversal( $content ) {
85 if ( ! is_string( $content ) || false === stripos( $content, 'instagram.com' ) ) {
86 return $content;
87 }
88
89 /*
90 * Sample embed code:
91 * <blockquote class="instagram-media" data-instgrm-captioned data-instgrm-version="2" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:8px;"><div style=" background:#F8F8F8; line-height:0; margin-top:40px; padding-bottom:55%; padding-top:45%; text-align:center; width:100%;"><div style="position:relative;"><div style=" -webkit-animation:dkaXkpbBxI 1s ease-out infinite; animation:dkaXkpbBxI 1s ease-out infinite; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAAGFBMVEUiIiI9PT0eHh4gIB4hIBkcHBwcHBwcHBydr+JQAAAACHRSTlMABA4YHyQsM5jtaMwAAADfSURBVDjL7ZVBEgMhCAQBAf//42xcNbpAqakcM0ftUmFAAIBE81IqBJdS3lS6zs3bIpB9WED3YYXFPmHRfT8sgyrCP1x8uEUxLMzNWElFOYCV6mHWWwMzdPEKHlhLw7NWJqkHc4uIZphavDzA2JPzUDsBZziNae2S6owH8xPmX8G7zzgKEOPUoYHvGz1TBCxMkd3kwNVbU0gKHkx+iZILf77IofhrY1nYFnB/lQPb79drWOyJVa/DAvg9B/rLB4cC+Nqgdz/TvBbBnr6GBReqn/nRmDgaQEej7WhonozjF+Y2I/fZou/qAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-44px; width:44px;"></div><span style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:12px; font-style:normal; font-weight:bold; position:relative; top:15px;">Loading</span></div></div><p style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin:8px 0 0 0; padding:0 4px; word-wrap:break-word;"> Balloons</p><p style=" line-height:32px; margin-bottom:0; margin-top:8px; padding:0; text-align:center;"> <a href="https://instagram.com/p/r9vfPrmjeB/" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; text-decoration:none;" target="_top"> View on Instagram</a></p></div><style>@-webkit-keyframes"dkaXkpbBxI"{ 0%{opacity:0.5;} 50%{opacity:1;} 100%{opacity:0.5;} } @keyframes"dkaXkpbBxI"{ 0%{opacity:0.5;} 50%{opacity:1;} 100%{opacity:0.5;} }</style></blockquote>
92 * <script async defer src="https://platform.instagram.com/en_US/embeds.js"></script>
93 */
94
95 $regexes = array();
96
97 // new style js.
98 $regexes[] = '#<blockquote[^>]+?class="instagram-media"[^>].+?>(.+?)</blockquote><script[^>]+?src="(https?:)?//platform\.instagram\.com/(.+?)/embeds\.js"></script>#ix';
99
100 // Let's play nice with the visual editor too.
101 $regexes[] = '#&lt;blockquote(?:[^&]|&(?!gt;))+?class="instagram-media"(?:[^&]|&(?!gt;)).+?&gt;(.+?)&lt;/blockquote&gt;&lt;script(?:[^&]|&(?!gt;))+?src="(https?:)?//platform\.instagram\.com/(.+?)/embeds\.js"(?:[^&]|&(?!gt;))*+&gt;&lt;/script&gt;#ix';
102
103 // old style iframe.
104 $regexes[] = '#<iframe[^>]+?src="((?:https?:)?//(?:www\.)?instagram\.com/p/([^"\'/]++)[^"\']*?)"[^>]*+>\s*?</iframe>#i';
105
106 // Let's play nice with the visual editor too.
107 $regexes[] = '#&lt;iframe(?:[^&]|&(?!gt;))+?src="((?:https?:)?//(?:www\.)instagram\.com/p/([^"\'/]++)[^"\']*?)"(?:[^&]|&(?!gt;))*+&gt;\s*?&lt;/iframe&gt;#i';
108
109 foreach ( $regexes as $regex ) {
110 if ( ! preg_match_all( $regex, $content, $matches, PREG_SET_ORDER ) ) {
111 continue;
112 }
113
114 foreach ( $matches as $match ) {
115 if ( ! preg_match( '#(https?:)?//(?:www\.)?instagr(\.am|am\.com)/p/([^/]*)#i', $match[1], $url_matches ) ) {
116 continue;
117 }
118
119 // Since we support Instagram via oEmbed, we simply leave a link on a line by itself.
120 $replace_regex = sprintf( '#\s*%s\s*#', preg_quote( $match[0], '#' ) );
121 $url = esc_url( $url_matches[0] );
122
123 $content = preg_replace( $replace_regex, sprintf( "\n\n%s\n\n", $url ), $content );
124 /** This action is documented in modules/shortcodes/youtube.php */
125 do_action( 'jetpack_embed_to_shortcode', 'instagram', $url );
126 }
127 }
128
129 return $content;
130 }
131
132 /**
133 * List of allowed and sanitized parameters
134 * that can be used with the Instagram oEmbed endpoint.
135 *
136 * Those parameters can be provided via the Instagram URL, or via shortcode parameters.
137 *
138 * @see https://developers.facebook.com/docs/graph-api/reference/instagram-oembed#parameters
139 *
140 * @since 9.1.0
141 *
142 * @param string $url URL of the content to be embedded.
143 * @param array $atts Shortcode attributes.
144 *
145 * @return array $params Array of parameters to be used in Instagram query.
146 */
147 function jetpack_instagram_get_allowed_parameters( $url, $atts = array() ) {
148 global $content_width;
149
150 // Any URL passed via a shortcode attribute takes precedence.
151 if ( ! empty( $atts['url'] ) ) {
152 $url = $atts['url'];
153 unset( $atts['url'] );
154 }
155
156 /*
157 * Get URL and parameters from the URL if possible.
158 *
159 * We'll also clean any other query params from the URL since Facebook's new API for Instagram
160 * embeds does not like query parameters. See p7H4VZ-2DU-p2.
161 */
162 $parsed_url = wp_parse_url( $url );
163 if ( $parsed_url && isset( $parsed_url['host'] ) && isset( $parsed_url['path'] ) ) {
164 // Bail early if this is not an Instagram URL.
165 if ( ! preg_match( '/(?:^|\.)instagr(?:\.am|am\.com)$/', $parsed_url['host'] ) ) {
166 return array();
167 }
168
169 $url = 'https://www.instagram.com' . $parsed_url['path'];
170
171 // If we have any parameters as part of the URL, we merge them with our attributes.
172 if ( ! empty( $parsed_url['query'] ) ) {
173 $query_args = array();
174 wp_parse_str( $parsed_url['query'], $query_args );
175
176 $atts = array_merge( $atts, $query_args );
177 }
178 } else {
179 return array();
180 }
181
182 $max_width = 698;
183 $min_width = 320;
184
185 $params = shortcode_atts(
186 array(
187 'url' => $url,
188 'width' => ( is_numeric( $content_width ) && $content_width > 0 ) ? $content_width : $max_width,
189 'height' => '',
190 'hidecaption' => false,
191 ),
192 $atts,
193 'instagram'
194 );
195
196 // Ensure width is within bounds.
197 $params['width'] = absint( $params['width'] );
198 if ( $params['width'] > $max_width ) {
199 $params['width'] = $max_width;
200 } elseif ( $params['width'] < $min_width ) {
201 $params['width'] = $min_width;
202 }
203
204 return $params;
205 }
206
207 /**
208 * Add auth token required by Instagram's oEmbed REST API, or proxy through WP.com.
209 *
210 * @since 9.1.0
211 *
212 * @param string $provider URL of the oEmbed provider.
213 * @param string $url URL of the content to be embedded.
214 * @param array $args Additional arguments for retrieving embed HTML.
215 *
216 * @return string
217 */
218 function jetpack_instagram_oembed_fetch_url( $provider, $url, $args ) {
219 if ( ! wp_startswith( $provider, 'https://graph.facebook.com/v5.0/instagram_oembed/' ) ) {
220 return $provider;
221 }
222
223 // Get a set of URL and parameters supported by Facebook.
224 $clean_parameters = jetpack_instagram_get_allowed_parameters( $url, $args );
225
226 // Replace existing URL by our clean version.
227 if ( ! empty( $clean_parameters['url'] ) ) {
228 $provider = add_query_arg( 'url', rawurlencode( $clean_parameters['url'] ), $provider );
229 }
230
231 // Our shortcode supports the width param, but the API expects maxwidth.
232 if ( ! empty( $clean_parameters['width'] ) ) {
233 $provider = add_query_arg( 'maxwidth', $clean_parameters['width'], $provider );
234 }
235
236 if ( ! empty( $clean_parameters['hidecaption'] ) ) {
237 $provider = add_query_arg( 'hidecaption', true, $provider );
238 }
239
240 $access_token = jetpack_instagram_get_access_token();
241
242 if ( ! empty( $access_token ) ) {
243 return add_query_arg( 'access_token', $access_token, $provider );
244 }
245
246 // If we don't have an access token, we go through the WP.com proxy instead.
247 // To that end, we need to make sure that we're connected to WP.com.
248 if ( ! Jetpack::is_connection_ready() || ( new Status() )->is_offline_mode() ) {
249 return $provider;
250 }
251
252 // @TODO Use Core's /oembed/1.0/proxy endpoint on WP.com
253 // (Currently not global but per-site, i.e. /oembed/1.0/sites/1234567/proxy)
254 // and deprecate /oembed-proxy/instagram endpoint.
255 $wpcom_oembed_proxy = Constants::get_constant( 'JETPACK__WPCOM_JSON_API_BASE' ) . '/wpcom/v2/oembed-proxy/instagram/';
256 return str_replace( 'https://graph.facebook.com/v5.0/instagram_oembed/', $wpcom_oembed_proxy, $provider );
257 }
258
259 /**
260 * Add JP auth headers if we're proxying through WP.com.
261 *
262 * @param array $args oEmbed remote get arguments.
263 * @param string $url URL to be inspected.
264 */
265 function jetpack_instagram_oembed_remote_get_args( $args, $url ) {
266 if ( ! wp_startswith( $url, Constants::get_constant( 'JETPACK__WPCOM_JSON_API_BASE' ) . '/wpcom/v2/oembed-proxy/instagram/' ) ) {
267 return $args;
268 }
269
270 $method = 'GET';
271 $signed_request = Client::build_signed_request(
272 compact( 'url', 'method' )
273 );
274
275 return $signed_request['request'];
276 }
277
278 /**
279 * Fetches a Facebook API access token used for query for Instagram embed information, if one is set.
280 *
281 * @return string The access token or ''
282 */
283 function jetpack_instagram_get_access_token() {
284 /**
285 * Filters the Instagram embed token that is used for querying the Facebook API.
286 *
287 * When this token is set, requests are not proxied through the WordPress.com API. Instead, a request is made directly to the
288 * Facebook API to query for information about the embed which should provide a performance benefit.
289 *
290 * @module shortcodes
291 *
292 * @since 9.0.0
293 *
294 * @param string string The access token set via the JETPACK_INSTAGRAM_EMBED_TOKEN constant.
295 */
296 return (string) apply_filters( 'jetpack_instagram_embed_token', (string) Constants::get_constant( 'JETPACK_INSTAGRAM_EMBED_TOKEN' ) );
297 }
298
299 /**
300 * Display the Instagram shortcode.
301 *
302 * @param array $atts Shortcode attributes.
303 */
304 function jetpack_shortcode_instagram( $atts ) {
305 global $wp_embed;
306
307 if ( empty( $atts['url'] ) ) {
308 return '';
309 }
310
311 $atts = jetpack_instagram_get_allowed_parameters( $atts['url'], $atts );
312
313 if ( empty( $atts['url'] ) ) {
314 return '';
315 }
316
317 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
318 $url_pattern = '#http(s?)://(www\.)?instagr(\.am|am\.com)/(p|tv|reel)/([^/?]+)#i';
319 preg_match( $url_pattern, $atts['url'], $matches );
320 if ( ! $matches ) {
321 return sprintf(
322 '<a href="%1$s" class="amp-wp-embed-fallback">%1$s</a>',
323 esc_url( $atts['url'] )
324 );
325 }
326
327 $shortcode_id = end( $matches );
328 $width = ! empty( $atts['width'] ) ? $atts['width'] : 600;
329 $height = ! empty( $atts['height'] ) ? $atts['height'] : 600;
330 return sprintf(
331 '<amp-instagram data-shortcode="%1$s" layout="responsive" width="%2$d" height="%3$d" data-captioned></amp-instagram>',
332 esc_attr( $shortcode_id ),
333 absint( $width ),
334 absint( $height )
335 );
336 }
337
338 return $wp_embed->shortcode( $atts, $atts['url'] );
339 }
340