WordPress.org

Make WordPress Core

Ticket #5305: 5305.15.diff

File 5305.15.diff, 24.9 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 9356ace..98f7ed1 100644
    function get_sample_permalink($id, $title = null, $name = null) { 
    12341234                $permalink = str_replace('%pagename%', "{$uri}%pagename%", $permalink);
    12351235        }
    12361236
     1237        // If the name is numeric and non-zero, verify that it won't clash with date archive URLs.
     1238        if ( preg_match( '/^[0-9]+$/', $post->post_name ) && $post_name_num = intval( $post->post_name ) ) {
     1239                $permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );
     1240                $postname_index = array_search( '%postname%', $permastructs );
     1241
     1242                /*
     1243                 * Potential date clashes are as follows:
     1244
     1245                 * - Any integer in the first permastruct position could be a year.
     1246                 * - An integer between 1 and 12 that follows 'year' conflicts with 'monthnum'.
     1247                 * - An integer between 1 and 31 that follows 'monthnum' conflicts with 'day'.
     1248                 */
     1249                if ( 0 === $postname_index ||
     1250                     ( $postname_index && '%year%' === $permastructs[ $postname_index - 1 ] && 13 > $post_name_num ) ||
     1251                     ( $postname_index && '%monthnum%' === $permastructs[ $postname_index - 1 ] && 32 > $post_name_num )
     1252                   ) {
     1253                        // Force a suffixed version of the slug.
     1254                        $filter = $ptype->hierarchical ? 'wp_unique_post_slug_is_bad_hierarchical_slug' : 'wp_unique_post_slug_is_bad_flat_slug';
     1255                        add_filter( $filter, '__return_true' );
     1256                        $post->post_name = wp_unique_post_slug( $post->post_name, 0, $post->post_status, $post->post_type, $post->post_parent );
     1257                        remove_filter( $filter, '__return_true' );
     1258                }
     1259        }
     1260
    12371261        /** This filter is documented in wp-admin/edit-tag-form.php */
    12381262        $permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name ) );
    12391263        $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..156426c 100644
    class WP { 
    306306                        }
    307307                }
    308308
     309                // Resolve conflicts between posts with numeric slugs and date archive queries.
     310                $this->query_vars = wp_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 51e3a6b..f35e7a8 100644
    function _wp_filter_taxonomy_base( $base ) { 
    277277        return $base;
    278278}
    279279
     280
     281/**
     282 * Resolve numeric slugs that collide with date permalinks.
     283 *
     284 * Permalinks of posts with numeric slugs can sometimes look to `WP_Query::parse_query()` like a date archive,
     285 * as when your permalink structure is `/%year%/%postname%/` and a post with post_name '05' has the URL
     286 * `/2015/05/`. This function detects these conflicts and resolves conflicts in favor of the post permalink.
     287 *
     288 * @since 4.3.0
     289 *
     290 * @param array $query_vars Query variables for setting up the loop, as determined in `WP::parse_request()`.
     291 * @return array Returns the original array of query vars, with date/post conflicts resolved.
     292 */
     293function wp_resolve_numeric_slug_conflicts( $query_vars = array() ) {
     294        if ( ! isset( $query_vars['year'] ) && ! isset( $query_vars['monthnum'] ) && ! isset( $query_vars['day'] ) ) {
     295                return $query_vars;
     296        }
     297
     298        // Identify the 'postname' position in the permastruct array.
     299        $permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );
     300        $postname_index = array_search( '%postname%', $permastructs );
     301
     302        if ( false === $postname_index ) {
     303                return $query_vars;
     304        }
     305
     306        /*
     307         * A numeric slug could be confused with a year, month, or day, depending on position. To account for
     308         * the possibility of post pagination (eg 2015/2 for the second page of a post called '2015'), our
     309         * `is_*` checks are generous: check for year-slug clashes when `is_year` *or* `is_month`, and check
     310         * for month-slug clashes when `is_month` *or* `is_day`.
     311         */
     312        $compare = '';
     313        if ( 0 === $postname_index && ( isset( $query_vars['year'] ) || isset( $query_vars['monthnum'] ) ) ) {
     314                $compare = 'year';
     315        } else if ( '%year%' === $permastructs[ $postname_index - 1 ] && ( isset( $query_vars['monthnum'] ) || isset( $query_vars['day'] ) ) ) {
     316                $compare = 'monthnum';
     317        } else if ( '%monthnum%' === $permastructs[ $postname_index - 1 ] && isset( $query_vars['day'] ) ) {
     318                $compare = 'day';
     319        }
     320
     321        if ( ! $compare ) {
     322                return $query_vars;
     323        }
     324
     325        // This is the potentially clashing slug.
     326        $value = $query_vars[ $compare ];
     327
     328        $post = get_page_by_path( $value, OBJECT, 'post' );
     329        if ( ! ( $post instanceof WP_Post ) ) {
     330                return $query_vars;
     331        }
     332
     333        /*
     334         * If the located post contains nextpage pagination, then the URL chunk following postname may be
     335         * intended as the page number. Verify that it's a valid page before resolving to it.
     336         */
     337        $maybe_page = '';
     338        if ( 'year' === $compare && isset( $query_vars['monthnum'] ) ) {
     339                $maybe_page = $query_vars['monthnum'];
     340        } else if ( 'monthnum' === $compare && isset( $query_vars['day'] ) ) {
     341                $maybe_page = $query_vars['day'];
     342        }
     343
     344        $post_page_count = substr_count( $post->post_content, '<!--nextpage-->' ) + 1;
     345
     346        // If the post doesn't have multiple pages, but a 'page' candidate is found, resolve to the date archive.
     347        if ( 1 === $post_page_count && $maybe_page ) {
     348                return $query_vars;
     349        }
     350
     351        // If the post has multiple pages and the 'page' number isn't valid, resolve to the date archive.
     352        if ( $post_page_count > 1 && $maybe_page > $post_page_count ) {
     353                return $query_vars;
     354        }
     355
     356        // If we've gotten to this point, we have a slug/date clash. First, adjust for nextpage.
     357        if ( '' !== $maybe_page ) {
     358                $query_vars['page'] = intval( $maybe_page );
     359        }
     360
     361        // Next, unset autodetected date-related query vars.
     362        unset( $query_vars['year'] );
     363        unset( $query_vars['monthnum'] );
     364        unset( $query_vars['day'] );
     365
     366        // Then, set the identified post.
     367        $query_vars['name'] = $post->post_name;
     368
     369        // Finally, return the modified query vars.
     370        return $query_vars;
     371}
     372
    280373/**
    281374 * Examine a url and try to determine the post ID it represents.
    282375 *
    function url_to_postid($url) { 
    392485                                }
    393486                        }
    394487
     488                        // Resolve conflicts between posts with numeric slugs and date archive queries.
     489                        $query = wp_resolve_numeric_slug_conflicts( $query );
     490
    395491                        // Do the query
    396492                        $query = new WP_Query( $query );
    397493                        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 5d2623a..e25a917 100644
    class Tests_Admin_includesPost extends WP_UnitTestCase { 
    313313                $wp_rewrite->set_permalink_structure( $old_permalink_structure );
    314314                flush_rewrite_rules();
    315315        }
     316
     317        /**
     318         * @ticket 5305
     319         */
     320        public function test_get_sample_permalink_should_avoid_slugs_that_would_create_clashes_with_year_archives() {
     321                global $wp_rewrite;
     322                $wp_rewrite->init();
     323                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     324                $wp_rewrite->flush_rules();
     325
     326                $p = $this->factory->post->create( array(
     327                        'post_name' => '2015',
     328                ) );
     329
     330                $found = get_sample_permalink( $p );
     331                $this->assertEquals( '2015-2', $found[1] );
     332
     333                $wp_rewrite->set_permalink_structure( '' );
     334                flush_rewrite_rules();
     335        }
     336
     337        /**
     338         * @ticket 5305
     339         */
     340        public function test_get_sample_permalink_should_allow_yearlike_slugs_if_permastruct_does_not_cause_an_archive_conflict() {
     341                global $wp_rewrite;
     342                $wp_rewrite->init();
     343                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     344                $wp_rewrite->flush_rules();
     345
     346                $p = $this->factory->post->create( array(
     347                        'post_name' => '2015',
     348                ) );
     349
     350                $found = get_sample_permalink( $p );
     351                $this->assertEquals( '2015', $found[1] );
     352
     353                $wp_rewrite->set_permalink_structure( '' );
     354                flush_rewrite_rules();
     355        }
     356
     357        /**
     358         * @ticket 5305
     359         */
     360        public function test_get_sample_permalink_should_avoid_slugs_that_would_create_clashes_with_month_archives() {
     361                global $wp_rewrite;
     362                $wp_rewrite->init();
     363                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     364                $wp_rewrite->flush_rules();
     365
     366                $p = $this->factory->post->create( array(
     367                        'post_name' => '11',
     368                ) );
     369
     370                $found = get_sample_permalink( $p );
     371                $this->assertEquals( '11-2', $found[1] );
     372
     373                $wp_rewrite->set_permalink_structure( '' );
     374                flush_rewrite_rules();
     375        }
     376
     377        /**
     378         * @ticket 5305
     379         */
     380        public function test_get_sample_permalink_should_ignore_potential_month_conflicts_for_invalid_monthnum() {
     381                global $wp_rewrite;
     382                $wp_rewrite->init();
     383                $wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
     384                $wp_rewrite->flush_rules();
     385
     386                $p = $this->factory->post->create( array(
     387                        'post_name' => '13',
     388                ) );
     389
     390                $found = get_sample_permalink( $p );
     391                $this->assertEquals( '13', $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_avoid_slugs_that_would_create_clashes_with_day_archives() {
     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' => '30',
     408                ) );
     409
     410                $found = get_sample_permalink( $p );
     411                $this->assertEquals( '30-2', $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_iterate_slug_suffix_when_a_date_conflict_is_found() {
     421                global $wp_rewrite;
     422                $wp_rewrite->init();
     423                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     424                $wp_rewrite->flush_rules();
     425
     426                $this->factory->post->create( array(
     427                        'post_name' => '30-2',
     428                ) );
     429
     430                $p = $this->factory->post->create( array(
     431                        'post_name' => '30',
     432                ) );
     433
     434                $found = get_sample_permalink( $p );
     435                $this->assertEquals( '30-3', $found[1] );
     436
     437                $wp_rewrite->set_permalink_structure( '' );
     438                flush_rewrite_rules();
     439        }
     440
     441        /**
     442         * @ticket 5305
     443         */
     444        public function test_get_sample_permalink_should_ignore_potential_day_conflicts_for_invalid_day() {
     445                global $wp_rewrite;
     446                $wp_rewrite->init();
     447                $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
     448                $wp_rewrite->flush_rules();
     449
     450                $p = $this->factory->post->create( array(
     451                        'post_name' => '32',
     452                ) );
     453
     454                $found = get_sample_permalink( $p );
     455                $this->assertEquals( '32', $found[1] );
     456
     457                $wp_rewrite->set_permalink_structure( '' );
     458                flush_rewrite_rules();
     459        }
     460
     461        /**
     462         * @ticket 5305
     463         */
     464        public function test_get_sample_permalink_should_allow_daylike_slugs_if_permastruct_does_not_cause_an_archive_conflict() {
     465                global $wp_rewrite;
     466                $wp_rewrite->init();
     467                $wp_rewrite->set_permalink_structure( '/%year%/%month%/%day%/%postname%/' );
     468                $wp_rewrite->flush_rules();
     469
     470                $p = $this->factory->post->create( array(
     471                        'post_name' => '30',
     472                ) );
     473
     474                $found = get_sample_permalink( $p );
     475                $this->assertEquals( '30', $found[1] );
     476
     477                $wp_rewrite->set_permalink_structure( '' );
     478                flush_rewrite_rules();
     479        }
    316480}
  • 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}