WordPress.org

Make WordPress Core

Ticket #18962: 18962.2.diff

File 18962.2.diff, 5.7 KB (added by dd32, 7 years ago)

Includes fix from julien731 in #30339

  • src/wp-includes/post.php

     
    36913691                        do {
    36923692                                $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
    36933693                                $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID ) );
    36943694                                $suffix++;
    36953695                        } while ( $post_name_check );
    36963696                        $slug = $alt_post_name;
    36973697                }
    36983698        } elseif ( is_post_type_hierarchical( $post_type ) ) {
    36993699                if ( 'nav_menu_item' == $post_type )
    37003700                        return $slug;
    37013701
    37023702                /*
    37033703                 * Page slugs must be unique within their own trees. Pages are in a separate
    37043704                 * namespace than posts so page slugs are allowed to overlap post slugs.
    37053705                 */
    3706                 $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d AND post_parent = %d LIMIT 1";
     3706                $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN( %s, 'attachment' ) AND ID != %d AND post_parent = %d LIMIT 1";
    37073707                $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID, $post_parent ) );
    37083708
    37093709                /**
    37103710                 * Filter whether the post slug would make a bad hierarchical post slug.
    37113711                 *
    37123712                 * @since 3.1.0
    37133713                 *
    37143714                 * @param bool   $bad_slug    Whether the post slug would be bad in a hierarchical post context.
    37153715                 * @param string $slug        The post slug.
    37163716                 * @param string $post_type   Post type.
    37173717                 * @param int    $post_parent Post parent ID.
    37183718                 */
    37193719                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 ) ) {
    37203720                        $suffix = 2;
    37213721                        do {
    37223722                                $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
    3723                                 $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID, $post_parent ) );
     3723                                $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID, $post_parent ) ); 
    37243724                                $suffix++;
    37253725                        } while ( $post_name_check );
    37263726                        $slug = $alt_post_name;
    37273727                }
    37283728        } else {
    37293729                // Post slugs must be unique across all posts.
    37303730                $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
    37313731                $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID ) );
    37323732
    37333733                /**
    37343734                 * Filter whether the post slug would be bad as a flat slug.
    37353735                 *
    37363736                 * @since 3.1.0
    37373737                 *
    37383738                 * @param bool   $bad_slug  Whether the post slug would be bad as a flat slug.
  • tests/phpunit/tests/post.php

     
    10061006                $one = $this->factory->post->create( $args );
    10071007                $args['post_type'] = 'post-type-2';
    10081008                $two = $this->factory->post->create( $args );
    10091009
    10101010                $this->assertEquals( 'some-slug', get_post( $one )->post_name );
    10111011                $this->assertEquals( 'some-slug', get_post( $two )->post_name );
    10121012
    10131013                $this->assertEquals( 'some-other-slug', wp_unique_post_slug( 'some-other-slug', $one, 'publish', 'post-type-1', 0 ) );
    10141014                $this->assertEquals( 'some-other-slug', wp_unique_post_slug( 'some-other-slug', $one, 'publish', 'post-type-2', 0 ) );
    10151015
    10161016                _unregister_post_type( 'post-type-1' );
    10171017                _unregister_post_type( 'post-type-2' );
    10181018        }
    10191019
    10201020        /**
     1021         * @ticket 30339
     1022         */
     1023        function test_wp_unique_post_slug_with_hierarchy() {
     1024                register_post_type( 'post-type-1', array( 'hierarchical' => true ) );
     1025
     1026                $args = array(
     1027                        'post_type' => 'post-type-1',
     1028                        'post_name' => 'some-slug',
     1029                        'post_status' => 'publish',
     1030                );
     1031                $one = $this->factory->post->create( $args );
     1032                $args['post_name'] = 'some-slug-2';
     1033                $two = $this->factory->post->create( $args );
     1034
     1035                $this->assertEquals( 'some-slug', get_post( $one )->post_name );
     1036                $this->assertEquals( 'some-slug-2', get_post( $two )->post_name );
     1037
     1038                $this->assertEquals( 'some-slug-3', wp_unique_post_slug( 'some-slug', 0, 'publish', 'post-type-1', 0 ) );
     1039
     1040                _unregister_post_type( 'post-type-1' );
     1041        }
     1042
     1043        /**
     1044         * @ticket 18962
     1045         */
     1046        function test_wp_unique_post_slug_with_hierarchy_and_attachments() {
     1047                register_post_type( 'post-type-1', array( 'hierarchical' => true ) );
     1048
     1049                $args = array(
     1050                        'post_type' => 'post-type-1',
     1051                        'post_name' => 'some-slug',
     1052                        'post_status' => 'publish',
     1053                );
     1054                $one = $this->factory->post->create( $args );
     1055
     1056                $args = array(
     1057                        'post_mime_type' => 'image/jpeg',
     1058                        'post_type' => 'attachment',
     1059                        'post_name' => 'image'
     1060                );
     1061                $attachment = $this->factory->attachment->create_object( 'image.jpg', $one, $args );
     1062
     1063                $args = array(
     1064                        'post_type' => 'post-type-1',
     1065                        'post_name' => 'image',
     1066                        'post_status' => 'publish',
     1067                        'post_parent' => $one
     1068                );
     1069                $two = $this->factory->post->create( $args );
     1070
     1071                $this->assertEquals( 'some-slug', get_post( $one )->post_name );
     1072                $this->assertEquals( 'image', get_post( $attachment )->post_name );
     1073                $this->assertEquals( 'image-2', get_post( $two )->post_name );
     1074
     1075                // 'image' can be a child of image-2
     1076                $this->assertEquals( 'image', wp_unique_post_slug( 'image', 0, 'publish', 'post-type-1', $two ) );
     1077
     1078                _unregister_post_type( 'post-type-1' );
     1079        }
     1080
     1081        /**
    10211082         * @ticket 21212
    10221083         */
    10231084        function test_utf8mb3_post_saves_with_emoji() {
    10241085                global $wpdb;
    10251086                $_wpdb = new wpdb_exposed_methods_for_testing();
    10261087
    10271088                if ( 'utf8' !== $_wpdb->get_col_charset( $wpdb->posts, 'post_title' ) ) {
    10281089                        $this->markTestSkipped( 'This test is only useful with the utf8 character set' );
    10291090                }
    10301091
    10311092                require_once( ABSPATH . '/wp-admin/includes/post.php' );
    10321093
    10331094                $post_id = $this->factory->post->create();
    10341095
    10351096                $data = array(