开发者

Make SEO sensitive URL (avoid id) Zend framework

开发者 https://www.devze.com 2023-02-19 21:58 出处:网络
i have url like this : http://quickstart.local/public/category1/product2 and in url (categ开发者_如何学编程ory1/product2) numbers are id , categorys and products fetched from database attention to

i have url like this :

http://quickstart.local/public/category1/product2

and in url (categ开发者_如何学编程ory1/product2) numbers are id , categorys and products fetched from database attention to the id

id is unique

i need to the sensitive url like zend framework url. for example :http://stackoverflow.com/questions/621380/seo-url-structure

how i can convert that url to the new url like this

is there any way?!!


You'll need to store a unique value in your database with a field name such as 'url' or something similar. Every time you generate a new product you will have to create this unique url and store it with the product information. A common way to do this is to take the name of the product and make it url friendly:

public function generateUrl($name)
{
    $alias = str_replace(' ', '-', strtolower(trim($name)));
    return preg_replace('/[^A-Za-z0-9-]/', '', $alias);
}

Calling this method:

$url = $this->generateUrl("My amazing product!");
echo $url;

will output:

my-amazing-product

You'll need to check that the output from this function does not already exist in the database as you will use this value to query on instead of the id.

If you apply this logic to the categories as well, you can have easily readable and descriptive urls like the one below. You may need to tweak your routing before this works correctly though.

http://quickstart.local/public/awesome-stuff/my-amazing-product


You could use ZF's Zend_Controller_Router_Route. For example, to make similar url to those used by SO, one could define a custom route in an application.ini as follows (assuming you have controller and action called questions and show respectively):

resources.router.routes.questions.route = '/questions/:id/:title'
resources.router.routes.questions.type = "Zend_Controller_Router_Route" 
resources.router.routes.questions.defaults.module = default
resources.router.routes.questions.defaults.controller = questions
resources.router.routes.questions.defaults.action = show
resources.router.routes.questions.defaults.id = 
resources.router.routes.questions.defaults.title = 
resources.router.routes.questions.reqs.id = "\d+" 

Having such a route, in your views you could generate an url as follows:

<?php echo $this->url(array('id'=>621380,'title' => 'seo url structure'),'questions');
// results in: /myapp/public/questions/621380/seo+url+structure

//OR if you really want to have dashes in your title:

<?php echo $this->url(array('id'=>621380,'title' => preg_replace('/\s+/','-','seo url structure'),'questions');
// results in: /myapp/public/questions/621380/seo-url-structure

Note that /myapp/public/ is in the url generated because I don't have virtual hosts setup on my localhost nor any modifications of .htaccess made. Also note that you don't need to have unique :title, because your real id is in :id variable.

As a side note, if you wanted to make it slightly more user friendly, it would be better to have your url as /question/621380/see-url-structure rather than /questions/621380/see-url-structure. This is because under this url you would have only one question, not many questions. This could be simply done by changing the route to the following resources.router.routes.questions.route = '/question/:id/:title'.

EDIT:

And what to do with categories and products that you have in your question? So, I would define a custom route, but this time using Zend_Controller_Router_Route_Regex:

resources.router.routes.questions.route = '/questions/(\d+)-(d+)/(\w*)'
resources.router.routes.questions.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.questions.defaults.module = default
resources.router.routes.questions.defaults.controller = questions
resources.router.routes.questions.defaults.action = show
resources.router.routes.questions.map.1 = category
resources.router.routes.questions.map.2 = product
resources.router.routes.questions.map.3 = title
resources.router.routes.questions.reverse = "questions/%d-%d/%s"

The url for this route would be then generated:

<?php echo $this->url(array('category' => 6213,'product' => 80,'title' => preg_replace('/\s+/', '-', 'seo url structure')),'questions' );    ?>
// results in: /myapp/public/questions/6213-80/seo-url-structure

Hope this will help or at least point you in the right direction.

0

精彩评论

暂无评论...
验证码 换一张
取 消