WordPress.org

Make WordPress Core

Ticket #31139: 31139.2.diff

File 31139.2.diff, 9.6 KB (added by wonderboymusic, 7 years ago)
  • src/wp-admin/includes/ajax-actions.php

     
    27052705        }
    27062706
    27072707        $shortcode = wp_unslash( $_POST['shortcode'] );
    2708         $url = str_replace( '[embed]', '', str_replace( '[/embed]', '', $shortcode ) );
     2708
     2709        preg_match( '/' . get_shortcode_regex() . '/s', $shortcode, $matches );
     2710        $atts = shortcode_parse_atts( $matches[3] );
     2711        if ( ! empty( $atts[5] ) ) {
     2712                $url = $atts[5];
     2713        } elseif ( ! empty( $atts['src'] ) ) {
     2714                $url = $atts['src'];
     2715        }
     2716
    27092717        $parsed = false;
    27102718        setup_postdata( $post );
    27112719
    27122720        $wp_embed->return_false_on_fail = true;
    27132721
    2714         if ( is_ssl() && preg_match( '%^\\[embed[^\\]]*\\]http://%i', $shortcode ) ) {
     2722        if ( is_ssl() && 0 === strpos( $url, 'http://' ) ) {
    27152723                // Admin is ssl and the user pasted non-ssl URL.
    27162724                // Check if the provider supports ssl embeds and use that for the preview.
    27172725                $ssl_shortcode = preg_replace( '%^(\\[embed[^\\]]*\\])http://%i', '$1https://', $shortcode );
     
    27642772        }
    27652773
    27662774        wp_send_json_success( array(
    2767                 'body' => $parsed
     2775                'body' => $parsed,
     2776                'attr' => $wp_embed->last_attr
    27682777        ) );
    27692778}
    27702779
  • src/wp-includes/class-wp-embed.php

     
    1111        public $post_ID;
    1212        public $usecache = true;
    1313        public $linkifunknown = true;
     14        public $last_attr = array();
     15        public $last_url = '';
    1416
    1517        /**
    1618         * When an URL cannot be embedded, return false instead of returning a link
     
    134136                        $url = $attr['src'];
    135137                }
    136138
    137                 if ( empty( $url ) )
     139                $this->last_url = $url;
     140
     141                if ( empty( $url ) ) {
     142                        $this->last_attr = $attr;
    138143                        return '';
     144                }
    139145
    140146                $rawattr = $attr;
    141147                $attr = wp_parse_args( $attr, wp_embed_defaults( $url ) );
    142148
     149                $this->last_attr = $attr;
     150
    143151                // kses converts & into & and we need to undo this
    144152                // See https://core.trac.wordpress.org/ticket/11311
    145153                $url = str_replace( '&', '&', $url );
  • src/wp-includes/css/media-views.css

     
    19511951        clear: both;
    19521952}
    19531953
     1954.embed-link-settings .setting {
     1955        display: none;
     1956}
     1957
     1958.embed-link-dimensions:after {
     1959        content: '';
     1960        display: block;
     1961        clear: both;
     1962}
     1963
     1964.embed-link-dimensions .width,
     1965.embed-link-dimensions .height {
     1966        float: left;
     1967        width: 125px;
     1968        clear: none;
     1969        margin-right: 10px;
     1970}
     1971
     1972.embed-link-dimensions input {
     1973        width: auto;
     1974        max-width: 110px;
     1975}
     1976
    19541977.image-details .embed-media-settings .setting {
    19551978        float: none;
    19561979        width: auto;
     
    19972020.media-embed .setting span {
    19982021        display: block;
    19992022        width: 200px;
     2023        max-width: 100%;
    20002024        font-size: 13px;
    20012025        line-height: 24px;
    20022026        color: #666;
  • src/wp-includes/js/mce-view.js

     
    763763                edit: function( text, update ) {
    764764                        var media = wp.media.embed,
    765765                                frame = media.edit( text, !! this.url ),
    766                                 self = this;
     766                                self = this,
     767                                events = 'change:url change:width change:height';
    767768
    768769                        this.pausePlayers();
    769770
    770                         frame.state( 'embed' ).props.on( 'change:url', function( model, url ) {
    771                                 if ( url ) {
     771                        frame.state( 'embed' ).props.on( events, function( model, url ) {
     772                                if ( url && model.get( 'url' ) ) {
    772773                                        frame.state( 'embed' ).metadata = model.toJSON();
    773774                                }
    774775                        } );
    775776
    776777                        frame.state( 'embed' ).on( 'select', function() {
    777                                 if ( self.url ) {
    778                                         update( frame.state( 'embed' ).metadata.url );
     778                                var data = frame.state( 'embed' ).metadata;
     779
     780                                if ( data.width ) {
     781                                        delete self.url;
    779782                                } else {
    780                                         update( media.shortcode( frame.state( 'embed' ).metadata ).string() );
     783                                        self.url = data.url;
    781784                                }
     785
     786                                if ( self.url  ) {
     787                                        update( data.url );
     788                                } else {
     789                                        update( media.shortcode( data ).string() );
     790                                }
    782791                        } );
    783792
    784793                        frame.on( 'close', function() {
  • src/wp-includes/js/media/views/embed/link.js

     
    2020        initialize: function() {
    2121                this.spinner = $('<span class="spinner" />');
    2222                this.$el.append( this.spinner[0] );
    23                 this.listenTo( this.model, 'change:url', this.updateoEmbed );
     23                this.listenTo( this.model, 'change:url change:width change:height', this.updateoEmbed );
    2424        },
    2525
    26         updateoEmbed: function() {
     26        updateoEmbed: _.debounce( function() {
    2727                var url = this.model.get( 'url' );
    2828
    29                 this.$('.setting.title').show();
    3029                // clear out previous results
    3130                this.$('.embed-container').hide().find('.embed-preview').html('');
    3231
     
    3736
    3837                this.spinner.show();
    3938
    40                 setTimeout( _.bind( this.fetch, this ), 500 );
    41         },
     39                this.fetch();
     40        }, 600 ),
    4241
    4342        fetch: function() {
     43                var embed;
     44
    4445                // check if they haven't typed in 500 ms
    4546                if ( $('#embed-url-field').val() !== this.model.get('url') ) {
    4647                        return;
    4748                }
    4849
     50                embed = new wp.shortcode({
     51                        tag: 'embed',
     52                        attrs: _.pick( this.model.attributes, [ 'width', 'height', 'src' ] ),
     53                        content: this.model.get('url')
     54                });
     55
    4956                wp.ajax.send( 'parse-embed', {
    5057                        data : {
    5158                                post_ID: wp.media.view.settings.post.id,
    52                                 shortcode: '[embed]' + this.model.get('url') + '[/embed]'
     59                                shortcode: embed.string()
    5360                        }
    5461                } ).done( _.bind( this.renderoEmbed, this ) );
    5562        },
    5663
    5764        renderoEmbed: function( response ) {
    58                 var html = ( response && response.body ) || '';
     65                var html = ( response && response.body ) || '',
     66                        attr = {},
     67                        opts = { silent: true };
    5968
     69                if ( response && response.attr ) {
     70                        attr = response.attr;
     71
     72                        _.each( [ 'width', 'height' ], function ( key ) {
     73                                var $el = this.$( '.setting.' + key ),
     74                                        value = attr[ key ];
     75
     76                                if ( value ) {
     77                                        this.model.set( key, value, opts );
     78                                        $el.show().find( 'input' ).val( value );
     79                                } else {
     80                                        this.model.unset( key, opts );
     81                                        $el.hide().find( 'input' ).val( '' );
     82                                }
     83                        }, this );
     84                } else {
     85                        this.model.unset( 'height', opts );
     86                        this.model.unset( 'width', opts );
     87                }
     88
    6089                this.spinner.hide();
    6190
    62                 this.$('.setting.title').hide();
    6391                this.$('.embed-container').show().find('.embed-preview').html( html );
    6492        }
    6593});
  • src/wp-includes/js/media/views.js

     
    45814581        initialize: function() {
    45824582                this.spinner = $('<span class="spinner" />');
    45834583                this.$el.append( this.spinner[0] );
    4584                 this.listenTo( this.model, 'change:url', this.updateoEmbed );
     4584                this.listenTo( this.model, 'change:url change:width change:height', this.updateoEmbed );
    45854585        },
    45864586
    4587         updateoEmbed: function() {
     4587        updateoEmbed: _.debounce( function() {
    45884588                var url = this.model.get( 'url' );
    45894589
    4590                 this.$('.setting.title').show();
    45914590                // clear out previous results
    45924591                this.$('.embed-container').hide().find('.embed-preview').html('');
    45934592
     
    45984597
    45994598                this.spinner.show();
    46004599
    4601                 setTimeout( _.bind( this.fetch, this ), 500 );
    4602         },
     4600                this.fetch();
     4601        }, 600 ),
    46034602
    46044603        fetch: function() {
     4604                var embed;
     4605
    46054606                // check if they haven't typed in 500 ms
    46064607                if ( $('#embed-url-field').val() !== this.model.get('url') ) {
    46074608                        return;
    46084609                }
    46094610
     4611                embed = new wp.shortcode({
     4612                        tag: 'embed',
     4613                        attrs: _.pick( this.model.attributes, [ 'width', 'height', 'src' ] ),
     4614                        content: this.model.get('url')
     4615                });
     4616
    46104617                wp.ajax.send( 'parse-embed', {
    46114618                        data : {
    46124619                                post_ID: wp.media.view.settings.post.id,
    4613                                 shortcode: '[embed]' + this.model.get('url') + '[/embed]'
     4620                                shortcode: embed.string()
    46144621                        }
    46154622                } ).done( _.bind( this.renderoEmbed, this ) );
    46164623        },
    46174624
    46184625        renderoEmbed: function( response ) {
    4619                 var html = ( response && response.body ) || '';
     4626                var html = ( response && response.body ) || '',
     4627                        attr = {},
     4628                        opts = { silent: true };
    46204629
     4630                if ( response && response.attr ) {
     4631                        attr = response.attr;
     4632
     4633                        _.each( [ 'width', 'height' ], function ( key ) {
     4634                                var $el = this.$( '.setting.' + key ),
     4635                                        value = attr[ key ];
     4636
     4637                                if ( value ) {
     4638                                        this.model.set( key, value, opts );
     4639                                        $el.show().find( 'input' ).val( value );
     4640                                } else {
     4641                                        this.model.unset( key, opts );
     4642                                        $el.hide().find( 'input' ).val( '' );
     4643                                }
     4644                        }, this );
     4645                } else {
     4646                        this.model.unset( 'height', opts );
     4647                        this.model.unset( 'width', opts );
     4648                }
     4649
    46214650                this.spinner.hide();
    46224651
    4623                 this.$('.setting.title').hide();
    46244652                this.$('.embed-container').show().find('.embed-preview').html( html );
    46254653        }
    46264654});
  • src/wp-includes/media-template.php

     
    816816                        <span><?php _e( 'Title' ); ?></span>
    817817                        <input type="text" class="alignment" data-setting="title" />
    818818                </label>
     819                <div class="embed-link-dimensions">
     820                        <label class="setting width">
     821                                <span><?php _e( 'Maximum Width' ); ?></span>
     822                                <input type="text" class="alignment" data-setting="width" />
     823                        </label>
     824                        <label class="setting height">
     825                                <span><?php _e( 'Maximum Height' ); ?></span>
     826                                <input type="text" class="alignment" data-setting="height" />
     827                        </label>
     828                </div>
    819829                <div class="embed-container" style="display: none;">
    820830                        <div class="embed-preview"></div>
    821831                </div>