kentico
URL-адреса, относящиеся к культуре
Поиск…
Настройка URL-адресов, относящихся к культуре
Наличие URL-адресов, специфичных для конкретной культуры, может быть выгодным с точки зрения SEO.
Например, английская версия следующей страницы:
http://www.mydomain.com/insurance
Переведет на:
http://www.mydomain.nl/verzekering
Вместо:
http://www.mydomain.nl/nl-nl/insurance
Существует больше подходов к достижению этого:
Обычно вам нужно, чтобы URL-адреса были получены из имен документов. Для этого убедитесь, что вы установили Use name path для URL path в значение true. По умолчанию это неверно.
Если шаблон URL-адреса по умолчанию не работает для вас, вы можете установить URL-адреса вручную, как описано в официальной документации . Однако этот вариант жизнеспособен, только если вам нужно настроить небольшое количество URL-адресов.
Если вы хотите автоматизировать создание URL-адресов на основе пользовательского шаблона, вы можете реализовать настраиваемый модуль .
using System;
using System.Text;
using CMS;
using CMS.DataEngine;
using CMS.DocumentEngine;
using CMS.Helpers;
[assembly: RegisterModule(typeof(CultureSpecificUrlsModule))]
public class CultureSpecificUrlsModule : Module
{
public CultureSpecificUrlsModule() : base("CultureSpecificUrlsModule")
{
}
protected override void OnInit()
{
base.OnInit();
/***
* Before the node gets saved, we'll update it's DocumentUrlPath.
* The system will ensure it'll be saved in a valid URL format.
*/
DocumentEvents.Update.Before += Update_Before;
}
private void Update_Before(object sender, DocumentEventArgs e)
{
/***
* Here you can apply conditions before you actually update the DocumentUrlPath.
* E.g. you can check for the document's culture.
*/
UpdateUrlPath(e.Node);
}
public static void UpdateUrlPath(TreeNode node)
{
/***
* You can set the DocumentUrlPath to whatever you want.
* In this example we're using a method extracted from CMS.DocumentEngine.TreePathUtils.
* The same method is used to generate a URL for the default culture.
*/
node.DocumentUrlPath = GetUrlPathFromNamePathInternal(node.DocumentNamePath);
}
internal static string GetUrlPathFromNamePathInternal(string namePath, int level = -1)
{
// Check valid path
if (String.IsNullOrEmpty(namePath) || (namePath == "/"))
{
return null;
}
// For top level the path is always /
if (level == 0)
{
return "/";
}
// Ensure maximal level if not set
if (level < 0)
{
level = Int32.MaxValue;
}
// Get the path parts
string[] pathParts = namePath.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
int currentLevel = 1;
var path = new StringBuilder();
foreach (string part in pathParts)
{
string shortPart = part;
// Shorten the part to the allowed maximum
if (shortPart.Length > TreePathUtils.MaxAliasLength)
{
shortPart = shortPart.Substring(0, TreePathUtils.MaxAliasLength);
}
path.Append("/", shortPart);
if (++currentLevel > level)
{
break;
}
}
return path.ToString();
}
}
- Если вам необходимо обновить существующие страницы (например, если вы забыли проверить Использовать путь имени для URL-адреса до начала разработки вашего проекта), вы можете использовать простое консольное приложение, которое обновит URL-адреса для вас:
using System;
using CMS.DataEngine;
using CMS.DocumentEngine;
namespace CultureUrlsUtil
{
class Program
{
static void Main(string[] args)
{
CMSApplication.Init();
/*** Here you can narrow down the scope of documents that should be updated using DocumentQuery ***/
var pages = DocumentHelper.GetDocuments().Culture("es-es");
foreach (var page in pages)
{
/*** Here we are calling code from the example above. ***/
CultureSpecificUrlsModule.UpdateUrlPath(page);
page.Update();
}
Console.Write("URLs created!");
Console.ReadLine();
}
}
}