我有网站我想在Umbraco中创建SEO标签。我想知道它是如何完成的?有没有最佳实践文件或建议?
答案 0 :(得分:2)
我不是SEO专家,但希望下面的代码片段可以帮助您入门
在我添加了一些属性的页面上。如果您按文档类型,通过继承或您可以选择的合成来执行此操作。我定义了以下属性。
页面标题,我的目标是与页面名称略有不同。不确定它是否有任何区别 - 但是我希望它能使我的焦点词更多地出现在页面标题或页面名称中。页面名称放在<head>
部分,页面标题用作文章/主要内容的一部分。
Page snippet ,我的目标是尽可能短,大多少于160个字符。本文中使用了页面摘要,以及元数据摘要。
网页代码,用于元数据关键字以及网站上的水平内容导航。
特色图片,虽然不是严格意义上的SEO的一部分,但重要的是作为策略的一部分,使内容对社交媒体友好。
作者,可能对SEO很重要,我有主要作者的财产,作为会员财产,我注册了Facebook个人资料页面。
我已经开始编写一个剃须刀宏,但它需要更多的工作,但对我来说效果很好。我把它放在<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 && !(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 && !(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 && !(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>
使用Microdata制作面包屑的宏对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>
}
我应该将站点地图提交给搜索引擎。宏可以是这样的:
@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 && node.Children.Any())
{
@ListChildNodes(node)
}
}
}
答案 1 :(得分:0)
您需要拥有每个文档中应包含这些项目的项目的属性,并显示/索引等。您可以通过多种方式实现目标:
您可以创建一个包含所有必需属性的小型合成文档类型( SeoTitle , SeoDescription , SeoKeywords 以及您想要的更多内容)并将其附加到您的文档类型(甚至可能是一些主文档类型,用于在您的网站上呈现和索引的所有网页)。然后,您可以在主模板上创建局部视图或从中渲染值。在我看来,这种方式可以让你最好地控制那里的内容,我们正在为所有项目进行操作(只需导入导出的合成文档类型并将其附加到特定解决方案中的所需项目)。
您可以使用套餐,例如https://our.umbraco.org/projects/backoffice-extensions/seo-metadata-for-umbraco/以不同的方式执行完全相同的操作,使您可以从 CurrentPage 对象中检索这些属性。您可以在此处详细了解该软件包:https://ryanl.me/2015/04/13/seo-metadata-for-umbraco/。
答案 2 :(得分:0)
以下是我的公司如何做以及他们如何教我,它正在努力,直到我们正在谈论这一刻。
在“设置”上,创建不带模板的文档类型,并将其命名为SEO
。然后在那里添加你想要的SEO属性(当然你可以随时更新它们)。之后,将您的主页和每个其他节点作为子项创建到SEO选项卡,并使它们继承属性。这样,在您创建的每个页面中,SEO属性都将被继承。
专业提示我最近了解到。您可以将GetPropertyValue用于每个节点中的SEO属性,就好像它是节点的属性一样。 (无需搜索Ancestors
或Descendants
等。
以下是我的“设置”标签的外观: