Теги Umbraco 7 SEO

#seo #umbraco

#seo #umbraco

Вопрос:

У меня есть веб-сайт, для которого я хочу создать SEO-теги в Umbraco. Мне было интересно, как это делается? существуют ли какие-либо документы или рекомендации по наилучшей практике?

Ответ №1:

Я не эксперт по SEO, но, надеюсь, приведенные ниже фрагменты кода помогут вам начать

Метаданные

На страницах я добавил некоторые свойства. Если вы делаете это по типу документа, путем наследования или по композициям, которые вы можете выбрать. У меня определены следующие свойства.

  • Заголовок страницы, который я стремлюсь немного отличаться от названия страницы. Не уверен, имеет ли это какое-либо значение, однако я надеюсь, что это заставит еще несколько моих ключевых слов для статьи появиться либо в заголовке страницы, либо в названии страницы. Название страницы, которое я помещаю в <head> часть, и заголовок страницы используются как часть статьи / основного содержимого.

  • Фрагмент страницы, который я стремлюсь сделать как можно короче, и в основном менее 160 символов. В статье используется фрагмент страницы, а также краткое изложение метаданных.

  • Теги страниц, используемые для ключевых слов метаданных, а также для горизонтальной навигации по контенту на сайте.

  • Рекомендуемое изображение, хотя и не является строго частью SEO, важно как часть стратегии, чтобы сделать контент удобным для социальных сетей.

  • Автор, может иметь важное значение для SEO, и у меня есть свойство для основного автора, и в качестве свойства участника я регистрирую страницу профиля facebook.

Я начал писать макрос razor, однако он требует дополнительной работы, однако для меня он работает хорошо. Я размещаю его как запуск макроса в <head> части.

 @inherits Umbraco.Web.Macros.PartialViewMacroPage
@{  
    string domain = "https://"   HttpContext.Current.Request.Url.Host;
    string site_name = "sitename";
  string og_title = CurrentPage.Name; 
    string og_image = "";
    string og_description = "Description here";
    string facebookPageAuthor = "https://www.facebook.com/xx";
    string facebookPageSite = "https://www.facebook.com/xx";
    string authorName = "asdf";
    int authorId = 1099;
    string url = domain   CurrentPage.Url;
    string facebookAppId = "12341234";
    string twitterUserAuthor = "@asdf";
    string twitterUserSite = "@qwer";
    string logoUrl = domain   "/media/1006/logo.png";
    DateTime createDate = CurrentPage.CreateDate;
    DateTime updateDate = CurrentPage.UpdateDate;

    if (CurrentPage.pageTitle != null amp;amp; !(CurrentPage.pageTitle is Umbraco.Core.Dynamics.DynamicNull))
    { og_title = CurrentPage.pageTitle;}

    @* Check if this page has snippet, and use it exists *@
    if (CurrentPage.pageSnippet != null amp;amp; !(CurrentPage.pageSnippet is Umbraco.Core.Dynamics.DynamicNull))
    { og_description = CurrentPage.pageSnippet; }

    @* Check if this page has featured image, and crop to facebook preferred crop size (1200x630px). Use parent page default image it exists *@      
    if (CurrentPage.featuredImage != null amp;amp; !(CurrentPage.featuredImage is Umbraco.Core.Dynamics.DynamicNull))
    {   
        var featImage = Umbraco.TypedMedia((int)CurrentPage.featuredImage);
        og_image= featImage.GetCropUrl("1200x630"); }
    else 
    { 
        og_image = Umbraco.Media(CurrentPage.AncestorsOrSelf(1).First().featuredImage).GetCropUrl("1200x630"); 
    }

    @* Check if author has facebook page *@
    if ((int)CurrentPage.author >0)
        { 
        authorId = (int)CurrentPage.author;
        }

        var authorModel = Members.GetById(authorId);
        authorName = (string)authorModel.Name; 
        facebookPageAuthor = (string)authorModel.GetProperty("facebookProfilePage").Value; 

}   
<meta property="og:title" content="@og_title" />
<meta property="og:site_name" content="@site_name" />
<meta property="og:url" content="@url" />
<meta property="og:description" content="@og_description" />
<meta property="og:image" content="@domain@og_image" />
<meta property="fb:app_id" content="@facebookAppId" />
<meta property="og:type" content="article" />
<meta property="og:locale" content="en_US" />
<meta property="article:author" content="@facebookPageAuthor" />
<meta property="article:publisher" content="@facebookPageSite" />
<meta name="twitter:title" content="@og_title" />
<meta name="twitter:description" content="@og_description" />
<meta name="twitter:image:src" content="@domain@og_image" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@twitterUserSite" />
<meta name="twitter:creator" content="@twitterUserAuthor" />

<script type="application/ld json">
{
  "@@context": "http://schema.org",
  "@@type": "NewsArticle",
  "mainEntityOfPage":{
    "@@type":"WebPage",
    "@@id":"@url"
  },
  "headline": "@og_title",
  "image": {
    "@@type": "ImageObject",
    "url": "@domain@og_image",
    "height": 630,
    "width": 1200
  },
  "datePublished": "@createDate.ToString("o")",
  "dateModified": "@updateDate.ToString("o")",
  "author": {
    "@@type": "Person",
    "name": "@authorName"
  },
   "publisher": {
    "@@type": "Organization",
    "name": "domain.com",
    "logo": {
      "@@type": "ImageObject",
      "url": "@logoUrl",
      "width": "660",
      "height": "675"
    }
  },
  "description": "@og_description"
}
</script> 
  

