WordPress.org

Make WordPress Core

Ticket #5305: 5305.12.diff

File 5305.12.diff, 24.5 KB (added by boonebgorges, 5 years ago)
  • src/wp-admin/includes/post.php

    diff --git src/wp-admin/includes/post.php src/wp-admin/includes/post.php
    index 1e6d9fa..b4ae788 100644
    function get_sample_permalink($id, $title = null, $name = null) { 
    12311231                $permalink = str_replace('%pagename%', "{$uri}%pagename%", $permalink);
    12321232        }
    12331233
     1234        // If the name is numeric and non-zero, verify that it won't clash with date archive URLs.
     1235        if ( preg_match( '/^[0-9]+$/', $post->post_name ) && $post_name_num = intval( $post->post_name ) ) {
     1236                $permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );
     1237                $postname_index = array_search( '%postname%', $permastructs );
     1238
     1239                /*
     1240                 * Find potential date conflicts. Any integer in the first permastruct position could be a year.
     1241                 * An integer between 1 and 12 that follows 'year' conflicts with 'monthnum'. An integer between 1 and
     1242                 * 31 that follows 'monthnum' conflicts with 'day'.
     1243                 */
     1244                if ( 0 === $postname_index ||
     1245                     ( '%year%' === $permastructs[ $postname_index - 1 ] && 13 > $post_name_num ) ||
     1246                     ( '%monthnum%' === $permastructs[ $postname_index - 1 ] && 32 > $post_name_num )
     1247                   ) {
     1248                        $post->post_name = wp_unique_post_slug( $post->post_name, 0, $post->post_status, $post->post_type, $post->post_parent );
     1249                }
     1250        }
     1251
    12341252        /** This filter is documented in wp-admin/edit-tag-form.php */
    12351253        $permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name ) );
    12361254        $post->post_status = $original_status;
  • src/wp-includes/class-wp.php

    diff --git src/wp-includes/class-wp.php src/wp-includes/class-wp.php
    index a079c12..5bb6883 100644
    class WP { 
    306306                        }
    307307                }
    308308
     309                // Resolve conflicts between posts with numeric slugs and date archive queries.
     310                $this->query_vars = _resolve_numeric_slug_conflicts( $this->query_vars );
     311
    309312                foreach ( (array) $this->private_query_vars as $var) {
    310313                        if ( isset($this->extra_query_vars[$var]) )
    311314                                $this->query_vars[$var] = $this->extra_query_vars[$var];
  • src/wp-includes/rewrite.php

    diff --git src/wp-includes/rewrite.php src/wp-includes/rewrite.php
    index 2529228..9eba3de 100644
    function _wp_filter_taxonomy_base( $base ) { 
    275275}
    276276
    277277/**
     278 * Resolve numeric slugs that collide with date permalinks.
     279 *
     280 * Permalinks of posts with numeric slugs can sometimes look to `WP_Query::parse_query()` like a date archive,
     281 * as when your permalink structure is `/%year%/%postname%/` and a post with post_name '05' has the URL
     282 * `/2015/05/`. This function detects these conflicts and resolves conflicts in favor of the post permalink.
     283 *
     284 * @since 4.2.0
     285 * @access private
     286 *
     287 * @param array $query_vars Query variables for setting up the WordPress Query Loop.
     288 * @return array
     289 */
     290function _resolve_numeric_slug_conflicts( $query_vars = array() ) {
     291        if ( ! isset( $query_vars['year'] ) && ! isset( $query_vars['monthnum'] ) && ! isset( $query_vars['day'] ) ) {
     292                return $query_vars;
     293        }
     294
     295        // Identify the 'postname' position in the permastruct array.
     296        $permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );
     297        $postname_index = array_search( '%postname%', $permastructs );
     298
     299        if ( false === $postname_index ) {
     300                return $query_vars;
     301        }
     302
     303        /*
     304         * A numeric slug could be confused with a year, month, or day, depending on position. To account for
     305         * the possibility of post pagination (eg 2015/2 for the second page of a post called '2015'), our
     306         * `is_*` checks are generous: check for year-slug clashes when `is_year` *or* `is_month`, and check
     307         * for month-slug clashes when `is_month` *or* `is_day`.
     308         */
     309        $compare = '';
     310        if ( 0 === $postname_index && ( isset( $query_vars['year'] ) || isset( $query_vars['monthnum'] ) ) ) {
     311                $compare = 'year';
     312        } else if ( '%year%' === $permastructs[ $postname_index - 1 ] && ( isset( $query_vars['monthnum'] ) || isset( $query_vars['day'] ) ) ) {
     313                $compare = 'monthnum';
     314        } else if ( '%monthnum%' === $permastructs[ $postname_index - 1 ] && isset( $query_vars['day'] ) ) {
     315                $compare = 'day';
     316        }
     317
     318        if ( ! $compare ) {
     319                return $query_vars;
     320        }
     321
     322        // This is the potentially clashing slug.
     323        $value = $query_vars[ $compare ];
     324
     325        $post = get_page_by_path( $value, OBJECT, 'post' );
     326        if ( ! ( $post instanceof WP_Post ) ) {
     327                return $query_vars;
     328        }
     329
     330        /*
     331         * If the located post contains nextpage pagination, then the URL chunk following postname may be
     332         * intended as the page number. Verify that it's a valid page before resolving to it.
     333         */
     334        $maybe_page = '';
     335        if ( 'year' === $compare && isset( $query_vars['monthnum'] ) ) {
     336                $maybe_page = $query_vars['monthnum'];
     337        } else if ( 'monthnum' === $compare && isset( $query_vars['day'] ) ) {
     338                $maybe_page = $query_vars['day'];
     339        }
     340
     341        $post_page_count = substr_count( $post->post_content, '<!--nextpage-->' ) + 1;
     342
     343        // If the post doesn't have multiple pages, but a 'page' candidate is found, resolve to the date archive.
     344        if ( 1 === $post_page_count && $maybe_page ) {
     345                return $query_vars;
     346        }
     347
     348        // If the post has multiple pages and the 'page' number isn't valid, resolve to the date archive.
     349        if ( $post_page_count > 1 && $maybe_page > $post_page_count ) {
     350                return $query_vars;
     351        }
     352
     353        // If we've gotten to this point, we have a slug/date clash. First, adjust for nextpage.
     354        if ( '' !== $maybe_page ) {
     355                $query_vars['page'] = intval( $maybe_page );
     356        }
     357
     358        // Next, unset autodetected date-related query vars.
     359        unset( $query_vars['year'] );
     360        unset( $query_vars['monthnum'] );
     361        unset( $query_vars['day'] );
     362
     363        // Then, set the identified post.
     364        $query_vars['name'] = $post->post_name;
     365
     366        // Finally, return the modified query vars.
     367        return $query_vars;
     368}
     369
     370/**
    278371 * Examine a url and try to determine the post ID it represents.
    279372 *
    280373 * Checks are supposedly from the hosted site blog.
    function url_to_postid($url) { 
    389482                                }
    390483                        }
    391484
     485                        // Resolve conflicts between posts with numeric slugs and date archive queries.
     486                        $query = _resolve_numeric_slug_conflicts( $query );
     487
    392488                        // Do the query
    393489                        $query = new WP_Query( $query );
    394490                        if ( ! empty( $query->posts ) && $query->is_singular )
  • tests/phpunit/tests/admin/includesPost.php

    diff --git tests/phpunit/tests/admin/includesPost.php tests/phpunit/tests/admin/includesPost.php
    index 0388a82..d3233f9 100644
    class Tests_Admin_includesPost extends WP_UnitTestCase { 
    269269                $wp_rewrite->set_permalink_structure( $old_permalink_structure );
    270270                flush_rewrite_rules();
    271271        }
     272
     273        /**
     274         * @ticket 5305
     275         */
     276        public function test_get_sample_permalink_should_avoid_slugs_that_would_create_clashes_with_year_archives() {
     277                global $wp_rewrite;
     278                $wp_rewrite->init();
     279                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     280                $wp_rewrite->flush_rules();
     281
     282                $p = $this->factory->post->create( array(
     283                        'post_name' => '2015',
     284                ) );
     285
     286                $found = get_sample_permalink( $p );
     287                $this->assertEquals( '2015-2', $found[1] );
     288
     289                $wp_rewrite->set_permalink_structure( '' );
     290                flush_rewrite_rules();
     291        }
     292
     293        /**
     294         * @ticket 5305
     295         */
     296        public function test_get_sample_permalink_should_allow_yearlike_slugs_if_permastruct_does_not_cause_an_archive_conflict() {
     297                global $wp_rewrite;
     298                $wp_rewrite->init();
     299                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     300                $wp_rewrite->flush_rules();
     301
     302                $p = $this->factory->post->create( array(
     303                        'post_name' => '2015',
     304                ) );
     305
     306                $found = get_sample_permalink( $p );
     307                $this->assertEquals( '2015', $found[1] );
     308
     309                $wp_rewrite->set_permalink_structure( '' );
     310                flush_rewrite_rules();
     311        }
     312
     313        /**
     314         * @ticket 5305
     315         */
     316        public function test_get_sample_permalink_should_avoid_slugs_that_would_create_clashes_with_month_archives() {
     317                global $wp_rewrite;
     318                $wp_rewrite->init();
     319                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     320                $wp_rewrite->flush_rules();
     321
     322                $p = $this->factory->post->create( array(
     323                        'post_name' => '11',
     324                ) );
     325
     326                $found = get_sample_permalink( $p );
     327                $this->assertEquals( '11-2', $found[1] );
     328
     329                $wp_rewrite->set_permalink_structure( '' );
     330                flush_rewrite_rules();
     331        }
     332
     333        /**
     334         * @ticket 5305
     335         */
     336        public function test_get_sample_permalink_should_ignore_potential_month_conflicts_for_invalid_monthnum() {
     337                global $wp_rewrite;
     338                $wp_rewrite->init();
     339                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     340                $wp_rewrite->flush_rules();
     341
     342                $p = $this->factory->post->create( array(
     343                        'post_name' => '13',
     344                ) );
     345
     346                $found = get_sample_permalink( $p );
     347                $this->assertEquals( '13', $found[1] );
     348
     349                $wp_rewrite->set_permalink_structure( '' );
     350                flush_rewrite_rules();
     351        }
     352
     353        /**
     354         * @ticket 5305
     355         */
     356        public function test_get_sample_permalink_should_avoid_slugs_that_would_create_clashes_with_day_archives() {
     357                global $wp_rewrite;
     358                $wp_rewrite->init();
     359                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     360                $wp_rewrite->flush_rules();
     361
     362                $p = $this->factory->post->create( array(
     363                        'post_name' => '30',
     364                ) );
     365
     366                $found = get_sample_permalink( $p );
     367                $this->assertEquals( '30-2', $found[1] );
     368
     369                $wp_rewrite->set_permalink_structure( '' );
     370                flush_rewrite_rules();
     371        }
     372
     373        /**
     374         * @ticket 5305
     375         */
     376        public function test_get_sample_permalink_should_iterate_slug_suffix_when_a_date_conflict_is_found() {
     377                global $wp_rewrite;
     378                $wp_rewrite->init();
     379                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     380                $wp_rewrite->flush_rules();
     381
     382                $this->factory->post->create( array(
     383                        'post_name' => '30-2',
     384                ) );
     385
     386                $p = $this->factory->post->create( array(
     387                        'post_name' => '30',
     388                ) );
     389
     390                $found = get_sample_permalink( $p );
     391                $this->assertEquals( '30-3', $found[1] );
     392
     393                $wp_rewrite->set_permalink_structure( '' );
     394                flush_rewrite_rules();
     395        }
     396
     397        /**
     398         * @ticket 5305
     399         */
     400        public function test_get_sample_permalink_should_ignore_potential_day_conflicts_for_invalid_day() {
     401                global $wp_rewrite;
     402                $wp_rewrite->init();
     403                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     404                $wp_rewrite->flush_rules();
     405
     406                $p = $this->factory->post->create( array(
     407                        'post_name' => '32',
     408                ) );
     409
     410                $found = get_sample_permalink( $p );
     411                $this->assertEquals( '32', $found[1] );
     412
     413                $wp_rewrite->set_permalink_structure( '' );
     414                flush_rewrite_rules();
     415        }
     416
     417        /**
     418         * @ticket 5305
     419         */
     420        public function test_get_sample_permalink_should_allow_daylike_slugs_if_permastruct_does_not_cause_an_archive_conflict() {
     421                global $wp_rewrite;
     422                $wp_rewrite->init();
     423                $wp_rewrite->set_permalink_structure( '/%year%/%month%/%day%/%postname%/' );
     424                $wp_rewrite->flush_rules();
     425
     426                $p = $this->factory->post->create( array(
     427                        'post_name' => '30',
     428                ) );
     429
     430                $found = get_sample_permalink( $p );
     431                $this->assertEquals( '30', $found[1] );
     432
     433                $wp_rewrite->set_permalink_structure( '' );
     434                flush_rewrite_rules();
     435        }
    272436}
  • new file tests/phpunit/tests/rewrite/numericSlugs.php

    diff --git tests/phpunit/tests/rewrite/numericSlugs.php tests/phpunit/tests/rewrite/numericSlugs.php
    new file mode 100644
    index 0000000..52d8ca7
    - +  
     1<?php
     2
     3/**
     4 * @group rewrite
     5 * @ticket 5305
     6 */
     7class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
     8        private $old_current_user;
     9
     10        public function setUp() {
     11                parent::setUp();
     12                $this->author_id = $this->factory->user->create( array( 'role' => 'editor' ) );
     13        }
     14
     15        public function test_go_to_year_segment_collision_without_title() {
     16                global $wp_rewrite, $wpdb;
     17                $wp_rewrite->init();
     18                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     19                $wp_rewrite->flush_rules();
     20
     21                $id = $this->factory->post->create( array(
     22                        'post_author'  => $this->author_id,
     23                        'post_status'  => 'publish',
     24                        'post_content' => rand_str(),
     25                        'post_title'   => '',
     26                        'post_name'    => '2015',
     27                        'post_date'    => '2015-02-01 01:00:00'
     28                ) );
     29
     30                // Force an ID that resembles a year format
     31                $wpdb->update(
     32                        $wpdb->posts,
     33                        array(
     34                                'ID'   => '2015',
     35                                'guid' => 'http://example.org/?p=2015'
     36                        ),
     37                        array( 'ID' => $id )
     38                );
     39
     40                $this->go_to( get_permalink( '2015' ) );
     41
     42                $this->assertQueryTrue( 'is_single', 'is_singular' );
     43
     44                $wp_rewrite->set_permalink_structure('');
     45        }
     46
     47        public function test_url_to_postid_year_segment_collision_without_title() {
     48                global $wp_rewrite, $wpdb;
     49                $wp_rewrite->init();
     50                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     51                $wp_rewrite->flush_rules();
     52
     53                $id = $this->factory->post->create( array(
     54                        'post_author'  => $this->author_id,
     55                        'post_status'  => 'publish',
     56                        'post_content' => rand_str(),
     57                        'post_title'   => '',
     58                        'post_name'    => '2015',
     59                        'post_date'    => '2015-02-01 01:00:00'
     60                ) );
     61
     62                // Force an ID that resembles a year format
     63                $wpdb->update(
     64                        $wpdb->posts,
     65                        array(
     66                                'ID'   => '2015',
     67                                'guid' => 'http://example.org/?p=2015'
     68                        ),
     69                        array( 'ID' => $id )
     70                );
     71
     72                $this->assertEquals( '2015', url_to_postid( get_permalink( '2015' ) ) );
     73
     74                $wp_rewrite->set_permalink_structure('');
     75        }
     76
     77        public function test_go_to_year_segment_collision_with_title() {
     78                global $wp_rewrite;
     79                $wp_rewrite->init();
     80                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     81                $wp_rewrite->flush_rules();
     82
     83                $id = $this->factory->post->create( array(
     84                        'post_author'  => $this->author_id,
     85                        'post_status'  => 'publish',
     86                        'post_content' => rand_str(),
     87                        'post_title'   => '2015',
     88                        'post_date'    => '2015-02-01 01:00:00',
     89                ) );
     90
     91                $this->go_to( get_permalink( $id ) );
     92
     93                $this->assertQueryTrue( 'is_single', 'is_singular' );
     94
     95                $wp_rewrite->set_permalink_structure('');
     96        }
     97
     98        public function test_url_to_postid_year_segment_collision_with_title() {
     99                global $wp_rewrite;
     100                $wp_rewrite->init();
     101                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     102                $wp_rewrite->flush_rules();
     103
     104                $id = $this->factory->post->create( array(
     105                        'post_author'  => $this->author_id,
     106                        'post_status'  => 'publish',
     107                        'post_content' => rand_str(),
     108                        'post_title'   => '2015',
     109                        'post_date'    => '2015-02-01 01:00:00',
     110                ) );
     111
     112                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     113
     114                $wp_rewrite->set_permalink_structure('');
     115        }
     116
     117        public function test_go_to_month_segment_collision_without_title() {
     118                global $wp_rewrite;
     119                $wp_rewrite->init();
     120                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     121                $wp_rewrite->flush_rules();
     122
     123                $id = $this->factory->post->create( array(
     124                        'post_author'  => $this->author_id,
     125                        'post_status'  => 'publish',
     126                        'post_content' => rand_str(),
     127                        'post_title'   => '',
     128                        'post_name'    => '02',
     129                        'post_date'    => '2015-02-01 01:00:00',
     130                ) );
     131
     132                $this->go_to( get_permalink( $id ) );
     133
     134                $this->assertQueryTrue( 'is_single', 'is_singular' );
     135
     136                $wp_rewrite->set_permalink_structure('');
     137        }
     138
     139        public function test_url_to_postid_month_segment_collision_without_title() {
     140                global $wp_rewrite;
     141                $wp_rewrite->init();
     142                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     143                $wp_rewrite->flush_rules();
     144
     145                $id = $this->factory->post->create( array(
     146                        'post_author'  => $this->author_id,
     147                        'post_status'  => 'publish',
     148                        'post_content' => rand_str(),
     149                        'post_title'   => '',
     150                        'post_name'    => '02',
     151                        'post_date'    => '2015-02-01 01:00:00',
     152                ) );
     153
     154                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     155
     156                $wp_rewrite->set_permalink_structure('');
     157        }
     158
     159        public function test_go_to_month_segment_collision_without_title_no_leading_zero() {
     160                global $wp_rewrite;
     161                $wp_rewrite->init();
     162                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     163                $wp_rewrite->flush_rules();
     164
     165                $id = $this->factory->post->create( array(
     166                        'post_author'  => $this->author_id,
     167                        'post_status'  => 'publish',
     168                        'post_content' => rand_str(),
     169                        'post_title'   => '',
     170                        'post_name'    => '2',
     171                        'post_date'    => '2015-02-01 01:00:00',
     172                ) );
     173
     174                $this->go_to( get_permalink( $id ) );
     175
     176                $this->assertQueryTrue( 'is_single', 'is_singular' );
     177
     178                $wp_rewrite->set_permalink_structure('');
     179        }
     180
     181        public function test_url_to_postid_month_segment_collision_without_title_no_leading_zero() {
     182                global $wp_rewrite;
     183                $wp_rewrite->init();
     184                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     185                $wp_rewrite->flush_rules();
     186
     187                $id = $this->factory->post->create( array(
     188                        'post_author'  => $this->author_id,
     189                        'post_status'  => 'publish',
     190                        'post_content' => rand_str(),
     191                        'post_title'   => '',
     192                        'post_name'    => '2',
     193                        'post_date'    => '2015-02-01 01:00:00',
     194                ) );
     195
     196                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     197
     198                $wp_rewrite->set_permalink_structure('');
     199        }
     200
     201        public function test_go_to_month_segment_collision_with_title() {
     202                global $wp_rewrite;
     203                $wp_rewrite->init();
     204                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     205                $wp_rewrite->flush_rules();
     206
     207                $id = $this->factory->post->create( array(
     208                        'post_author'  => $this->author_id,
     209                        'post_status'  => 'publish',
     210                        'post_content' => rand_str(),
     211                        'post_title'   => '02',
     212                        'post_date'    => '2015-02-01 01:00:00',
     213                ) );
     214
     215                $this->go_to( get_permalink( $id ) );
     216
     217                $this->assertQueryTrue( 'is_single', 'is_singular' );
     218
     219                $wp_rewrite->set_permalink_structure('');
     220        }
     221
     222        public function test_url_to_postid_month_segment_collision_with_title() {
     223                global $wp_rewrite;
     224                $wp_rewrite->init();
     225                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     226                $wp_rewrite->flush_rules();
     227
     228                $id = $this->factory->post->create( array(
     229                        'post_author'  => $this->author_id,
     230                        'post_status'  => 'publish',
     231                        'post_content' => rand_str(),
     232                        'post_title'   => '02',
     233                        'post_date'    => '2015-02-01 01:00:00',
     234                ) );
     235
     236                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     237
     238                $wp_rewrite->set_permalink_structure('');
     239        }
     240
     241        public function test_go_to_month_segment_collision_with_title_no_leading_zero() {
     242                global $wp_rewrite;
     243                $wp_rewrite->init();
     244                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     245                $wp_rewrite->flush_rules();
     246
     247                $id = $this->factory->post->create( array(
     248                        'post_author'  => $this->author_id,
     249                        'post_status'  => 'publish',
     250                        'post_content' => rand_str(),
     251                        'post_title'   => '2',
     252                        'post_date'    => '2015-02-01 01:00:00',
     253                ) );
     254
     255                $this->go_to( get_permalink( $id ) );
     256
     257                $this->assertQueryTrue( 'is_single', 'is_singular' );
     258
     259                $wp_rewrite->set_permalink_structure('');
     260        }
     261
     262        public function test_url_to_postid_month_segment_collision_with_title_no_leading_zero() {
     263                global $wp_rewrite;
     264                $wp_rewrite->init();
     265                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     266                $wp_rewrite->flush_rules();
     267
     268                $id = $this->factory->post->create( array(
     269                        'post_author'  => $this->author_id,
     270                        'post_status'  => 'publish',
     271                        'post_content' => rand_str(),
     272                        'post_title'   => '2',
     273                        'post_date'    => '2015-02-01 01:00:00',
     274                ) );
     275
     276                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     277
     278                $wp_rewrite->set_permalink_structure('');
     279        }
     280
     281        public function test_go_to_day_segment_collision_without_title() {
     282                global $wp_rewrite;
     283                $wp_rewrite->init();
     284                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     285                $wp_rewrite->flush_rules();
     286
     287                $id = $this->factory->post->create( array(
     288                        'post_author'  => $this->author_id,
     289                        'post_status'  => 'publish',
     290                        'post_content' => rand_str(),
     291                        'post_title'   => '',
     292                        'post_name'    => '01',
     293                        'post_date'    => '2015-02-01 01:00:00',
     294                ) );
     295
     296                $this->go_to( get_permalink( $id ) );
     297
     298                $this->assertQueryTrue( 'is_single', 'is_singular' );
     299
     300                $wp_rewrite->set_permalink_structure('');
     301        }
     302
     303        public function test_url_to_postid_day_segment_collision_without_title() {
     304                global $wp_rewrite;
     305                $wp_rewrite->init();
     306                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     307                $wp_rewrite->flush_rules();
     308
     309                $id = $this->factory->post->create( array(
     310                        'post_author'  => $this->author_id,
     311                        'post_status'  => 'publish',
     312                        'post_content' => rand_str(),
     313                        'post_title'   => '',
     314                        'post_name'    => '01',
     315                        'post_date'    => '2015-02-01 01:00:00',
     316                ) );
     317
     318                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     319
     320                $wp_rewrite->set_permalink_structure('');
     321        }
     322
     323        public function test_go_to_day_segment_collision_with_title() {
     324                global $wp_rewrite;
     325                $wp_rewrite->init();
     326                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     327                $wp_rewrite->flush_rules();
     328
     329                $id = $this->factory->post->create( array(
     330                        'post_author'  => $this->author_id,
     331                        'post_status'  => 'publish',
     332                        'post_content' => rand_str(),
     333                        'post_title'   => '01',
     334                        'post_date'    => '2015-02-01 01:00:00',
     335                ) );
     336
     337                $this->go_to( get_permalink( $id ) );
     338
     339                $this->assertQueryTrue( 'is_single', 'is_singular' );
     340
     341                $wp_rewrite->set_permalink_structure('');
     342        }
     343
     344        public function test_url_to_postid_day_segment_collision_with_title() {
     345                global $wp_rewrite;
     346                $wp_rewrite->init();
     347                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     348                $wp_rewrite->flush_rules();
     349
     350                $id = $this->factory->post->create( array(
     351                        'post_author'  => $this->author_id,
     352                        'post_status'  => 'publish',
     353                        'post_content' => rand_str(),
     354                        'post_title'   => '01',
     355                        'post_date'    => '2015-02-01 01:00:00',
     356                ) );
     357
     358                $this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
     359
     360                $wp_rewrite->set_permalink_structure('');
     361        }
     362
     363        public function test_numeric_slug_permalink_conflicts_should_only_be_resolved_for_the_main_query() {
     364                global $wp_rewrite;
     365                $wp_rewrite->init();
     366                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     367                $wp_rewrite->flush_rules();
     368
     369                $id = $this->factory->post->create( array(
     370                        'post_author'  => $this->author_id,
     371                        'post_status'  => 'publish',
     372                        'post_content' => rand_str(),
     373                        'post_title'   => '01',
     374                        'post_date'    => '2015-02-01 01:00:00',
     375                ) );
     376
     377                $q = new WP_Query( array(
     378                        'year'     => '2015',
     379                        'monthnum' => '02',
     380                        'day'      => '01',
     381                ) );
     382
     383                $this->assertTrue( $q->is_day );
     384                $this->assertFalse( $q->is_single );
     385
     386                $wp_rewrite->set_permalink_structure('');
     387        }
     388
     389        public function test_date_slug_collision_should_distinguish_valid_pagination_from_date() {
     390                global $wp_rewrite;
     391                $wp_rewrite->init();
     392                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     393                $wp_rewrite->flush_rules();
     394
     395                $id = $this->factory->post->create( array(
     396                        'post_author'  => $this->author_id,
     397                        'post_status'  => 'publish',
     398                        'post_content' => 'Page 0<!--nextpage-->Page 1<!--nextpage-->Page 2<!--nextpage-->Page 3',
     399                        'post_title'   => '02',
     400                        'post_date'    => '2015-02-01 01:00:00',
     401                ) );
     402
     403                $this->go_to( get_permalink( $id ) . '1' );
     404
     405                $this->assertFalse( is_day() );
     406        }
     407
     408        public function test_date_slug_collision_should_distinguish_too_high_pagination_from_date() {
     409                global $wp_rewrite;
     410                $wp_rewrite->init();
     411                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     412                $wp_rewrite->flush_rules();
     413
     414                $id = $this->factory->post->create( array(
     415                        'post_author'  => $this->author_id,
     416                        'post_status'  => 'publish',
     417                        'post_content' => 'Page 0<!--nextpage-->Page 1<!--nextpage-->Page 2<!--nextpage-->Page 3',
     418                        'post_title'   => '02',
     419                        'post_date'    => '2015-02-05 01:00:00',
     420                ) );
     421
     422                $this->go_to( get_permalink( $id ) . '5' );
     423
     424                $this->assertTrue( is_day() );
     425        }
     426
     427        public function test_date_slug_collision_should_not_require_pagination_query_var() {
     428                global $wp_rewrite;
     429                $wp_rewrite->init();
     430                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     431                $wp_rewrite->flush_rules();
     432
     433                $id = $this->factory->post->create( array(
     434                        'post_author'  => $this->author_id,
     435                        'post_status'  => 'publish',
     436                        'post_content' => 'Page 0<!--nextpage-->Page 1<!--nextpage-->Page 2<!--nextpage-->Page 3',
     437                        'post_title'   => '02',
     438                        'post_date'    => '2015-02-05 01:00:00',
     439                ) );
     440
     441                $this->go_to( get_permalink( $id ) );
     442
     443                $this->assertQueryTrue( 'is_single', 'is_singular' );
     444                $this->assertFalse( is_date() );
     445        }
     446
     447        public function test_date_slug_collision_should_be_ignored_when_pagination_var_is_present_but_post_does_not_have_multiple_pages() {
     448                global $wp_rewrite;
     449                $wp_rewrite->init();
     450                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     451                $wp_rewrite->flush_rules();
     452
     453                $id = $this->factory->post->create( array(
     454                        'post_author'  => $this->author_id,
     455                        'post_status'  => 'publish',
     456                        'post_content' => 'This post does not have pagination.',
     457                        'post_title'   => '02',
     458                        'post_date'    => '2015-02-05 01:00:00',
     459                ) );
     460
     461                $this->go_to( get_permalink( $id ) . '5' );
     462
     463                $this->assertTrue( is_day() );
     464        }
     465}