[wp-trac] [WordPress Trac] #37043: New filter `pre_unique_post_slug`

WordPress Trac noreply at wordpress.org
Tue Jun 7 07:42:37 UTC 2016


#37043: New filter `pre_unique_post_slug`
------------------------------+-----------------------------
 Reporter:  sebastian.pisula  |      Owner:
     Type:  enhancement       |     Status:  new
 Priority:  normal            |  Milestone:  Awaiting Review
Component:  General           |    Version:
 Severity:  normal            |   Keywords:
  Focuses:                    |
------------------------------+-----------------------------
 This filter will be for multilanguages plugins helpful.

 For example I have page:
 News in English with url http://example.com/en/news/ and
 News in Polish with url http://example.com/pl/news/

 For Polish version this will be have slug news-2 but should be have news.

 If new filter will be added then we can generate slug for my pages.

 I know that I can use wp_unique_post_slug filter but more optimally will
 be add pre_unique_post_slug filter because will be less SQL Queries
 because this code:

 {{{#!php
 <?php
 if ( is_post_type_hierarchical( $post_type ) ) {
                 if ( 'nav_menu_item' == $post_type )
                         return $slug;

                 /*
                  * Page slugs must be unique within their own trees. Pages
 are in a separate
                  * namespace than posts so page slugs are allowed to
 overlap post slugs.
                  */
                 $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";
                 $post_name_check = $wpdb->get_var( $wpdb->prepare(
 $check_sql, $slug, $post_type, $post_ID, $post_parent ) );

                 /**
                  * Filters whether the post slug would make a bad
 hierarchical post slug.
                  *
                  * @since 3.1.0
                  *
                  * @param bool   $bad_slug    Whether the post slug would
 be bad in a hierarchical post context.
                  * @param string $slug        The post slug.
                  * @param string $post_type   Post type.
                  * @param int    $post_parent Post parent ID.
                  */
                 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 ) ) {
                         $suffix = 2;
                         do {
                                 $alt_post_name = _truncate_post_slug(
 $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
                                 $post_name_check = $wpdb->get_var(
 $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID,
 $post_parent ) );
                                 $suffix++;
                         } while ( $post_name_check );
                         $slug = $alt_post_name;
                 }
         } else {
                 // Post slugs must be unique across all posts.
                 $check_sql = "SELECT post_name FROM $wpdb->posts WHERE
 post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
                 $post_name_check = $wpdb->get_var( $wpdb->prepare(
 $check_sql, $slug, $post_type, $post_ID ) );

                 // Prevent new post slugs that could result in URLs that
 conflict with date archives.
                 $post = get_post( $post_ID );
                 $conflicts_with_date_archive = false;
                 if ( 'post' === $post_type && ( ! $post ||
 $post->post_name !== $slug ) && preg_match( '/^[0-9]+$/', $slug ) &&
 $slug_num = intval( $slug ) ) {
                         $permastructs   = array_values( array_filter(
 explode( '/', get_option( 'permalink_structure' ) ) ) );
                         $postname_index = array_search( '%postname%',
 $permastructs );

                         /*
                          * Potential date clashes are as follows:
                          *
                          * - Any integer in the first permastruct position
 could be a year.
                          * - An integer between 1 and 12 that follows
 'year' conflicts with 'monthnum'.
                          * - An integer between 1 and 31 that follows
 'monthnum' conflicts with 'day'.
                          */
                         if ( 0 === $postname_index ||
                                 ( $postname_index && '%year%' ===
 $permastructs[ $postname_index - 1 ] && 13 > $slug_num ) ||
                                 ( $postname_index && '%monthnum%' ===
 $permastructs[ $postname_index - 1 ] && 32 > $slug_num )
                         ) {
                                 $conflicts_with_date_archive = true;
                         }
                 }

                 /**
                  * Filters whether the post slug would be bad as a flat
 slug.
                  *
                  * @since 3.1.0
                  *
                  * @param bool   $bad_slug  Whether the post slug would be
 bad as a flat slug.
                  * @param string $slug      The post slug.
                  * @param string $post_type Post type.
                  */
                 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 ) ) {
                         $suffix = 2;
                         do {
                                 $alt_post_name = _truncate_post_slug(
 $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
                                 $post_name_check = $wpdb->get_var(
 $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID ) );
                                 $suffix++;
                         } while ( $post_name_check );
                         $slug = $alt_post_name;
                 }
         }
 }}}

 Will useless for my plugin and unnecessary SQL Queries will be generate

--
Ticket URL: <https://core.trac.wordpress.org/ticket/37043>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list