基于类别名称的SEO URL在URL中没有类别id


SEO URL based on category name without have a category id in URL

我有两个表posts&categories

post_id | post_title  | post_content   | post_cat
--------------------------------------------------
1         Hello World  welcome to my..   1
.         ..           ..                ..

categories

cat_id | cat_name | cat_parent
-----------------------------
1        News       NULL
2        Sports     1
.        ...        .. 

假设新闻的当前类别链接是http://domain.com/category/1/

MySQL报表

SELECT posts.post_id,
       posts.post_id,
       posts.post_title,
       posts.post_content,
       posts.post_cat,
       categories.cat_id,
       categories.cat_name,
       categories.cat_parent
FROM   posts
       INNER JOIN categories
         ON posts.post_cat = categories.cat_id  
       WHERE posts.post_cat = (int)$_GET['cat_id']

所以我们可以得到post_cat = 1 的结果

根据我目前的数据库结构,如何删除ID,但将其更改为一个漂亮的slug?示例:-

Main category - http://domain.com/category/news/
Sub category  - http://domain.com/category/news/sports/

让我知道一个线索,脚本将如何告诉News等于post_cat列上的1

您可以使用.htaccess文件为您重写URL。

.htaccess文件中的条目如下所示:

RewriteEngine on
RewriteCond $1 ^category 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ parseCategoryUrl.php?q=$1 [L,QSA]

我将在这里分解行,以帮助理解发生了什么以及每行的含义:

  1. 打开"重写引擎"
  2. 这种重写只会发生在主机名后的第一个单词是category的URL上——所有以该单词开头的URL都将由下面的行处理
  3. 该规则将排除指向实际文件!-fURL
  4. 该规则将排除指向实际目录!-dURL
  5. 实际规则将捕获整个request_uri并将其传递给parseCategoryUrl.php文件,其中整个请求作为$_GET数组中名为q(查询)的参数。规则末尾的标志(L,QSA)做两件事。
    • L-这是最后一条规则。处理完这一行后,.htaccess文件将停止对当前URL执行操作
    • QSA-将查询字符串附加到重写后的URL(这样我们以后就可以解析它)

您的parseCategoryUrl.php文件可能包含类似以下内容:

$request = explode('/',$_GET['q'] );
array_shift($request);

第一行将通过斜杠将请求拆分为一个数组,第二行从数组开头删除单词category(因为我们知道我们正在解析类别URL)。

最后的$request数组,带有URL示例,例如:http://example.domain.com/category/news/sports
将是这样的:

Array
(
    [0] => news
    [1] => sports
)

因此,您可以在这里看到,您现在已经成功地将URL拆分为一个数组;您现在所要做的就是查询数据库,并为用户提供正确的页面
因为parseCategoryUrl.php页面实际上没有输出,所以您可以使用include()函数根据提供的URL插入正确的页面。


SEO是为了让你的页面和它们的URL对搜索引擎更有信息性,这样在互联网上搜索的用户就能够收到与他们的搜索查询相关的页面结果。搜索引擎正在查看URL:http://domain.com/category/1/2将无法提取太多信息。但是,如果您的URL包含(如您的问题所需)类别信息,则搜索引擎将能够推断出特定URL与有关

  • http://domain.com/category/news/-新闻
  • http://domain.com/category/news/sports-体育新闻
  • http://domain.com/category/blog/-博客
  • 等等

这与生成带有id的url没有什么不同。使用相同的逻辑生成带有title的url。不管我怎么看,只有一件事,你需要记住。

类别名称必须是唯一的,不惜一切代价

放置.htaccess以确保标题正确重定向到页面

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /category.php?title=$1 [L]

然后,不在查询中使用id,而是使用title

SELECT posts.post_id,
       posts.post_id,
       posts.post_title,
       posts.post_content,
       posts.post_cat,
       categories.cat_id,
       categories.cat_name,
       categories.cat_parent
FROM   posts
       INNER JOIN categories
         ON posts.post_cat = categories.cat_id  
Where 
      categories.cat_name = 'News'

同样对于子类别,上述查询应该有效,因为所有类别都放在同一个表中。