[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