Хлебная крошка

Макрос для создания макета с микроданными полезен для SEO.

 @using Umbraco.Web
@using Umbraco.Web.Mvc
@using Umbraco.Core
@using System.Web
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
    This snippet makes a breadcrumb of parents using an html ordered list.
    It makes metadata available for search engines in the Microdata format.
    The CSS is customised for Bootstrap 4
*@

@if (Model.Content.Ancestors().Any())
{
    var pageAncestors = Model.Content.Ancestors().OrderBy("Level");
<div>
    <ol class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList">       
        @foreach (var page in pageAncestors)
        {
                <li class="breadcrumb-item" itemprop="itemListElement" itemscope
                    itemtype="http://schema.org/ListItem">
                    <a itemscope itemtype="http://schema.org/Thing"
                       itemprop="item" href="@page.Url">
                        <span itemprop="name">@page.Name</span>
                    </a>
                    <meta itemprop="position" content="@page.Level" />
                </li>
        }
        <!-- And add the current page -->
        <li class="breadcrumb-item active" itemprop="itemListElement" itemscope
            itemtype="http://schema.org/ListItem">
                <span itemprop="name">@Model.Content.Name</span>
        </li>
    </ol>
</div>
}
  

Карта сайта

I карта сайта должна быть отправлена в поисковые системы. Макрос может быть чем-то вроде:

 @inherits Umbraco.Web.Macros.PartialViewMacroPage
@using Umbraco.Core.Models
@using Umbraco.Web
@using System.Linq;
@{ Layout = null;
Response.ContentType = "text/xml";
}<?xml version='1.0' encoding='UTF-8' ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
@ListChildNodes(Model.Content.AncestorOrSelf(1))
</urlset>

@helper ListChildNodes(IPublishedContent startNode)
{
    const int maxLevelForSiteMap = 100;

    foreach (var node in startNode.Children.Where(x => Umbraco.MemberHasAccess(x.Id, x.Path)).Where(x => !Umbraco.IsProtected(x.Id, x.Path)).Where(x => x.IsVisible()))
    {
        if (node.TemplateId > 0)
        {
            <url>
                <loc>@node.UrlWithDomain()</loc>
                <lastmod>@(string.Format("{0:s} 00:00", node.UpdateDate))</lastmod>
                @{
                    var freq = node.GetPropertyValue<string>("SearchEngineSitemapChangeFreq");
                    var pri = node.GetPropertyValue<string>("SearchEngineSitemapPriority");
                }

                @if (!string.IsNullOrEmpty(freq))
                {
                    <changefreq>@freq</changefreq>
                }
                @if (!string.IsNullOrEmpty(pri))
                {
                    <priority>@pri</priority>
                }
            </url>
        }

        if (node.Level <= maxLevelForSiteMap amp;amp; node.Children.Any())
        {
            @ListChildNodes(node)
        }
    }
}
  

Ответ №2:

У вас должны быть свойства для тех элементов внутри каждого документа, которые должны иметь их и будут отображаться / индексироваться и т.д. Вы можете достичь цели несколькими способами:

  1. Вы можете создать небольшой составной тип документа со всеми необходимыми свойствами (SeoTitle, SeoDescription, SeoKeywords и все, что вы хотите больше) и прикрепить его к своим типам документов (возможно, даже к какому-то основному типу документа, используемому для всех веб-страниц, отображаемых и индексируемых на вашем сайте). Затем вы можете создать частичное представление или отобразить значения из него в главном шаблоне. На мой взгляд, этот способ дает вам наилучший контроль над тем, что там есть, и мы делаем это для всех наших проектов (просто импортируем экспортированный документ композиции и прикрепляем его к нужным элементам в конкретном решении).

  2. Вы можете использовать пакет, например https://our.umbraco.org/projects/backoffice-extensions/seo-metadata-for-umbraco / который делает то же самое, но немного по-другому, дает вам возможность извлекать эти свойства из объекта currentPage. Вы можете прочитать больше о пакете здесь: https://ryanl.me/2015/04/13/seo-metadata-for-umbraco /.

Комментарии:

1. Мне нужно создать частичное представление в главном шаблоне, можете ли вы предоставить мне какую-либо ссылку или учебные пособия о том, как сделать это наилучшим образом, я был бы очень благодарен @Marcin Zajkowski

2. У вас есть отличное описание этой функции здесь: our.umbraco.org/documentation/Reference/Templating/Mvc /. … Счастливого кодирования!

Ответ №3:

Вот как это делает моя компания и как они научили меня, и это работает вплоть до этого самого момента, о котором мы говорим.

В настройках создайте тип документа без шаблона и вызовите его SEO . Затем добавьте туда свойства, которые вы хотите для своего SEO (и, конечно, вы можете обновить их в любое время). После этого создайте свою домашнюю страницу и любой другой узел как дочерний для вкладки SEO и сделайте так, чтобы они наследовали свойства. Таким образом, на каждой создаваемой вами странице будут наследоваться свойства SEO.

Профессиональный совет, который я узнал недавно. Вы можете использовать GetPropertyValue для свойств SEO в каждом узле, как если бы это были свойства узла для начала. (Нет необходимости искать Ancestors или Descendants и т. Д.

Вот как выглядит моя вкладка настроек:

Предварительный просмотр