[wp-trac] [WordPress Trac] #24776: Need Filter Hooks on Creating Slug - Check Availability of Slug if That is Used for Post, Page, Taxonomy or any Plugin
WordPress Trac
noreply at wordpress.org
Tue Jul 16 21:06:09 UTC 2013
#24776: Need Filter Hooks on Creating Slug - Check Availability of Slug if That is
Used for Post, Page, Taxonomy or any Plugin
-----------------------------+-----------------------------
Reporter: onetarek | Owner:
Type: feature request | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Plugins | Version:
Severity: normal | Keywords: dev-feedback
-----------------------------+-----------------------------
I did not find any '''filter hook''' for choosing slug for any object. I
have a plugin that creates its own URLs. eg. example.com/my-campaign . If
someone hits on this url then he will see my plugin generated page. But if
there is already a page "'''My Campaign'''" then WP is unable to show that
page because that '''permalink''' already taken by my plugin. So Before
creating my plugin slug I need to check '''WP posts, pages and
taxonomies''' if any of those already used my slug. I also need to check
Root directory of WordPress installation if there is a '''directory with
same name''' of my slug.
WP Core checks available slug in its own database and reserved words. But
it doesn't check slugs those are used by any plugin. If there is a post
name "'''my-campaign'''" then my plugin don't let to chose this slug but
If my plugin took this before and user want create a page "my-campaign"
then WordPress will take the same slug. And here is the main problem.
In the same way my plugin is conflicting with other plugins. My plugin can
check WordPress core slugs but not other plugins.
"'''Pretty Link'''" is one of the most popular plugin. It also creates its
own url. It also checks available slug in wordpres db but not in other
plugin.
Any plugin may have custom rewrite rule, then my plugin can not handle
that.
So I think we need a standard rule that will be followed by WordPress core
and all plugins.
I have three different plugins those need own slugs. I made a universal
process that I am using in all of my plugins.
I am explaining my process bellow.
I am using a filter hook ''''onetarek_is_slug_available'''' all of my
plugin use this filter before choosing a slug.
MY CODES:
{{{
<?php
function otk_filter_available_slug( $slug, $id=false)
{
if($slug==false)return false;
global $wpdb;
#Check if this slug already being used for any posts, pages or
categories
$has_postname = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM
{$wpdb->posts} WHERE post_name=%s LIMIT 1",$slug));
$has_taxonomy = $wpdb->get_var($wpdb->prepare("SELECT taxonomy FROM
{$wpdb->term_taxonomy} WHERE taxonomy=%s LIMIT 1",$slug));
if( $has_postname or $has_taxonomy )return false;
#Check if any same named file or directory exists in the root of
wordpress installation
$root_directory = opendir(ABSPATH);
$slug_lower=strtolower($slug); #we consider wp-content and Wp-
ContENT and WP-CONTENT are same.
while (($file = readdir($root_directory)) !== false)
{
$filename = strtolower($file);
if($filename == $slug_lower) return false;
}
#Check same slug is exists in click jacker database.
#if same slug exists and associate for given id then return slug .
We allow this
if($id){$id=intval($id);}
if($id)
{
$SQL = $wpdb->prepare("SELECT slug FROM
".CLICK_JACKER_CAMPAIGN_TABLE." WHERE slug=%s AND id =%d", $slug, $id);
$has_slug = $wpdb->get_var($SQL);
if( $has_slug == $slug ){return $slug;}
}
#if same slug exists and no id given then we don't accept this.
$SQL = $wpdb->prepare("SELECT slug FROM
".CLICK_JACKER_CAMPAIGN_TABLE." WHERE slug=%s", $slug);
$has_slug = $wpdb->get_var($SQL);
if( $has_slug == $slug )return false;
return $slug;
}
add_filter('onetarek_is_slug_available', 'otk_filter_available_slug', 10,
2); ?>
}}}
I am calling above filter where I need
{{{
<?php
$campaign_slug='my-campaign';
$myslug=apply_filters('onetarek_is_slug_available', $campaign_slug);
if($myslug)
{
#use $myslug
}
else
{
#chose another slug
}
?>
}}}
My technique is limited.
In my filter function I run 2 SQL query to check WP slugs , but that is
limited. WordPress has reserved words also, those are not being checked in
this process. And my other 2 plugins also run the same. Now if any website
uses my 3 plugins then same process will be run 3 times and 6 SQL query
will be run to check WP slugs. My function is unable to check the slug of
"Pretty Links" plugin.
But if '''WORDPRESS core''' would have a '''FILTER HOOK''' and run a
function with this filter to check any kind of WP slugs then my plugins
would search only its own database once. AND other plugin developer would
attach a function with this filter. And they would check only their own
database. Plugins don't need to check WP slugs because core function
already fired with this FILTER HOOK.
In the same way WP core should respect other plugin slugs and '''custom
url rewrite rules'''. When WP check available slug for post, page,
taxonomies then it should use this FILTER also.
I THOUGHT THIS WAY BECAUSE I DON'T FIND ANY WAY. IF ANYTHING ALREADY
EXISTS IN WP PLEASE LET ME KNOW.
Regards
Jahidul Islam (oneTarek)
[http://onetarek.com]
--
Ticket URL: <http://core.trac.wordpress.org/ticket/24776>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list