WordPress.org

Make WordPress Core

Ticket #23570: 23570.2.diff

File 23570.2.diff, 3.5 KB (added by wonderboymusic, 5 years ago)
  • wp-includes/post-formats.php

    diff --git wp-includes/post-formats.php wp-includes/post-formats.php
    index 828447b..2b3b858 100644
    function post_formats_compat( $content, $id = 0 ) { 
    312312        switch ( $format ) {
    313313                case 'link':
    314314                        $compat['tag'] = '';
     315                        $compat['position'] = 'before';
    315316
    316317                        if ( ! empty( $meta['url'] ) ) {
    317318                                $esc_url = preg_quote( $meta['url'], '#' );
    318319                                // Make sure the same URL isn't in the post (modified/extended versions allowed)
    319                                 if ( ! preg_match( '#' . $esc_url . '[^/&\?]#', $content ) ) {
    320                                         $format_output .= sprintf(
    321                                                 '<a %shref="%s">%s</a>',
    322                                                 empty( $compat['link_class'] ) ? '' : sprintf( 'class="%s" ', esc_attr( $compat['link_class'] ) ),
    323                                                 esc_url( $meta['url'] ),
    324                                                 empty( $post->post_title ) ? esc_url( $meta['url'] ) : apply_filters( 'the_title', $post->post_title )
    325                                         );
     320                                if ( ! preg_match( '#' . $esc_url . '[^/&\?]?#', $content ) ) {
     321                                        $url = $meta['url'];
     322                                } else {
     323                                        $url = get_content_link( $content, true );
    326324                                }
     325                        } else {
     326                                $content_before = $content;
     327                                $url = get_content_link( $content, true );
     328                                if ( $content_before == $content )
     329                                        $url = '';
    327330                        }
     331
     332                        if ( ! empty( $url ) ) {
     333                                $format_output .= sprintf(
     334                                        '<a %shref="%s">%s</a>',
     335                                        empty( $compat['link_class'] ) ? '' : sprintf( 'class="%s" ', esc_attr( $compat['link_class'] ) ),
     336                                        esc_url( $url ),
     337                                        empty( $post->post_title ) ? esc_url( $meta['url'] ) : apply_filters( 'the_title', $post->post_title )
     338                                );
     339                        }
    328340                        break;
    329341
    330342                case 'quote':
    function post_formats_compat( $content, $id = 0 ) { 
    420432
    421433        return $output;
    422434}
     435
     436/**
     437 * Extract a URL from passed content, if possible
     438 * Checks for a URL on the first line of the content or the first encountered href attribute.
     439 *
     440 * @since 3.6.0
     441 *
     442 * @param string $content A string which might contain a URL.
     443 * @param boolean $remove Whether the remove the found URL from the passed content.
     444 * @return string The found URL.
     445 */
     446function get_content_link( &$content, $remove = false ) {
     447        if ( empty( $content ) )
     448                return;
     449
     450        $matches = array();
     451
     452        // the content is a URL
     453        $trimmed = trim( $content );
     454        if ( 0 === stripos( $trimmed, 'http' ) && ! preg_match( '#\s#', $trimmed ) ) {
     455                if ( $remove )
     456                        $content = '';
     457
     458                return $trimmed;
     459        // the content is HTML so we grab the first href
     460        } elseif ( preg_match( '/<a\s[^>]*?href=[\'"](.?)[\'"]/is', $content, $matches ) ) {
     461                return esc_url_raw( $matches[1] );
     462        }
     463
     464        $lines = explode( "\n", $trimmed );
     465        $line = trim( array_shift( $lines ) );
     466
     467        // the content is a URL followed by content
     468        if ( 0 === stripos( $line, 'http' ) ) {
     469                if ( $remove )
     470                        $content = trim( join( "\n", $lines ) );
     471
     472                return esc_url_raw( $line );
     473        }
     474}
     475
     476/**
     477 * Attempt to retrieve a URL from a post's content
     478 *
     479 * @since 3.6.0
     480 *
     481 * @param int $id Optional. Post ID.
     482 * @return string A URL, if found.
     483 */
     484function get_the_link( $id = 0 ) {
     485        $post = empty( $id ) ? get_post() : get_post( $id );
     486        if ( empty( $post ) )
     487                return;
     488
     489        if ( has_post_format( 'link', $post ) ) {
     490                $meta = get_post_format_meta( $post->ID );
     491                if ( ! empty( $meta['url'] ) )
     492                        return esc_url_raw( $meta['url'] );
     493        }
     494
     495        if ( ! empty( $post->post_content ) )
     496                return get_content_link( $post->post_content );
     497}
     498
     499/**
     500 * Attempt to output a URL from a post's content
     501 *
     502 * @since 3.6.0
     503 *.
     504 */
     505function the_link() {
     506        echo get_the_link();
     507}
     508 No newline at end of file