PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.1.3
Jetpack – WP Security, Backup, Speed, & Growth v12.1.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 / extensions / blocks / anchor-fm / anchor-fm.php
jetpack / extensions / blocks / anchor-fm Last commit date
anchor-fm.php 3 years ago
anchor-fm.php
225 lines
1 <?php
2 /**
3 * Anchor.fm integration.
4 *
5 * @since 9.3.0
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\AnchorFm;
11
12 use Automattic\Jetpack\Assets;
13 use Automattic\Jetpack\Blocks;
14 use Jetpack_Podcast_Helper;
15
16 const FEATURE_NAME = 'anchor-fm';
17 const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
18
19 if ( ! class_exists( 'Jetpack_Podcast_Helper' ) ) {
20 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class-jetpack-podcast-helper.php';
21 }
22
23 /**
24 * Registers Anchor.fm integration for the block editor.
25 */
26 function register_extension() {
27 Blocks::jetpack_register_block( BLOCK_NAME );
28
29 // Register post_meta for connecting Anchor podcasts with posts.
30 register_post_meta(
31 'post',
32 'jetpack_anchor_podcast',
33 array(
34 'show_in_rest' => true,
35 'single' => true,
36 'type' => 'string',
37 )
38 );
39 register_post_meta(
40 'post',
41 'jetpack_anchor_episode',
42 array(
43 'show_in_rest' => true,
44 'single' => true,
45 'type' => 'string',
46 )
47 );
48 register_post_meta(
49 'post',
50 'jetpack_anchor_spotify_show',
51 array(
52 'show_in_rest' => true,
53 'single' => true,
54 'type' => 'string',
55 )
56 );
57 }
58
59 /**
60 * Checks URL params to determine the Anchor integration action to perform.
61 */
62 function process_anchor_params() {
63 if (
64 ! function_exists( 'get_current_screen' )
65 || \get_current_screen() === null
66 ) {
67 return;
68 }
69
70 // Return early if we are not in the block editor.
71 if ( ! wp_should_load_block_editor_scripts_and_styles() ) {
72 return;
73 }
74
75 $post = get_post();
76 if ( ! $post || ! $post->ID ) {
77 return;
78 }
79
80 // phpcs:disable WordPress.Security.NonceVerification.Recommended
81 $podcast_id = isset( $_GET['anchor_podcast'] ) ? sanitize_text_field( wp_unslash( $_GET['anchor_podcast'] ) ) : null;
82 $episode_id = isset( $_GET['anchor_episode'] ) ? sanitize_text_field( wp_unslash( $_GET['anchor_episode'] ) ) : null;
83 $spotify_url = isset( $_GET['spotify_url'] ) ? esc_url_raw( wp_unslash( $_GET['spotify_url'] ) ) : null;
84 // phpcs:enable WordPress.Security.NonceVerification.Recommended
85
86 $data = array(
87 'actions' => array(),
88 );
89
90 // add / update Spotify Badge URL.
91 $valid_spotify_url = \Jetpack_Gutenberg::validate_block_embed_url( $spotify_url, array( 'open.spotify.com' ) );
92 if ( $valid_spotify_url ) {
93 $data['spotifyShowUrl'] = $valid_spotify_url;
94 if ( get_post_meta( $post->ID, 'jetpack_anchor_spotify_show', true ) !== $valid_spotify_url ) {
95 update_post_meta( $post->ID, 'jetpack_anchor_spotify_show', $valid_spotify_url );
96 }
97 }
98
99 if ( ! empty( $podcast_id ) ) {
100 $feed = 'https://anchor.fm/s/' . $podcast_id . '/podcast/rss';
101 $podcast_helper = new Jetpack_Podcast_Helper( $feed );
102 $rss = $podcast_helper->load_feed();
103 if ( ! \is_wp_error( $rss ) ) {
104 update_post_meta( $post->ID, 'jetpack_anchor_podcast', $podcast_id );
105
106 // If we haven't got an episode ID, try and get the latest episode.
107 if ( empty( $episode_id ) && $rss->get_item_quantity() ) {
108 $latest_episode = $rss->get_item( 0 );
109 if ( $latest_episode ) {
110 $episode_id = $latest_episode->get_id();
111 }
112 }
113
114 if ( ! empty( $episode_id ) ) {
115 $track = $podcast_helper->get_track_data( $episode_id, true );
116 if ( ! \is_wp_error( $track ) ) {
117 update_post_meta( $post->ID, 'jetpack_anchor_episode', $track['guid'] );
118
119 if ( 'post-new.php' === $GLOBALS['pagenow'] ) {
120 $data['actions'][] = array(
121 'set-episode-title',
122 array(
123 'title' => $track['title'],
124 ),
125 );
126
127 $self_links = $rss->get_links( 'self' );
128 $cover = $rss->get_image_url();
129
130 // Add insert basic template action.
131 $data['actions'][] = array(
132 'insert-episode-template',
133 array(
134 'feedUrl' => ! empty( $self_links ) ? esc_url_raw( $self_links[0] ) : $feed,
135 'coverImage' => ! empty( $cover ) ? esc_url( $cover ) : null,
136 'episodeTrack' => $track,
137 'spotifyImageUrl' => Assets::staticize_subdomain( 'https://wordpress.com/i/spotify-badge.svg' ),
138 'spotifyShowUrl' => esc_url_raw( $valid_spotify_url ),
139 ),
140 );
141 }
142 } else {
143 $retry_url = add_query_arg(
144 array(
145 'anchor_episode' => $episode_id,
146 'anchor_podcast' => $podcast_id,
147 'spotify_url' => $valid_spotify_url ? rawurlencode( $spotify_url ) : false,
148 ),
149 admin_url( 'post-new.php' )
150 );
151 $data['actions'][] = array(
152 'create-episode-error-notice',
153 array(
154 'retry_url' => esc_url_raw( $retry_url ),
155 ),
156 );
157 }
158 }
159 }
160 }
161
162 // Add Spotify Badge template action.
163 if (
164 $valid_spotify_url && (
165 'post-new.php' !== $GLOBALS['pagenow'] // Delegate badge insertion to podcast template.
166 )
167 ) {
168 $data['actions'][] = array(
169 'insert-spotify-badge',
170 array(
171 'spotifyImageUrl' => Assets::staticize_subdomain( 'https://wordpress.com/i/spotify-badge.svg' ),
172 'spotifyShowUrl' => esc_url_raw( $valid_spotify_url ),
173 ),
174 );
175 }
176
177 // Display an outbound link after publishing a post (only to English-speaking users since Anchor
178 // is English only). This is only displayed if the blog is connected to an Anchor podcast.
179 $blog_connected_to_anchor = function_exists( 'get_blog_option' ) && false !== get_blog_option( get_current_blog_id(), 'anchor_podcast' );
180
181 /**
182 * Allows disabling the Anchor convert to audio prompt.
183 *
184 * @since 12.1
185 *
186 * @param bool $is_anchor_enabled Whether the prompt is enabled or not.
187 */
188 $is_anchor_enabled = apply_filters( 'jetpack_is_anchor_enabled', true );
189
190 if (
191 $is_anchor_enabled &&
192 'post' === get_post_type() &&
193 ! get_post_meta( $post->ID, 'jetpack_anchor_spotify_show', true ) &&
194 0 === strpos( get_user_locale(), 'en' ) &&
195 $blog_connected_to_anchor
196 ) {
197 $data['actions'][] = 'show-post-publish-outbound-link';
198 }
199
200 wp_localize_script( 'jetpack-blocks-editor', 'Jetpack_AnchorFm', $data );
201 }
202
203 /**
204 * Function to check if the Anchor feature is enabled. This is used in the
205 * filter below.
206 *
207 * @param bool $is_anchor_enabled filter input value.
208 * @return bool whether the feature is enabled or not.
209 */
210 function is_anchor_enabled( $is_anchor_enabled ) {
211 if ( ! $is_anchor_enabled ) {
212 return false;
213 }
214
215 return time() < strtotime( '2023-05-11 00:00:00 UTC' );
216 }
217
218 add_filter(
219 'jetpack_is_anchor_enabled',
220 __NAMESPACE__ . '\is_anchor_enabled'
221 );
222
223 add_action( 'init', __NAMESPACE__ . '\register_extension' );
224 add_action( 'enqueue_block_assets', __NAMESPACE__ . '\process_anchor_params' );
225