| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php
- /**
- * Embed support for Medium
- *
- * Supported formats:
- * - Profiles: https://medium.com/@jeherve
- * - Stories: https://medium.com/@jeherve/this-is-a-story-19f582daaf5b
- * - And all the above in shortcode formats:
- * [medium url="https://medium.com/@jeherve/this-is-a-story-19f582daaf5b" width="100%" border="false" collapsed="true"]
- *
- * @package automattic/jetpack
- */
- // Faux-oembed support for Medium permalinks.
- wp_embed_register_handler( 'medium', '#^https?://medium.com/([a-zA-z0-9-_@]+)#', 'jetpack_embed_medium_oembed' );
- /**
- * Callback to modify output of embedded Medium posts.
- *
- * @param array $matches Regex partial matches against the URL passed.
- * @param array $attr Attributes received in embed response.
- * @param array $url Requested URL to be embedded.
- */
- function jetpack_embed_medium_oembed( $matches, $attr, $url ) {
- $attr = jetpack_embed_medium_args( $attr );
- $attr['url'] = $url;
- return jetpack_embed_medium_embed_html( $attr );
- }
- /**
- * Return custom markup to display a Medium profile, collection, or story.
- *
- * @param array $args Attributes received in embed response.
- */
- function jetpack_embed_medium_embed_html( $args ) {
- $args = jetpack_embed_medium_args( $args );
- if ( empty( $args['url'] ) ) {
- return;
- }
- $args['type'] = jetpack_embed_medium_get_embed_type( $args['url'] );
- if ( 'collection' === $args['type'] ) {
- return sprintf(
- '<a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a>',
- esc_url( $args['url'] ),
- esc_html__( 'View this collection on Medium.com', 'jetpack' )
- );
- }
- wp_enqueue_script(
- 'medium-embed',
- 'https://static.medium.com/embed.js',
- array(),
- JETPACK__VERSION,
- true
- );
- return sprintf(
- '<a class="m-%1$s" href="%2$s" target="_blank" data-width="%3$s" data-border="%4$s" data-collapsed="%5$s">%6$s</a>',
- esc_attr( $args['type'] ),
- esc_url( $args['url'] ),
- esc_attr( $args['width'] ),
- esc_attr( $args['border'] ),
- esc_attr( $args['collapsed'] ),
- esc_html__( 'View at Medium.com', 'jetpack' )
- );
- }
- /**
- * Shortcode support that allows passing in URL
- *
- * @param array $atts Shortcode attributes.
- */
- function jetpack_embed_medium_shortcode( $atts ) {
- $atts = jetpack_embed_medium_args( $atts );
- if ( ! empty( $atts['url'] ) ) {
- global $wp_embed;
- return $wp_embed->shortcode( $atts, $atts['url'] );
- } else {
- if ( current_user_can( 'edit_posts' ) ) {
- return esc_html__( 'You did not provide a valid Medium URL.', 'jetpack' );
- } else {
- return '<!-- Missing Medium URL -->';
- }
- }
- }
- add_shortcode( 'medium', 'jetpack_embed_medium_shortcode' );
- /**
- * Get embed type (profile, collection, or story) based on Medium URL.
- *
- * @param string $url Medium URL.
- */
- function jetpack_embed_medium_get_embed_type( $url ) {
- $url_path = wp_parse_url( $url, PHP_URL_PATH );
- if ( preg_match( '/^\/@[\.\w]+$/', $url_path ) ) {
- return 'profile';
- } elseif ( preg_match( '/^\/(?:s)\/(.+)$/', $url_path ) ) {
- return 'collection';
- }
- return 'story';
- }
- /**
- * Process Medium shortcode attributes.
- *
- * @param array $atts Shortcode attributes.
- */
- function jetpack_embed_medium_args( $atts ) {
- return shortcode_atts(
- array(
- 'url' => '',
- 'width' => '400',
- 'border' => true,
- 'collapsed' => false,
- ),
- $atts,
- 'medium'
- );
- }
|