Szukaj…


Konfigurowanie adresów URL specyficznych dla kultury

Posiadanie adresów URL specyficznych dla kultury może być korzystne pod względem SEO.

Np. Angielska wersja następującej strony:

http://www.mydomain.com/insurance

Przetłumaczyłby się na:

http://www.mydomain.nl/verzekering

Zamiast:

http://www.mydomain.nl/nl-nl/insurance

Istnieje więcej sposobów osiągnięcia tego celu:

  1. Zazwyczaj adresy URL powinny pochodzić z nazw dokumentów. W tym celu ustaw opcję Użyj ścieżki nazwy dla ścieżki adresu URL na wartość true. Domyślnie jest to fałsz. Użyj ścieżki nazwy dla ścieżki adresu URL

  2. Jeśli domyślny wzorzec tworzenia adresów URL nie działa, możesz ustawić adresy URL ręcznie, zgodnie z opisem w oficjalnej dokumentacji . Ta opcja jest jednak wykonalna tylko wtedy, gdy trzeba dostosować małe ilości adresów URL.

  3. Jeśli chcesz zautomatyzować tworzenie adresów URL na podstawie niestandardowego wzorca, możesz zaimplementować niestandardowy moduł .

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();
    }
}
  1. Jeśli musisz zaktualizować istniejące strony (np. Jeśli zapomniałeś zaznaczyć opcję Użyj ścieżki nazwy dla ścieżki adresu URL przed rozpoczęciem opracowywania projektu), możesz użyć prostej aplikacji konsoli, która zaktualizuje adresy URL za Ciebie:
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();
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow