WordPress.org

Make WordPress Core

Changeset 23450


Ignore:
Timestamp:
02/18/13 19:22:58 (5 years ago)
Author:
helen
Message:

Output fallbacks / theme compat for post format metadata.

  • Currently handles link, quote, image, gallery, audio, and video formats.
  • add_theme_support() for a given post format is now an indicator that the theme handles format-specific metadata.
  • If no support for a given format is defined, fallback output will be generated and hooked onto the_content if a post has metadata for that format.
  • Fallbacks attempt to be smart about not duplicating data already appearing in the post content itself. Gallery is particularly liberal, looking for any instance of the gallery shortcode in the content, not just an exact match to the gallery shortcode defined in the format-specific meta.
  • Compat output defaults to being wrapped in a div with a class of post-format-content.

Theme authors: please test and evaluate, keeping in mind that the goal is to support user expectations of not losing format-specific data they've entered in the admin when viewing the front-end of their site.

props wonderboymusic, beaulebens, helen. see #23347.

Location:
trunk/wp-includes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/default-filters.php

    r23416 r23450  
    133133add_filter( 'the_title', 'trim'          ); 
    134134 
    135 add_filter( 'the_content', 'wptexturize'        ); 
    136 add_filter( 'the_content', 'convert_smilies'    ); 
    137 add_filter( 'the_content', 'convert_chars'      ); 
    138 add_filter( 'the_content', 'wpautop'            ); 
    139 add_filter( 'the_content', 'shortcode_unautop'  ); 
    140 add_filter( 'the_content', 'prepend_attachment' ); 
     135add_filter( 'the_content', 'post_formats_compat', 7 ); 
     136add_filter( 'the_content', 'wptexturize'            ); 
     137add_filter( 'the_content', 'convert_smilies'        ); 
     138add_filter( 'the_content', 'convert_chars'          ); 
     139add_filter( 'the_content', 'wpautop'                ); 
     140add_filter( 'the_content', 'shortcode_unautop'      ); 
     141add_filter( 'the_content', 'prepend_attachment'     ); 
    141142 
    142143add_filter( 'the_excerpt',     'wptexturize'      ); 
  • trunk/wp-includes/formatting.php

    r23434 r23450  
    17961796        $output = $text; 
    17971797    } 
     1798    return $output; 
     1799} 
     1800 
     1801/** 
     1802 * Return the class for a post format content wrapper 
     1803 * 
     1804 * @since 3.6.0 
     1805 * 
     1806 * @param string $format 
     1807 */ 
     1808function get_post_format_content_class( $format ) { 
     1809    return apply_filters( 'post_format_content_class', 'post-format-content', $format ); 
     1810} 
     1811 
     1812/** 
     1813 * Ouput the class for a post format content wrapper 
     1814 * 
     1815 * @since 3.6.0 
     1816 * 
     1817 * @param string $format 
     1818 */ 
     1819function post_format_content_class( $format ) { 
     1820    echo get_post_format_content_class( $format ); 
     1821} 
     1822 
     1823/** 
     1824 * Provide fallback behavior for Posts that have associated post format 
     1825 * 
     1826 * @since 3.6.0 
     1827 * 
     1828 * @param string $content 
     1829 */ 
     1830function post_formats_compat( $content, $id = 0 ) { 
     1831    $post = empty( $id ) ? get_post() : get_post( $id ); 
     1832    if ( empty( $post ) ) 
     1833        return $content; 
     1834 
     1835    $format = get_post_format( $post ); 
     1836    if ( empty( $format ) || in_array( $format, array( 'status', 'aside', 'chat' ) ) ) 
     1837        return $content; 
     1838 
     1839    if ( current_theme_supports( 'post-formats', $format ) ) 
     1840        return $content; 
     1841 
     1842    $defaults = array( 
     1843        'position' => 'after', 
     1844        'tag' => 'div', 
     1845        'class' => get_post_format_content_class( $format ), 
     1846        'link_class' => '', 
     1847        'image_class' => '', 
     1848        'gallery' => '[gallery]', 
     1849        'audio' => '', 
     1850        'video' => '' 
     1851    ); 
     1852 
     1853    $args = apply_filters( 'post_format_compat', array() ); 
     1854    $compat = wp_parse_args( $args, $defaults ); 
     1855 
     1856    $show_content = true; 
     1857    $format_output = ''; 
     1858    $meta = get_post_format_meta( $post->ID ); 
     1859 
     1860    switch ( $format ) { 
     1861        case 'link': 
     1862            $compat['tag'] = ''; 
     1863 
     1864            if ( ! empty( $meta['url'] ) ) { 
     1865                $esc_url = preg_quote( $meta['url'], '#' ); 
     1866                // Make sure the same URL isn't in the post (modified/extended versions allowed) 
     1867                if ( ! preg_match( '#' . $esc_url . '[^/&\?]#', $content ) ) { 
     1868                    $format_output .= sprintf( 
     1869                        '<a %shref="%s">%s</a>', 
     1870                        empty( $compat['link_class'] ) ? '' : sprintf( 'class="%s" ', esc_attr( $compat['link_class'] ) ), 
     1871                        esc_url( $meta['url'] ), 
     1872                        empty( $post->post_title ) ? esc_url( $meta['url'] ) : apply_filters( 'the_title', $post->post_title ) 
     1873                    ); 
     1874                } 
     1875            } 
     1876            break; 
     1877 
     1878        case 'quote': 
     1879            if ( ! empty( $meta['quote'] ) && ! stristr( $content, $meta['quote'] ) ) { 
     1880                $format_output .= sprintf( '<blockquote>%s</blockquote>', $meta['quote'] ); 
     1881                if ( ! empty( $meta['quote_source'] ) ) { 
     1882                    $format_output .= sprintf( 
     1883                        '<cite>%s</cite>', 
     1884                        ! empty( $meta['url'] ) ? 
     1885                            sprintf( '<a href="%s">%s</a>', esc_url( $meta['url'] ), $meta['quote_source'] ) : 
     1886                            $meta['quote_source'] 
     1887                    ); 
     1888                } 
     1889            } 
     1890            break; 
     1891 
     1892        case 'image': 
     1893            if ( ! empty( $meta['image'] ) ) { 
     1894                $image = is_numeric( $meta['image'] ) ? wp_get_attachment_url( $meta['image'] ) : $meta['image']; 
     1895 
     1896                if ( ! empty( $image ) && ! stristr( $content, $image ) ) { 
     1897                    $image_html = sprintf( 
     1898                        '<img %ssrc="%s" alt="" />', 
     1899                        empty( $compat['image_class'] ) ? '' : sprintf( 'class="%s" ', esc_attr( $compat['image_class'] ) ), 
     1900                        $image 
     1901                    ); 
     1902                    if ( empty( $meta['url'] ) ) { 
     1903                        $format_output .= $image_html; 
     1904                    } else { 
     1905                        $format_output .= sprintf( 
     1906                            '<a href="%s">%s</a>', 
     1907                            esc_url( $meta['url'] ), 
     1908                            $image_html 
     1909                        ); 
     1910                    } 
     1911                } 
     1912            } 
     1913            break; 
     1914 
     1915        case 'gallery': 
     1916            preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches ); 
     1917            if ( ! empty( $matches ) && isset( $matches[2] ) ) { 
     1918                foreach ( (array) $matches[2] as $match ) { 
     1919                    if ( 'gallery' === $match ) 
     1920                        break 2; // foreach + case 
     1921                } 
     1922            } 
     1923 
     1924            if ( empty( $meta['gallery'] ) && ! empty( $compat['gallery'] ) ) { 
     1925                $format_output .= $compat['gallery']; 
     1926            } elseif ( ! empty( $meta['gallery'] ) ) { 
     1927                $format_output .= $meta['gallery']; 
     1928            } 
     1929            break; 
     1930 
     1931        case 'video': 
     1932        case 'audio': 
     1933            $shortcode_regex = '/' . get_shortcode_regex() . '/s'; 
     1934            $matches = preg_match( $shortcode_regex, $content ); 
     1935            if ( ! $matches || $format !== $matches[2] ) { 
     1936                if ( empty( $meta['media'] ) && ! empty( $compat[$format] ) ) { 
     1937                    $format_output .= $compat[$format]; 
     1938                } elseif ( ! empty( $meta['media'] ) ) { 
     1939                    // the metadata is a shortcode or an embed code 
     1940                    if ( preg_match( $shortcode_regex, $meta['media'] ) || preg_match( '#<[^>]+>#', $meta['media'] ) ) { 
     1941                        $format_output .= $meta['media']; 
     1942                    } elseif ( ! stristr( $content, $meta['media'] ) ) { 
     1943                        // attempt to embed the URL 
     1944                        $format_output .= sprintf( '[embed]%s[/embed]', $meta['media'] ); 
     1945                    } 
     1946                } 
     1947            } 
     1948            break; 
     1949        default: 
     1950            return $content; 
     1951            break; 
     1952    } 
     1953 
     1954    if ( empty( $format_output ) ) 
     1955        return $content; 
     1956 
     1957    $output = ''; 
     1958 
     1959    if ( ! empty( $content ) && $show_content && 'before' !== $compat['position'] ) 
     1960        $output .= $content . PHP_EOL . PHP_EOL; 
     1961 
     1962    if ( ! empty( $compat['tag'] ) ) 
     1963        $output .= sprintf( '<%s class="%s">', tag_escape( $compat['tag'] ), esc_attr( $compat['class'] ) ); 
     1964 
     1965    $output .= $format_output; 
     1966 
     1967    if ( ! empty( $compat['tag'] ) ) 
     1968        $output .= sprintf( '</%s>', tag_escape( $compat['tag'] ) ); 
     1969 
     1970    if ( ! empty( $content ) && $show_content && 'before' === $compat['position'] ) 
     1971        $output .= PHP_EOL . PHP_EOL . $content; 
     1972 
    17981973    return $output; 
    17991974} 
Note: See TracChangeset for help on using the changeset viewer.