kentico
URLs específicas de la cultura
Buscar..
Configurando URLs culturales específicas
Tener URL específicas de cada cultura puede ser beneficioso en términos de SEO.
Ej. Versión en inglés de la siguiente página:
http://www.mydomain.com/insurance
Se traduciría en:
http://www.mydomain.nl/verzekering
En lugar de:
http://www.mydomain.nl/nl-nl/insurance
Hay más enfoques para lograr esto:
Normalmente, querrá que las URL se deriven de los nombres de los documentos. Para hacerlo, asegúrese de establecer Usar ruta de nombre para la ruta de la URL como verdadero. Por defecto, es falso.
Si el patrón de creación de URL predeterminado no funciona, puede configurar las URL manualmente como se describe en la documentación oficial . Sin embargo, esta opción es viable solo si necesita ajustar pequeñas cantidades de URL.
Si desea automatizar la creación de URL basadas en un patrón personalizado, puede implementar un módulo personalizado .
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();
}
}
- Si necesita actualizar las páginas existentes (por ejemplo, si olvidó marcar Usar la ruta del nombre para la ruta de la URL antes de comenzar a desarrollar su proyecto), puede usar una sencilla aplicación de consola que actualizará las URL para usted:
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();
}
}
}