kentico
Kulturspezifische URLs
Suche…
Konfigurieren von kulturspezifischen URLs
Kulturspezifische URLs können für SEO von Vorteil sein.
ZB englische Version der folgenden Seite:
http://www.mydomain.com/insurance
Würde übersetzen in:
http://www.mydomain.nl/verzekering
Anstatt:
http://www.mydomain.nl/nl-nl/insurance
Es gibt mehr Ansätze, um dies zu erreichen:
Normalerweise möchten Sie, dass die URLs von den Namen der Dokumente abgeleitet werden. Stellen Sie dazu sicher, dass Sie Namenspfad für URL-Pfad verwenden auf true setzen. Standardmäßig ist es falsch.
Wenn das Standard-URL-Erstellungsmuster für Sie nicht funktioniert, können Sie die URLs manuell wie in der offiziellen Dokumentation beschrieben einstellen. Diese Option ist jedoch nur möglich, wenn Sie kleine Mengen von URLs anpassen müssen.
Wenn Sie die Erstellung von URLs basierend auf einem benutzerdefinierten Muster automatisieren möchten, können Sie ein benutzerdefiniertes Modul implementieren.
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();
}
}
- Wenn Sie vorhandene Seiten aktualisieren möchten (z. B. wenn Sie vergessen haben, die Option Namenspfad für URL-Pfad verwenden zu verwenden, bevor Sie mit der Entwicklung Ihres Projekts begonnen haben), können Sie eine einfache Konsolenanwendung verwenden, die die URLs für Sie aktualisiert:
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();
}
}
}