PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 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 All 508 releases
← All changes | modules/shortcodes/twitter.php +86 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,86 @@
1 +<?php
2 +/**
3 + * Twitter/X oEmbed proxy functionality.
4 + *
5 + * This file handles proxying Twitter/X oEmbed requests through Automattic's infrastructure
6 + * to minimize issues with rate limiting with 404 responses from Twitter/X.
7 + *
8 + * Unlike tweet.php which handles the [tweet] shortcode, this file provides core oEmbed support
9 + * and is force-loaded via module-extras.php regardless of module status.
10 + *
11 + * @package automattic/jetpack
12 + * @since 14.5
13 + */
14 +
15 +use Automattic\Jetpack\Connection\Client;
16 +use Automattic\Jetpack\Constants;
17 +use Automattic\Jetpack\Status;
18 +
19 +if ( ! defined( 'ABSPATH' ) ) {
20 + exit( 0 );
21 +}
22 +
23 +/**
24 + * Update Twitter providers to use Automattic's Twitter/X oEmbed proxy.
25 + *
26 + * See paFLeq-3QD-p2.
27 + *
28 + * @param string $provider The URL of the oEmbed provider.
29 + *
30 + * @return string The modified URL of the oEmbed provider.
31 + */
32 +function jetpack_proxy_twitter_oembed_provider( $provider ) {
33 + if ( ! wp_startswith( $provider, 'https://publish.twitter.com/oembed' ) ) {
34 + return $provider;
35 + }
36 +
37 + // Allow other plugins to override the proxy URL. This constant should be set on the WordPress.com side
38 + // to handle proxying after we're authenticated the request with the Jetpack token.
39 + $oembed_proxy_url = Constants::is_defined( 'JETPACK__TWITTER_OEMBED_PROXY_URL' )
40 + ? Constants::get_constant( 'JETPACK__TWITTER_OEMBED_PROXY_URL' )
41 + : '';
42 +
43 + // If we don't have a proxy URL, then we'll try to proxy through the WordPress.com.
44 + // To that end, we need to make sure that we're connected to WP.com and that we're not in offline mode.
45 + if ( empty( $oembed_proxy_url ) ) {
46 + if ( ! Jetpack::is_connection_ready() || ( new Status() )->is_offline_mode() ) {
47 + return $provider;
48 + }
49 +
50 + $oembed_proxy_url = esc_url_raw(
51 + sprintf(
52 + '%s/wpcom/v2/oembed-proxy',
53 + JETPACK__WPCOM_JSON_API_BASE,
54 + Jetpack_Options::get_option( 'id' )
55 + )
56 + );
57 +
58 + add_filter( 'oembed_remote_get_args', 'jetpack_twitter_oembed_remote_get_args', 10, 2 );
59 + }
60 +
61 + return str_replace( 'https://publish.twitter.com/oembed', $oembed_proxy_url, $provider );
62 +}
63 +add_filter( 'oembed_fetch_url', 'jetpack_proxy_twitter_oembed_provider', 10 );
64 +
65 +/**
66 + * Add JP auth headers if we're proxying through WP.com.
67 + *
68 + * @param array $args oEmbed remote get arguments.
69 + * @param string $url URL to be inspected.
70 + */
71 +function jetpack_twitter_oembed_remote_get_args( $args, $url ) {
72 + if ( ! wp_startswith( $url, Constants::get_constant( 'JETPACK__WPCOM_JSON_API_BASE' ) ) ) {
73 + return $args;
74 + }
75 +
76 + $method = 'GET';
77 + $signed_request = Client::build_signed_request(
78 + compact( 'url', 'method' )
79 + );
80 +
81 + if ( is_wp_error( $signed_request ) ) {
82 + return $args;
83 + }
84 +
85 + return $signed_request['request'];
86 +}