WordPress.org

Make WordPress Core

Ticket #34971: 34971.4.diff

File 34971.4.diff, 17.3 KB (added by swissspidy, 4 years ago)
  • src/wp-includes/class-wp-rewrite.php

    diff --git src/wp-includes/class-wp-rewrite.php src/wp-includes/class-wp-rewrite.php
    index 035bbc3..8926a6c 100644
    class WP_Rewrite { 
    10001000                        $feedmatch2 = $match . $feedregex2;
    10011001                        $feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1);
    10021002
     1003                        // Create query and regex for embeds.
     1004                        $embedmatch = $match . $embedregex;
     1005                        $embedquery = $embedindex . '?' . $query . '&embed=true';
     1006
    10031007                        // If asked to, turn the feed queries into comment feed ones.
    10041008                        if ( $forcomments ) {
    10051009                                $feedquery .= '&withcomments=1';
    class WP_Rewrite { 
    10111015
    10121016                        // ...adding on /feed/ regexes => queries
    10131017                        if ( $feed ) {
    1014                                 $rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2 );
     1018                                $rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2, $embedmatch => $embedquery );
    10151019                        }
    10161020
    10171021                        //...and /page/xx ones
  • src/wp-includes/embed.php

    diff --git src/wp-includes/embed.php src/wp-includes/embed.php
    index 17b9ac4..cdeaf79 100644
    function wp_oembed_register_route() { 
    345345function wp_oembed_add_discovery_links() {
    346346        $output = '';
    347347
    348         if ( is_singular() && ! is_front_page() ) {
     348        if ( is_singular() ) {
    349349                $output .= '<link rel="alternate" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" />' . "\n";
    350350
    351351                if ( class_exists( 'SimpleXMLElement' ) ) {
    function get_post_embed_url( $post = null ) { 
    387387                return false;
    388388        }
    389389
    390         if ( get_option( 'permalink_structure' ) ) {
    391                 $embed_url = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' );
    392         } else {
     390        $embed_url     = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' );
     391        $path_conflict = get_page_by_path( str_replace( home_url(), '', $embed_url ), OBJECT, get_post_types( array( 'public' => true ) ) );
     392
     393        if ( ! get_option( 'permalink_structure' ) || $path_conflict ) {
    393394                $embed_url = add_query_arg( array( 'embed' => 'true' ), get_permalink( $post ) );
    394395        }
    395396
  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index 59506f8..cd220d3 100644
    function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_p 
    35743574                 * @param bool   $bad_slug Whether the slug would be bad as an attachment slug.
    35753575                 * @param string $slug     The post slug.
    35763576                 */
    3577                 if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) {
     3577                if ( $post_name_check || in_array( $slug, $feeds ) || 'embed' === $slug || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) {
    35783578                        $suffix = 2;
    35793579                        do {
    35803580                                $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
    function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_p 
    36043604                 * @param string $post_type   Post type.
    36053605                 * @param int    $post_parent Post parent ID.
    36063606                 */
    3607                 if ( $post_name_check || in_array( $slug, $feeds ) || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug )  || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {
     3607                if ( $post_name_check || in_array( $slug, $feeds ) || 'embed' === $slug || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug )  || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {
    36083608                        $suffix = 2;
    36093609                        do {
    36103610                                $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
    function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_p 
    36493649                 * @param string $slug      The post slug.
    36503650                 * @param string $post_type Post type.
    36513651                 */
    3652                 if ( $post_name_check || in_array( $slug, $feeds ) || $conflicts_with_date_archive || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) {
     3652                if ( $post_name_check || in_array( $slug, $feeds ) || 'embed' === $slug || $conflicts_with_date_archive || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) {
    36533653                        $suffix = 2;
    36543654                        do {
    36553655                                $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
  • src/wp-includes/query.php

    diff --git src/wp-includes/query.php src/wp-includes/query.php
    index 87d74ba..5812ee0 100644
    class WP_Query { 
    14561456                        , 'title'
    14571457                        , 'fields'
    14581458                        , 'menu_order'
     1459                        , 'embed'
    14591460                );
    14601461
    14611462                foreach ( $keys as $key ) {
    class WP_Query { 
    17561757                if ( '' != $qv['feed'] )
    17571758                        $this->is_feed = true;
    17581759
     1760                if ( '' != $qv['embed'] ) {
     1761                        $this->is_embed = true;
     1762                }
     1763
    17591764                if ( '' != $qv['tb'] )
    17601765                        $this->is_trackback = true;
    17611766
    class WP_Query { 
    17881793                        // pagename can be set and empty depending on matched rewrite rules. Ignore an empty pagename.
    17891794                        if ( isset($_query['pagename']) && '' == $_query['pagename'] )
    17901795                                unset($_query['pagename']);
     1796
     1797                        unset( $_query['embed'] );
     1798
    17911799                        if ( empty($_query) || !array_diff( array_keys($_query), array('preview', 'page', 'paged', 'cpage') ) ) {
    17921800                                $this->is_page = true;
    17931801                                $this->is_home = false;
    class WP_Query { 
    18591867                if ( '404' == $qv['error'] )
    18601868                        $this->set_404();
    18611869
    1862                 $this->is_embed = isset( $qv['embed'] ) && ( $this->is_singular || $this->is_404 );
     1870                $this->is_embed = $this->is_embed && ( $this->is_singular || $this->is_404 );
    18631871
    18641872                $this->query_vars_hash = md5( serialize( $this->query_vars ) );
    18651873                $this->query_vars_changed = false;
  • src/wp-includes/rewrite.php

    diff --git src/wp-includes/rewrite.php src/wp-includes/rewrite.php
    index 7f3b2ed..b867cdc 100644
    function url_to_postid( $url ) { 
    445445                        return $id;
    446446        }
    447447
    448         // Check to see if we are using rewrite rules
    449         $rewrite = $wp_rewrite->wp_rewrite_rules();
    450 
    451         // Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options
    452         if ( empty($rewrite) )
    453                 return 0;
    454 
    455448        // Get rid of the #anchor
    456449        $url_split = explode('#', $url);
    457450        $url = $url_split[0];
    function url_to_postid( $url ) { 
    471464        if ( false === strpos(home_url(), '://www.') )
    472465                $url = str_replace('://www.', '://', $url);
    473466
     467        if ( trim( $url, '/' ) === home_url() && 'page' == get_option( 'show_on_front' ) ) {
     468                $page_on_front = get_option( 'page_on_front' );
     469
     470                if ( $page_on_front && get_post( $page_on_front ) instanceof WP_Post ) {
     471                        return (int) $page_on_front;
     472                }
     473        }
     474
     475        // Check to see if we are using rewrite rules
     476        $rewrite = $wp_rewrite->wp_rewrite_rules();
     477
     478        // Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options
     479        if ( empty($rewrite) )
     480                return 0;
     481
    474482        // Strip 'index.php/' if we're not using path info permalinks
    475483        if ( !$wp_rewrite->using_index_permalinks() )
    476484                $url = str_replace( $wp_rewrite->index . '/', '', $url );
  • tests/phpunit/tests/oembed/controller.php

    diff --git tests/phpunit/tests/oembed/controller.php tests/phpunit/tests/oembed/controller.php
    index 5cca696..3c9d051 100644
    class Test_oEmbed_Controller extends WP_UnitTestCase { 
    169169                $this->assertTrue( $data['width'] <= $request['maxwidth'] );
    170170        }
    171171
     172        /**
     173         * @ticket 34971
     174         */
     175        function test_request_static_front_page() {
     176                $post = self::factory()->post->create_and_get( array(
     177                        'post_title' => 'Front page',
     178                        'post_type'  => 'page',
     179                ) );
     180
     181                update_option( 'show_on_front', 'page' );
     182                update_option( 'page_on_front', $post->ID );
     183
     184                $request = new WP_REST_Request( 'GET', '/oembed/1.0/embed' );
     185                $request->set_param( 'url', home_url() );
     186                $request->set_param( 'maxwidth', 400 );
     187
     188                $response = $this->server->dispatch( $request );
     189                $data     = $response->get_data();
     190
     191                $this->assertInternalType( 'array', $data );
     192                $this->assertNotEmpty( $data );
     193
     194                $this->assertArrayHasKey( 'version', $data );
     195                $this->assertArrayHasKey( 'provider_name', $data );
     196                $this->assertArrayHasKey( 'provider_url', $data );
     197                $this->assertArrayHasKey( 'author_name', $data );
     198                $this->assertArrayHasKey( 'author_url', $data );
     199                $this->assertArrayHasKey( 'title', $data );
     200                $this->assertArrayHasKey( 'type', $data );
     201                $this->assertArrayHasKey( 'width', $data );
     202
     203                $this->assertEquals( '1.0', $data['version'] );
     204                $this->assertEquals( get_bloginfo( 'name' ), $data['provider_name'] );
     205                $this->assertEquals( get_home_url(), $data['provider_url'] );
     206                $this->assertEquals( get_bloginfo( 'name' ), $data['author_name'] );
     207                $this->assertEquals( get_home_url(), $data['author_url'] );
     208                $this->assertEquals( $post->post_title, $data['title'] );
     209                $this->assertEquals( 'rich', $data['type'] );
     210                $this->assertTrue( $data['width'] <= $request['maxwidth'] );
     211
     212                update_option( 'show_on_front', 'posts' );
     213        }
     214
    172215        function test_request_xml() {
    173216                $user = self::factory()->user->create_and_get( array(
    174217                        'display_name' => 'John Doe',
  • tests/phpunit/tests/oembed/discovery.php

    diff --git tests/phpunit/tests/oembed/discovery.php tests/phpunit/tests/oembed/discovery.php
    index 6331602..d3fbab8 100644
    class Tests_oEmbed_Discovery extends WP_UnitTestCase { 
    99        }
    1010
    1111        function test_add_oembed_discovery_links_front_page() {
    12                 $this->go_to( home_url('/') );
     12                $this->go_to( home_url() );
    1313                $this->assertSame( '', get_echo( 'wp_oembed_add_discovery_links' ) );
     14                $this->assertSame( 0, url_to_postid( home_url() ) );
    1415        }
    1516
     17        /**
     18         * @ticket 34971
     19         */
    1620        function test_add_oembed_discovery_links_static_front_page() {
    1721                update_option( 'show_on_front', 'page' );
    18                 update_option( 'page_for_posts', self::factory()->post->create( array( 'post_title' => 'blog-page', 'post_type' => 'page' ) ) );
    1922                update_option( 'page_on_front', self::factory()->post->create( array( 'post_title' => 'front-page', 'post_type' => 'page' ) ) );
    2023
    21                 $this->go_to( home_url('/') );
    22                 $this->assertSame( '', get_echo( 'wp_oembed_add_discovery_links' ) );
     24                $this->go_to( home_url() );
     25                $this->assertQueryTrue( 'is_front_page', 'is_singular', 'is_page' );
     26
     27                $expected = '<link rel="alternate" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" />' . "\n";
     28                $expected .= '<link rel="alternate" type="text/xml+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink(), 'xml' ) ) . '" />' . "\n";
     29
     30                $this->assertSame( $expected, get_echo( 'wp_oembed_add_discovery_links' ) );
    2331
    2432                update_option( 'show_on_front', 'posts' );
    2533        }
  • tests/phpunit/tests/oembed/postEmbedUrl.php

    diff --git tests/phpunit/tests/oembed/postEmbedUrl.php tests/phpunit/tests/oembed/postEmbedUrl.php
    index dda0f3c..9147dfb 100644
     
    44 * @group oembed
    55 */
    66class Tests_Post_Embed_URL extends WP_UnitTestCase {
    7         function test_get_post_embed_url_non_existent_post() {
     7        function test_non_existent_post() {
    88                $embed_url = get_post_embed_url( 0 );
    99                $this->assertFalse( $embed_url );
    1010        }
    1111
    12         function test_get_post_embed_url_with_pretty_permalinks() {
    13                 update_option( 'permalink_structure', '/%postname%' );
     12        function test_with_pretty_permalinks() {
     13                $this->set_permalink_structure( '/%postname%' );
    1414
    1515                $post_id   = self::factory()->post->create();
    1616                $permalink = get_permalink( $post_id );
    1717                $embed_url = get_post_embed_url( $post_id );
    1818
    19                 $this->assertEquals( user_trailingslashit( trailingslashit( $permalink ) . 'embed' ), $embed_url );
    20 
    21                 update_option( 'permalink_structure', '' );
     19                $this->assertEquals( $permalink . '/embed', $embed_url );
    2220        }
    2321
    24         function test_get_post_embed_url_with_ugly_permalinks() {
     22        function test_with_ugly_permalinks() {
    2523                $post_id   = self::factory()->post->create();
    2624                $permalink = get_permalink( $post_id );
    2725                $embed_url = get_post_embed_url( $post_id );
    2826
    2927                $this->assertEquals( $permalink . '&embed=true', $embed_url );
    3028        }
     29
     30        /**
     31         * @ticket 34971
     32         */
     33        function test_static_front_page() {
     34                $this->set_permalink_structure( '/%postname%/' );
     35
     36                $post_id = self::factory()->post->create( array( 'post_type' => 'page' ) );
     37
     38                update_option( 'show_on_front', 'page' );
     39                update_option( 'page_on_front', $post_id );
     40
     41                $embed_url = get_post_embed_url( $post_id );
     42
     43                $this->assertSame( user_trailingslashit( trailingslashit( home_url() ) . 'embed' ), $embed_url );
     44
     45                update_option( 'show_on_front', 'posts' );
     46        }
     47
     48        /**
     49         * @ticket 34971
     50         */
     51        function test_static_front_page_with_ugly_permalinks() {
     52                $post_id = self::factory()->post->create( array( 'post_type' => 'page' ) );
     53
     54                update_option( 'show_on_front', 'page' );
     55                update_option( 'page_on_front', $post_id );
     56
     57                $embed_url = get_post_embed_url( $post_id );
     58
     59                $this->assertSame( trailingslashit( home_url() ) . '?embed=true', $embed_url );
     60
     61                update_option( 'show_on_front', 'posts' );
     62        }
     63
     64        /**
     65         * @ticket 34971
     66         */
     67        function test_page_conflicts_with_embed_slug() {
     68                $this->set_permalink_structure( '/%postname%/' );
     69
     70                $parent_page = self::factory()->post->create( array( 'post_type' => 'page' ) );
     71
     72                add_filter( 'wp_unique_post_slug', array( $this, 'filter_unique_post_slug' ) );
     73                $child_page = self::factory()->post->create( array(
     74                        'post_type'   => 'page',
     75                        'post_parent' => $parent_page,
     76                        'post_name'   => 'embed',
     77                ) );
     78                remove_filter( 'wp_unique_post_slug', array( $this, 'filter_unique_post_slug' ) );
     79
     80                $this->assertSame( get_permalink( $parent_page ) . '?embed=true', get_post_embed_url( $parent_page ) );
     81                $this->assertSame( get_permalink( $child_page ) . 'embed/', get_post_embed_url( $child_page ) );
     82        }
     83
     84        /**
     85         * @ticket 34971
     86         */
     87        function test_static_front_page_conflicts_with_embed_slug() {
     88                $this->set_permalink_structure( '/%postname%/' );
     89
     90                // Create a post with the 'embed' post_name
     91                add_filter( 'wp_unique_post_slug', array( $this, 'filter_unique_post_slug' ) );
     92                $post_embed_slug = self::factory()->post->create( array( 'post_name' => 'embed' ) );
     93                remove_filter( 'wp_unique_post_slug', array( $this, 'filter_unique_post_slug' ) );
     94                $page_front = self::factory()->post->create( array( 'post_type' => 'page' ) );
     95
     96                update_option( 'show_on_front', 'page' );
     97                update_option( 'page_on_front', $page_front );
     98
     99                $this->assertSame( home_url() . '/embed/embed/', get_post_embed_url( $post_embed_slug ) );
     100                $this->assertSame( home_url() . '/?embed=true', get_post_embed_url( $page_front ) );
     101
     102                update_option( 'show_on_front', 'posts' );
     103        }
     104
     105        public function filter_unique_post_slug() {
     106                return 'embed';
     107        }
    31108}
  • tests/phpunit/tests/post/wpUniquePostSlug.php

    diff --git tests/phpunit/tests/post/wpUniquePostSlug.php tests/phpunit/tests/post/wpUniquePostSlug.php
    index 354997e..8e5537c 100644
    class Tests_Post_WpUniquePostSlug extends WP_UnitTestCase { 
    302302                $found = wp_unique_post_slug( '32', $p, 'publish', 'post', 0 );
    303303                $this->assertEquals( '32', $found );
    304304        }
     305
     306        /**
     307         * @ticket 34971
     308         */
     309        public function test_embed_slug_should_be_suffixed_for_posts() {
     310                $this->set_permalink_structure( '/%postname%/' );
     311
     312                $p = self::factory()->post->create( array(
     313                        'post_type' => 'post',
     314                        'post_name' => 'embed',
     315                ) );
     316
     317                $found = wp_unique_post_slug( 'embed', $p, 'publish', 'post', 0 );
     318                $this->assertSame( 'embed-2', $found );
     319        }
     320
     321        /**
     322         * @ticket 34971
     323         */
     324        public function test_embed_slug_should_be_suffixed_for_pages() {
     325                $this->set_permalink_structure( '/%postname%/' );
     326
     327                $p = self::factory()->post->create( array(
     328                        'post_type' => 'page',
     329                        'post_name' => 'embed',
     330                ) );
     331
     332                $found = wp_unique_post_slug( 'embed', $p, 'publish', 'paage', 0 );
     333                $this->assertSame( 'embed-2', $found );
     334        }
     335
     336        /**
     337         * @ticket 34971
     338         */
     339        public function test_embed_slug_should_be_suffixed_for_attachments() {
     340                $this->set_permalink_structure( '/%postname%/' );
     341
     342                $p = self::factory()->post->create( array(
     343                        'post_type' => 'attachment',
     344                        'post_name' => 'embed',
     345                ) );
     346
     347                $found = wp_unique_post_slug( 'embed', $p, 'publish', 'attachment', 0 );
     348                $this->assertSame( 'embed-2', $found );
     349        }
    305350}
  • tests/phpunit/tests/rewrite.php

    diff --git tests/phpunit/tests/rewrite.php tests/phpunit/tests/rewrite.php
    index 1f7426e..c5d4ec3 100644
    class Tests_Rewrite extends WP_UnitTestCase { 
    304304        }
    305305
    306306        /**
     307         * @ticket 34971
     308         */
     309        function test_url_to_postid_static_front_page() {
     310                $post_id = self::factory()->post->create( array( 'post_type' => 'page' ) );
     311
     312                $this->assertSame( 0, url_to_postid( home_url() ) );
     313
     314                update_option( 'show_on_front', 'page' );
     315                update_option( 'page_on_front', $post_id );
     316
     317                $this->assertSame( $post_id, url_to_postid( set_url_scheme( home_url(), 'http' ) ) );
     318                $this->assertSame( $post_id, url_to_postid( set_url_scheme( home_url(), 'https' ) ) );
     319                $this->assertSame( $post_id, url_to_postid( str_replace( array( 'http://', 'https://' ), 'http://www.', home_url() ) ) );
     320                $this->assertSame( $post_id, url_to_postid( home_url() . '#random' ) );
     321                $this->assertSame( $post_id, url_to_postid( home_url() . '?random' ) );
     322
     323                update_option( 'show_on_front', 'posts' );
     324        }
     325
     326        /**
    307327         * @ticket 21970
    308328         */
    309329        function test_parse_request_with_post_slug_that_clashes_with_a_trashed_page() {