kentico
URL specifici della cultura
Ricerca…
Configurazione di URL specifici della cultura
Avere URL specifici per la cultura può essere utile in termini di SEO.
Per esempio la versione inglese della seguente pagina:
http://www.mydomain.com/insurance
Tradurrebbe in:
http://www.mydomain.nl/verzekering
Invece di:
http://www.mydomain.nl/nl-nl/insurance
Ci sono più approcci per ottenere questo:
Di solito, vorrai che gli URL siano derivati dai nomi dei documenti. Per fare ciò, assicurati di impostare Usa percorso del nome per il percorso dell'URL su true. Di default, è falso.
Se il pattern di creazione URL predefinito non funziona per te, puoi impostare gli URL manualmente come descritto nella documentazione ufficiale . Tuttavia, questa opzione è valida solo se è necessario regolare piccole quantità di URL.
Se si desidera automatizzare la creazione di URL in base a un modello personalizzato, è possibile implementare un modulo personalizzato .
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();
}
}
- Se è necessario aggiornare le pagine esistenti (ad es. Se hai dimenticato di selezionare Usa percorso del nome per il percorso URL prima di iniziare a sviluppare il tuo progetto) puoi utilizzare una semplice applicazione console che aggiornerà gli URL per te:
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();
}
}
}