PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.0.3
Jetpack – WP Security, Backup, Speed, & Growth v12.0.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / shortcodes / tweet.php
jetpack / modules / shortcodes Last commit date
css 4 years ago images 12 years ago img 13 years ago js 4 years ago archiveorg-book.php 5 years ago archiveorg.php 5 years ago archives.php 5 years ago bandcamp.php 5 years ago brightcove.php 5 years ago cartodb.php 5 years ago class.filter-embedded-html-objects.php 3 years ago codepen.php 5 years ago crowdsignal.php 3 years ago dailymotion.php 3 years ago descript.php 4 years ago facebook.php 3 years ago flatio.php 5 years ago flickr.php 5 years ago getty.php 3 years ago gist.php 5 years ago googleapps.php 3 years ago googlemaps.php 5 years ago googleplus.php 5 years ago gravatar.php 3 years ago houzz.php 5 years ago inline-pdfs.php 4 years ago instagram.php 3 years ago kickstarter.php 3 years ago mailchimp.php 3 years ago medium.php 3 years ago mixcloud.php 3 years ago others.php 3 years ago pinterest.php 5 years ago presentations.php 3 years ago quiz.php 4 years ago recipe.php 3 years ago scribd.php 5 years ago sitemap.php 5 years ago slideshare.php 5 years ago slideshow.php 3 years ago smartframe.php 4 years ago soundcloud.php 3 years ago spotify.php 4 years ago ted.php 5 years ago tweet.php 5 years ago twitchtv.php 5 years ago twitter-timeline.php 5 years ago unavailable.php 3 years ago untappd-menu.php 3 years ago upcoming-events.php 3 years ago ustream.php 5 years ago videopress.php 4 years ago vimeo.php 3 years ago vine.php 5 years ago vr.php 3 years ago wordads.php 5 years ago wufoo.php 3 years ago youtube.php 3 years ago
tweet.php
288 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Tweet shortcode.
4 * Params map to key value pairs, and all but tweet are optional:
5 * tweet = id or permalink url* (Required)
6 * align = none|left|right|center
7 * width = number in pixels example: width="300"
8 * lang = en|fr|de|ko|etc... language country code.
9 * hide_thread = true | false **
10 * hide_media = true | false **
11 *
12 * Basic:
13 * [tweet https://twitter.com/jack/statuses/20 width="350"]
14 *
15 * More parameters and another tweet syntax admitted:
16 * [tweet tweet="https://twitter.com/jack/statuses/20" align="left" width="350" align="center" lang="es"]
17 *
18 * @package automattic/jetpack
19 */
20
21 add_shortcode( 'tweet', array( 'Jetpack_Tweet', 'jetpack_tweet_shortcode' ) );
22
23 /**
24 * Tweet Shortcode class.
25 */
26 class Jetpack_Tweet {
27
28 /**
29 * Array of arguments about a tweet.
30 *
31 * @var array
32 */
33 public static $provider_args;
34
35 /**
36 * Parse shortcode arguments and render its output.
37 *
38 * @since 4.5.0
39 *
40 * @param array $atts Shortcode parameters.
41 *
42 * @return string
43 */
44 public static function jetpack_tweet_shortcode( $atts ) {
45 global $wp_embed;
46
47 $default_atts = array(
48 'tweet' => '',
49 'align' => 'none',
50 'width' => '',
51 'lang' => 'en',
52 'hide_thread' => 'false',
53 'hide_media' => 'false',
54 );
55
56 $attr = shortcode_atts( $default_atts, $atts );
57
58 self::$provider_args = $attr;
59
60 /*
61 * figure out the tweet id for the requested tweet
62 * supporting both omitted attributes and tweet="tweet_id"
63 * and supporting both an id and a URL
64 */
65 if ( empty( $attr['tweet'] ) && ! empty( $atts[0] ) ) {
66 $attr['tweet'] = $atts[0];
67 }
68
69 if ( ctype_digit( $attr['tweet'] ) ) {
70 $id = 'https://twitter.com/jetpack/status/' . $attr['tweet'];
71 $tweet_id = (int) $attr['tweet'];
72 } else {
73 preg_match( '/^http(s|):\/\/twitter\.com(\/\#\!\/|\/)([a-zA-Z0-9_]{1,20})\/status(es)*\/(\d+)$/', $attr['tweet'], $urlbits );
74
75 if ( isset( $urlbits[5] ) && (int) $urlbits[5] ) {
76 $id = 'https://twitter.com/' . $urlbits[3] . '/status/' . (int) $urlbits[5];
77 $tweet_id = (int) $urlbits[5];
78 } else {
79 return '<!-- Invalid tweet id -->';
80 }
81 }
82
83 /*
84 * Fetch tweet.
85 *
86 * On WordPress.com, we also cache tweets for better performance and less requests.
87 */
88 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
89 /*
90 * See if we have the tweet stored in our tweet store
91 * if not get_tweet_store queues up a job to request
92 */
93 $data = get_tweet_store( $tweet_id );
94 if ( $data ) {
95 $tweet_handler = new Tweet_Handler();
96
97 /*
98 * Replace Unicode characters with ther entities like Blackbird Pie v 0.3.2 did
99 * to store tweets from other languages (important for non-english bloggers)
100 */
101 $data->text = $tweet_handler->unicode_replace_entities( $data->text );
102 $data->user->screen_name = $tweet_handler->unicode_replace_entities( $data->user->screen_name );
103 $data->user->name = $tweet_handler->unicode_replace_entities( $data->user->name );
104
105 $tweet = esc_html( $data->text );
106 $tweet = $tweet_handler->expand_tco_links( $tweet, $data );
107
108 $tweet = $tweet_handler->autolink( $tweet );
109
110 $screen_name = esc_html( $data->user->screen_name );
111 $name = esc_html( $data->user->name );
112
113 $url = 'https://twitter.com/' . $screen_name . '/status/' . (int) $data->id;
114
115 // Only show the user's real name if they set it to something different from their screename.
116 if ( $screen_name !== $name ) {
117 $real_name = '<br />' . $name;
118 } else {
119 $real_name = '<br />&nbsp;';
120 }
121
122 $time = strtotime( $data->created_at );
123 $human_readable = gmdate( 'F d, Y', $time );
124 $data_datetime = gmdate( 'Y-m-d\TH:i:sP', $time );
125
126 /*
127 * Additional params.
128 */
129
130 // align (float).
131 $extra_classes = '';
132 if ( in_array( $attr['align'], array( 'left', 'right', 'center' ), true ) ) {
133 $extra_classes = ' tw-align-' . $attr['align'];
134 }
135
136 if ( 'true' === $attr['hide_thread'] ) {
137 $extra_classes .= ' tw-hide-thread';
138 }
139
140 if ( 'true' === $attr['hide_media'] ) {
141 $extra_classes .= ' tw-hide-media';
142 }
143
144 // lang.
145 $lang = substr( $attr['lang'], 0, 2 );
146 if ( empty( $lang ) ) {
147 $lang = 'en';
148 }
149
150 // width.
151 $width_html = '';
152 $width = (int) $attr['width'];
153 if ( $width > 100 ) {
154 $width_html = ' width="' . esc_attr( $width ) . '"';
155 }
156
157 // in reply to id (conversation tweets).
158 $in_reply_to_html = '';
159 $in_reply_to = (int) $data->in_reply_to_status_id;
160 if ( ! empty( $in_reply_to ) && 'false' === $attr['hide_thread'] ) {
161 $in_reply_to_html = ' data-in-reply-to="' . esc_attr( $in_reply_to ) . '"';
162 }
163
164 // Generate the HTML output.
165 $output = sprintf(
166 '<blockquote class="twitter-tweet%1$s"%2$s%3$s lang="%4$s"><p>%5$s</p>&mdash; %6$s (@%7$s) <a href="%8$s" data-datetime="%9$s">%10$s</a></blockquote>',
167 esc_attr( $extra_classes ),
168 $width_html,
169 $in_reply_to_html,
170 esc_attr( $lang ),
171 $tweet,
172 wp_kses( $real_name, array( 'br' => array() ) ),
173 esc_html( $screen_name ),
174 esc_url( $url ),
175 esc_attr( $data_datetime ),
176 esc_html( $human_readable )
177 );
178 } else {
179 /**
180 * Filter the default display when a tweet is not available in the store.
181 * Not available in Jetpack.
182 *
183 * @module shortcodes
184 *
185 * @since 5.1.0
186 *
187 * @param string $message Default display when a tweet is not available.
188 * @param string $id Twitter URL.
189 * @param array $attr Shortcode attributes.
190 */
191 return apply_filters( 'tweet_shortcode_pending_tweet', '', $id, $attr );
192 }
193 } else {
194 // Add shortcode arguments to provider URL.
195 add_filter( 'oembed_fetch_url', array( 'Jetpack_Tweet', 'jetpack_tweet_url_extra_args' ), 10, 3 );
196
197 /*
198 * In Jetpack, we use $wp_embed->shortcode() to return the tweet output.
199 * @see https://github.com/Automattic/jetpack/pull/11173
200 */
201 $output = $wp_embed->shortcode( $atts, $id );
202
203 // Clean up filter.
204 remove_filter( 'oembed_fetch_url', array( 'Jetpack_Tweet', 'jetpack_tweet_url_extra_args' ), 10 );
205 }
206
207 /** This action is documented in modules/widgets/social-media-icons.php */
208 do_action( 'jetpack_bump_stats_extras', 'embeds', 'tweet' );
209
210 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
211 $width = ! empty( $attr['width'] ) ? $attr['width'] : 600;
212 $height = 480;
213 $output = sprintf(
214 '<amp-twitter data-tweetid="%1$s" layout="responsive" width="%2$d" height="%3$d"></amp-twitter>',
215 esc_attr( $tweet_id ),
216 absint( $width ),
217 absint( $height )
218 );
219 } else {
220 // Add Twitter widgets.js script to the footer.
221 add_action( 'wp_footer', array( 'Jetpack_Tweet', 'jetpack_tweet_shortcode_script' ) );
222 }
223
224 return $output;
225 }
226
227 /**
228 * Adds parameters to URL used to fetch the tweet.
229 *
230 * @since 4.5.0
231 *
232 * @param string $provider URL of provider that supplies the tweet we're requesting.
233 * @param string $url URL of tweet to embed.
234 * @param array $args Parameters supplied to shortcode and passed to wp_oembed_get.
235 *
236 * @return string
237 */
238 public static function jetpack_tweet_url_extra_args( $provider, $url, $args = array() ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
239 foreach ( self::$provider_args as $key => $value ) {
240 switch ( $key ) {
241 case 'align':
242 case 'lang':
243 case 'hide_thread':
244 case 'hide_media':
245 $provider = add_query_arg( $key, $value, $provider );
246 break;
247 }
248 }
249
250 // Disable script since we're enqueing it in our own way in the footer.
251 $provider = add_query_arg( 'omit_script', 'true', $provider );
252
253 // Twitter doesn't support maxheight so don't send it.
254 $provider = remove_query_arg( 'maxheight', $provider );
255
256 /**
257 * Filter the Twitter Partner ID.
258 *
259 * @module shortcodes
260 *
261 * @since 4.6.0
262 *
263 * @param string $partner_id Twitter partner ID.
264 */
265 $partner = apply_filters( 'jetpack_twitter_partner_id', 'jetpack' );
266
267 // Add Twitter partner ID to track embeds from Jetpack.
268 if ( ! empty( $partner ) ) {
269 $provider = add_query_arg( 'partner', $partner, $provider );
270 }
271
272 return $provider;
273 }
274
275 /**
276 * Enqueue front end assets.
277 *
278 * @since 4.5.0
279 */
280 public static function jetpack_tweet_shortcode_script() {
281 if ( ! wp_script_is( 'twitter-widgets', 'registered' ) ) {
282 wp_register_script( 'twitter-widgets', 'https://platform.twitter.com/widgets.js', array(), JETPACK__VERSION, true );
283 wp_print_scripts( 'twitter-widgets' );
284 }
285 }
286
287 } // class end
288