Поиск…


Настройка URL-адресов, относящихся к культуре

Наличие URL-адресов, специфичных для конкретной культуры, может быть выгодным с точки зрения SEO.

Например, английская версия следующей страницы:

http://www.mydomain.com/insurance

Переведет на:

http://www.mydomain.nl/verzekering

Вместо:

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

Существует больше подходов к достижению этого:

  1. Обычно вам нужно, чтобы URL-адреса были получены из имен документов. Для этого убедитесь, что вы установили Use name path для URL path в значение true. По умолчанию это неверно. Использовать путь имени для URL-адреса

  2. Если шаблон URL-адреса по умолчанию не работает для вас, вы можете установить URL-адреса вручную, как описано в официальной документации . Однако этот вариант жизнеспособен, только если вам нужно настроить небольшое количество URL-адресов.

  3. Если вы хотите автоматизировать создание 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();
    }
}
  1. Если вам необходимо обновить существующие страницы (например, если вы забыли проверить Использовать путь имени для 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();
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow