Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class TextSeoValueConverter : ISeoValueConverter
{
public Type FromValue => typeof(string);
public Type ToValue => typeof(string);

public object Convert(object value, IPublishedContent currentContent, string fieldAlias)
{
var stringValue = value?.ToString();
Expand All @@ -20,9 +21,24 @@ public object Convert(object value, IPublishedContent currentContent, string fie
{
url = url.TrimEnd('/');
}

return stringValue.Replace("%CurrentUrl%", url);
}
else if (stringValue?.Contains("%CurrentLang%") is true)
{
var lang = currentContent.GetCultureFromDomains();

return stringValue.Replace("%CurrentLang%", lang);
}

else if (stringValue?.Contains("%CurrentPageName%") is true)
{
var name = currentContent.Name();

return stringValue.Replace("%CurrentPageName%", name);
}

return stringValue;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System.Collections.Generic;
using Umbraco.Cms.Core.Web;
using SeoToolkit.Umbraco.MetaFields.Core.Common.Converters.EditorConverters;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.Converters;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;

namespace SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditEditors
{
public class SeoVideoEditEditor : ISeoFieldEditEditor
{
public string View => "mediapicker";
public Dictionary<string, object> Config { get; }
public IEditorValueConverter ValueConverter { get; }

public SeoVideoEditEditor(IUmbracoContextFactory umbracoContextFactory)
{
ValueConverter = new UmbracoMediaUdiConverter(umbracoContextFactory);
Config = new Dictionary<string, object>
{
{"disableFolderSelect", false},
{"idType", "udi"},
{"ignoreUserStartNodes", false},
{"multiPicker", false},
{"onlyImages", false}
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@ namespace SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditors
public class DropdownFieldPropertyEditor : SeoFieldPropertyEditor, ISeoFieldEditorProcessor
{

public DropdownFieldPropertyEditor(string[] items) : base("/App_Plugins/SeoToolkit/MetaFields/Interface/SeoFieldEditors/PropertyEditor/dropdownList.html", new TextValueConverter())
public DropdownFieldPropertyEditor(string[] items,string defaultValue = "") : base("/App_Plugins/SeoToolkit/MetaFields/Interface/SeoFieldEditors/PropertyEditor/dropdownList.html", new TextValueConverter())
{
IsPreValue = true;
if (!string.IsNullOrEmpty(defaultValue))
{
SetDefaultValue(defaultValue);
}

Config.Add("items", items);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;

namespace SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldGroups
{
public class OpenGraphFieldsGroup : ISeoFieldGroup
{
public string Alias => SeoFieldGroupConstants.OpenGraphGroup;
public string Name => "Open Graph";
public string Description => "Fields that indicate how your page will look on social media platforms";
public ISeoFieldPreviewer Previewer { get; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;

namespace SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldGroups
{
public class TwitterFieldsGroup : ISeoFieldGroup
{
public string Alias => SeoFieldGroupConstants.TwitterGroup;
public string Name => "Twitter";
public string Description => "Fields that indicate how your page will look on twitter";
public ISeoFieldPreviewer Previewer { get; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;

namespace SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldPreviewers
{
public class OpenGraphPreviewer : ISeoFieldPreviewer
{
public string Group => SeoFieldGroupConstants.OpenGraphGroup;
public string View => "/App_Plugins/SeoToolkit/MetaFields/Interface/Previewers/OpenGraph/openGraphPreviewer.html";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;

namespace SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldPreviewers
{
public class TwitterPreviewer : ISeoFieldPreviewer
{
public string Group => SeoFieldGroupConstants.TwitterGroup;
public string View => "/App_Plugins/SeoToolkit/MetaFields/Interface/Previewers/OpenGraph/openGraphPreviewer.html";
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
using System.Text;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Umbraco.Cms.Core.Web;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.Services;
using SeoToolkit.Umbraco.MetaFields.Core.Models.Converters;

namespace SeoToolkit.Umbraco.MetaFields.Core.Common.TagHelpers
{
Expand Down Expand Up @@ -31,6 +33,11 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
//TODO: We should probably have a special IsEmpty check here?
if (string.IsNullOrWhiteSpace(value?.ToString()))
continue;
if (value is FieldsModel)
{

continue;
}
stringBuilder.AppendLine(key.Render(value).ToString());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,20 @@ public void Compose(IUmbracoBuilder builder)
.Add<OpenGraphDescriptionField>()
.Add<OpenGraphImageField>()
.Add<OpenGraphUrlField>()
.Add<OpenGraphTypeField>()
.Add<OpenGraphLocaleField>()
.Add<OpenGraphSiteNameField>()
.Add<OpenGraphVideoField>()
.Add<CanonicalUrlField>()
.Add<RobotsField>()
.Add<SeoSchemaField>()
.Add<TwitterCardTypeField>()
.Add<TwitterSiteField>()
.Add<TwitterCreatorField>()
.Add<TwitterTitleField>()
.Add<TwitterDescriptionField>()
.Add<TwitterImageField>()
.Add<TwitterUrlField>()
.Add<FacebookIdField>();

if (settings?.ShowKeywordsField is true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,28 @@ public static class SeoFieldAliasConstants
public const string Keywords = "keywords";
public const string Schema = "schema";
public const string MetaDescription = "metaDescription";
public const string OpenGraphTitle = "openGraphTitle";
public const string OpenGraphDescription = "openGraphDescription";
public const string OpenGraphImage = "openGraphImage";

public const string CanonicalUrl = "canonicalUrl";
public const string Robots = "robots";


public const string OpenGraphTitle = "openGraphTitle";
public const string OpenGraphDescription = "openGraphDescription";
public const string OpenGraphImage = "openGraphImage";
public const string OpenGraphUrl = "openGraphUrl";
public const string OpenGraphType = "openGraphType";
public const string OpenGraphLocale = "openGraphLocale";
public const string OpenGraphSiteName = "openGraphSiteName";
public const string OpenGraphVideo = "openGraphVideo";

public const string TwitterCardType = "twitterCardType";
public const string TwitterSite = "twitterSite";
public const string TwitterCreator = "twitterCreator";
public const string TwitterTitle = "twitterTitle";
public const string TwitterDescription = "twitterDescription";
public const string TwitterImage = "twitterImage";
public const string TwitterUrl = "twitterUrl";


public const string FacebookId = "facebookId";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ public static class SeoFieldGroupConstants
{
public const string MetaFieldsGroup = "metaFields";
public const string SocialMediaGroup = "socialMedia";
// public const string TwitterGroup = "twitter";
public const string OpenGraphGroup = "openGraph";
public const string TwitterGroup = "twitter";
// public const string FacebookGroup = "facebook";
public const string Others = "others";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public IActionResult Get(int nodeId, string culture)
EditConfig = key.EditEditor.Config
};
}).ToArray(),
Previewers = new[] { new FieldPreviewerViewModel(new MetaFieldsPreviewer()), new FieldPreviewerViewModel(new SocialMediaPreviewer()) }
Previewers = new[] { new FieldPreviewerViewModel(new MetaFieldsPreviewer()), new FieldPreviewerViewModel(new SocialMediaPreviewer()), new FieldPreviewerViewModel(new OpenGraphPreviewer()) , new FieldPreviewerViewModel(new TwitterPreviewer())}
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace SeoToolkit.Umbraco.MetaFields.Core.Models.SeoField;
[Weight(701)]
public class FacebookIdField : SeoField<string>
{
public override string Title => "App Id";
public override string Title => "Facebook App Id";
public override string Alias => SeoFieldAliasConstants.FacebookId;
public override string Description => "Facebook app_id for the content";
public override string GroupAlias => SeoFieldGroupConstants.SocialMediaGroup;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
using System;
using Microsoft.AspNetCore.Html;
using Umbraco.Cms.Core.Composing;
using SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditEditors;
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;
using SeoToolkit.Umbraco.MetaFields.Core.Models.SeoFieldEditors;
using Umbraco.Cms.Core.Composing;

namespace SeoToolkit.Umbraco.MetaFields.Core.Models.SeoField
{
Expand All @@ -14,7 +14,7 @@ public class OpenGraphDescriptionField : ISeoField
public string Title => "Open Graph Description";
public string Alias => SeoFieldAliasConstants.OpenGraphDescription;
public string Description => "Description for Open Graph";
public string GroupAlias => SeoFieldGroupConstants.SocialMediaGroup;
public string GroupAlias => SeoFieldGroupConstants.OpenGraphGroup;
public Type FieldType => typeof(string);

public ISeoFieldEditor Editor => new SeoFieldFieldsEditor(new[] {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,75 @@
using System;
using System.Linq;
using Microsoft.AspNetCore.Html;
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Web;
using Umbraco.Extensions;
using SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditEditors;
using SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditors;
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;
using SeoToolkit.Umbraco.MetaFields.Core.Models.SeoFieldEditors;
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Routing;
using Umbraco.Cms.Core.Web;
using Umbraco.Extensions;

namespace SeoToolkit.Umbraco.MetaFields.Core.Models.SeoField
{
[Weight(500)]
public class OpenGraphImageField : ISeoField
public class OpenGraphImageField : SeoField<IPublishedContent>
{
private readonly IUmbracoContextFactory _umbracoContextFactory;
public string Title => "Open Graph Image";
public string Alias => SeoFieldAliasConstants.OpenGraphImage;
public string Description => "Image for Open Graph";
public string GroupAlias => SeoFieldGroupConstants.SocialMediaGroup;
public Type FieldType => typeof(string);
public override string Title => "Open Graph Image";
public override string Alias => SeoFieldAliasConstants.OpenGraphImage;
public override string Description => "Image for Open Graph";
public override string GroupAlias => SeoFieldGroupConstants.OpenGraphGroup;


public ISeoFieldEditor Editor => new SeoFieldFieldsEditor(new[] { "Umbraco.MediaPicker", "Umbraco.MediaPicker3" });
public ISeoFieldEditEditor EditEditor => new SeoImageEditEditor(_umbracoContextFactory);
public override ISeoFieldEditor Editor => new SeoFieldFieldsEditor(new[] { "Umbraco.MediaPicker", "Umbraco.MediaPicker3" });
public override ISeoFieldEditEditor EditEditor => new SeoImageEditEditor(_umbracoContextFactory);

public OpenGraphImageField(IUmbracoContextFactory umbracoContextFactory)
{
_umbracoContextFactory = umbracoContextFactory;


}


public HtmlString Render(object value)
protected override HtmlString Render(IPublishedContent value)
{
string url;
if (value is IPublishedContent media)
string height = string.Empty;
string width = string.Empty;
string type = string.Empty;
if (value is { } media)
{
url = media.Url(mode: UrlMode.Absolute);
width = media.Value<string>("umbracoWidth");
height = media.Value<string>("umbracoHeight");
type = media.Value<string>("umbracoExtension");
}
else
{
url = value?.ToString();
}

return new HtmlString($"<meta property=\"og:image\" content=\"{url}\"/>");
var html = $"<meta property=\"og:image\" content=\"{url}\"/>";
if (!string.IsNullOrEmpty(width))
{
html += $"<meta property=\"og:image:width\" content=\"{width}\"/>";
}
if (!string.IsNullOrEmpty(height))
{
html += $"<meta property=\"og:image:height\" content=\"{height}\"/>";
}
if (!string.IsNullOrEmpty(type))
{
html += $"<meta property=\"og:image:type\" content=\"{type}\"/>";
}


return new HtmlString(html);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Microsoft.AspNetCore.Html;
using SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditEditors;
using SeoToolkit.Umbraco.MetaFields.Core.Common.SeoFieldEditors;
using SeoToolkit.Umbraco.MetaFields.Core.Constants;
using SeoToolkit.Umbraco.MetaFields.Core.Interfaces.SeoField;
using Umbraco.Cms.Core.Composing;
using Umbraco.Extensions;

namespace SeoToolkit.Umbraco.MetaFields.Core.Models.SeoField;

[Weight(600)]
public class OpenGraphLocaleField : SeoField<string>
{
public override string Title => "Open Graph Locale";
public override string Alias => SeoFieldAliasConstants.OpenGraphLocale;
public override string Description => "Defines the content language.";
public override string GroupAlias => SeoFieldGroupConstants.OpenGraphGroup;
public override ISeoFieldEditor Editor { get; }
public override ISeoFieldEditEditor EditEditor => new SeoTextBoxEditEditor();


public OpenGraphLocaleField()
{
var propertyEditor = new SeoFieldPropertyEditor("textbox");
propertyEditor.SetExtraInformation("Defines the content language.");
propertyEditor.SetDefaultValue("%CurrentLang%");

Editor = propertyEditor;
}

protected override HtmlString Render(string value)
{
return new HtmlString(value.IsNullOrWhiteSpace() ? null : $"<meta name=\"og:locale\" content=\"{value}\"/>");
}
}
Loading