Joomla is one of the most popular CMS. It is more flexible rather than others. Joomla provides a facility to create search engine friendly Url’s from its dashboard. By default, Joomla adds post id in permalink. Today you learn how to remove the id from Joomla permalink.

In global configuration change these setting from Joomla Administration Panel.

How to remove ID from URL in Joomla 2.5-3.0

If article number shows in URL,
“”http://abc.com/23-postname.html””    instead of      “”http://abc.com/postname.html””

Open components\com_content\router.php in an editor and make a small changes:

in function ContentBuildRoute(&$query) replace line 27

27
$advanced    = $params->get('sef_advanced_link', 0);

with

27
$advanced    = $params->get('sef_advanced_link', 1);

in function ContentParseRoute($segments) replace line 208

208
$advanced    = $params->get('sef_advanced_link', 0);

with

208
$advanced    = $params->get('sef_advanced_link', 1);

Comment out lines 228-232

228
229
230
231
232
if (strpos($segments[0], ':') === false) {
    $vars['view'] = 'article';
    $vars['id'] = (int)$segments[0];
    return $vars;
}

so it would be

228
229
230
231
232
233
/*
if (strpos($segments[0], ':') === false) {
    $vars['view'] = 'article';
    $vars['id'] = (int)$segments[0];
    return $vars;
}*/

If feel difficult to change the value replace with new ‘router.php’ file

<?php
/**
* @package Joomla.Site
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/</span>defined('_JEXEC') or die;jimport('joomla.application.categories');/**
* Build the route for the com_content component
*
* @param array An array of URL arguments
* @return array The URL arguments to use to assemble the subsequent URL.
* @since 1.5
*/
function ContentBuildRoute(&$query)
{
$segments = array();// get a menu item based on Itemid or currently active
$app = JFactory::getApplication();
$menu = $app->getMenu();
$params = JComponentHelper::getParams('com_content');
$advanced = $params->get('sef_advanced_link', 1);// we need a menu item. Either the one specified in the query, or the current active one if none specified
if (empty($query['Itemid'])) {
$menuItem = $menu->getActive();
$menuItemGiven = false;
}
else {
$menuItem = $menu->getItem($query['Itemid']);
$menuItemGiven = true;
}if (isset($query['view'])) {
$view = $query['view'];
}
else {
// we need to have a view in the query or it is an invalid URL
return $segments;
}// are we dealing with an article or category that is attached to a menu item?
if (($menuItem instanceof stdClass) && $menuItem->query['view'] == $query['view'] && isset($query['id']) && $menuItem->query['id'] == intval($query['id'])) {
unset($query['view']);if (isset($query['catid'])) {
unset($query['catid']);
}

if (isset($query['layout'])) {
unset($query['layout']);
}

unset($query['id']);

return $segments;
}

if ($view == 'category' || $view == 'article')
{
if (!$menuItemGiven) {
$segments[] = $view;
}

unset($query['view']);

if ($view == 'article') {
if (isset($query['id']) && isset($query['catid']) && $query['catid']) {
$catid = $query['catid'];
// Make sure we have the id and the alias
if (strpos($query['id'], ':') === false) {
$db = JFactory::getDbo();
$aquery = $db->setQuery($db->getQuery(true)
->select('alias')
->from('#__content')
->where('id='.(int)$query['id'])
);
$alias = $db->loadResult();
$query['id'] = $query['id'].':'.$alias;
}
} else {
// we should have these two set for this view. If we don't, it is an error
return $segments;
}
}
else {
if (isset($query['id'])) {
$catid = $query['id'];
} else {
// we should have id set for this view. If we don't, it is an error
return $segments;
}
}

if ($menuItemGiven && isset($menuItem->query['id'])) {
$mCatid = $menuItem->query['id'];
} else {
$mCatid = 0;
}

$categories = JCategories::getInstance('Content');
$category = $categories->get($catid);

if (!$category) {
// we couldn't find the category we were given. Bail.
return $segments;
}

$path = array_reverse($category->getPath());

$array = array();

foreach($path as $id) {
if ((int)$id == (int)$mCatid) {
break;
}

list($tmp, $id) = explode(':', $id, 2);

$array[] = $id;
}

$array = array_reverse($array);

if (!$advanced && count($array)) {
$array[0] = (int)$catid.':'.$array[0];
}

$segments = array_merge($segments, $array);

if ($view == 'article') {
if ($advanced) {
list($tmp, $id) = explode(':', $query['id'], 2);
}
else {
$id = $query['id'];
}
$segments[] = $id;
}
unset($query['id']);
unset($query['catid']);
}

if ($view == 'archive') {
if (!$menuItemGiven) {
$segments[] = $view;
unset($query['view']);
}

if (isset($query['year'])) {
if ($menuItemGiven) {
$segments[] = $query['year'];
unset($query['year']);
}
}

if (isset($query['year']) && isset($query['month'])) {
if ($menuItemGiven) {
$segments[] = $query['month'];
unset($query['month']);
}
}
}

// if the layout is specified and it is the same as the layout in the menu item, we
// unset it so it doesn't go into the query string.
if (isset($query['layout'])) {
if ($menuItemGiven && isset($menuItem->query['layout'])) {
if ($query['layout'] == $menuItem->query['layout']) {

unset($query['layout']);
}
}
else {
if ($query['layout'] == 'default') {
unset($query['layout']);
}
}
}

return $segments;
}

/**
* Parse the segments of a URL.
*
* @param array The segments of the URL to parse.
*
* @return array The URL attributes to be used by the application.
* @since 1.5
*/
function ContentParseRoute($segments)
{
$vars = array();

//Get the active menu item.
$app = JFactory::getApplication();
$menu = $app->getMenu();
$item = $menu->getActive();
$params = JComponentHelper::getParams('com_content');
$advanced = $params->get('sef_advanced_link', 1);
$db = JFactory::getDBO();

// Count route segments
$count = count($segments);

// Standard routing for articles. If we don't pick up an Itemid then we get the view from the segments
// the first segment is the view and the last segment is the id of the article or category.
if (!isset($item)) {
$vars['view'] = $segments[0];
$vars['id'] = $segments[$count - 1];

return $vars;
}

// if there is only one segment, then it points to either an article or a category
// we test it first to see if it is a category. If the id and alias match a category
// then we assume it is a category. If they don't we assume it is an article
if ($count == 1) {
// we check to see if an alias is given. If not, we assume it is an article
/* if (strpos($segments[0], ':') === false) {
$vars['view'] = 'article';
$vars['id'] = (int)$segments[0];
return $vars;
}*/

list($id, $alias) = explode(':', $segments[0], 2);

// first we check if it is a category
$category = JCategories::getInstance('Content')->get($id);

if ($category && $category->alias == $alias) {
$vars['view'] = 'category';
$vars['id'] = $id;

return $vars;
} else {
$query = 'SELECT alias, catid FROM #__content WHERE id = '.(int)$id;
$db->setQuery($query);
$article = $db->loadObject();

if ($article) {
if ($article->alias == $alias) {
$vars['view'] = 'article';
$vars['catid'] = (int)$article->catid;
$vars['id'] = (int)$id;

return $vars;
}
}
}
}

// if there was more than one segment, then we can determine where the URL points to
// because the first segment will have the target category id prepended to it. If the
// last segment has a number prepended, it is an article, otherwise, it is a category.
if (!$advanced) {
$cat_id = (int)$segments[0];

$article_id = (int)$segments[$count - 1];

if ($article_id > 0) {
$vars['view'] = 'article';
$vars['catid'] = $cat_id;
$vars['id'] = $article_id;
} else {
$vars['view'] = 'category';
$vars['id'] = $cat_id;
}

return $vars;
}

// we get the category id from the menu item and search from there
$id = $item->query['id'];
$category = JCategories::getInstance('Content')->get($id);

if (!$category) {
JError::raiseError(404, JText::_('COM_CONTENT_ERROR_PARENT_CATEGORY_NOT_FOUND'));
return $vars;
}

$categories = $category->getChildren();
$vars['catid'] = $id;
$vars['id'] = $id;
$found = 0;

foreach($segments as $segment)
{
$segment = str_replace(':', '-', $segment);

foreach($categories as $category)
{
if ($category->alias == $segment) {
$vars['id'] = $category->id;
$vars['catid'] = $category->id;
$vars['view'] = 'category';
$categories = $category->getChildren();
$found = 1;
break;
}
}

if ($found == 0) {
if ($advanced) {
$db = JFactory::getDBO();
$query = 'SELECT id FROM #__content WHERE catid = '.$vars['catid'].' AND alias = '.$db->Quote($segment);
$db->setQuery($query);
$cid = $db->loadResult();
} else {
$cid = $segment;
}

$vars['id'] = $cid;

if ($item->query['view'] == 'archive' && $count != 1){
$vars['year'] = $count >= 2 ? $segments[$count-2] : null;
$vars['month'] = $segments[$count-1];
$vars['view'] = 'archive';
}
else {
$vars['view'] = 'article';
}
}
$found = 0;
}
return $vars;
}

Pin It on Pinterest

Shares
Share This