diff --git a/frappe/tests/test_permissions.py b/frappe/tests/test_permissions.py
index 7e9416f68a..364469f168 100644
--- a/frappe/tests/test_permissions.py
+++ b/frappe/tests/test_permissions.py
@@ -201,7 +201,7 @@ class TestPermissions(unittest.TestCase):
doc = frappe.get_doc("DocType", "Blog Post")
# change one property from the child table
- doc.fields[-1].fieldtype = 'HTML'
+ doc.fields[-1].fieldtype = 'Check'
self.assertRaises(frappe.CannotChangeConstantError, doc.save)
frappe.clear_cache(doctype='DocType')
diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js
index e1b8341139..adc03ca77e 100644
--- a/frappe/website/doctype/blog_post/blog_post.js
+++ b/frappe/website/doctype/blog_post/blog_post.js
@@ -3,6 +3,40 @@
frappe.ui.form.on('Blog Post', {
refresh: function(frm) {
-
+ generate_google_search_preview(frm);
+ },
+ title: function(frm) {
+ generate_google_search_preview(frm);
+ },
+ meta_description: function(frm) {
+ generate_google_search_preview(frm);
+ },
+ blog_intro: function(frm) {
+ generate_google_search_preview(frm);
}
});
+
+function generate_google_search_preview(frm) {
+ let google_preview = frm.get_field("google_preview");
+ let seo_title = (frm.doc.title).slice(0, 60);
+ let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160);
+ let date = frm.doc.published_on ? new frappe.datetime.datetime(frm.doc.published_on).moment.format('ll') + ' - ' : '';
+ let route_array = frm.doc.route.split('/');
+ route_array.pop();
+
+ google_preview.html(`
+
+
+
+ ${frappe.boot.sitename}
+ › ${route_array.join(' › ')}
+
+
+ ${ seo_title }
+
+
+ ${ date } ${ seo_description }
+
+
+ `);
+}
diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json
index 9944cbf4b2..04e349a2b0 100644
--- a/frappe/website/doctype/blog_post/blog_post.json
+++ b/frappe/website/doctype/blog_post/blog_post.json
@@ -21,7 +21,13 @@
"content",
"content_md",
"content_html",
- "email_sent"
+ "email_sent",
+ "meta_tags",
+ "meta_description",
+ "column_break_18",
+ "meta_image",
+ "section_break_20",
+ "google_preview"
],
"fields": [
{
@@ -123,6 +129,36 @@
"fieldname": "disable_comments",
"fieldtype": "Check",
"label": "Disable Comments"
+ },
+ {
+ "fieldname": "meta_description",
+ "fieldtype": "Small Text",
+ "label": "Meta Description"
+ },
+ {
+ "fieldname": "column_break_18",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "meta_image",
+ "fieldtype": "Attach Image",
+ "label": "Meta Image"
+ },
+ {
+ "fieldname": "section_break_20",
+ "fieldtype": "Section Break"
+ },
+ {
+ "description": "This is an example Google SERP Preview.",
+ "fieldname": "google_preview",
+ "fieldtype": "HTML",
+ "label": "Google Snippet Preview",
+ "read_only": 1
+ },
+ {
+ "fieldname": "meta_tags",
+ "fieldtype": "Section Break",
+ "label": "Meta Tags"
}
],
"has_web_view": 1,
@@ -131,7 +167,7 @@
"is_published_field": "published",
"links": [],
"max_attachments": 5,
- "modified": "2020-04-08 19:58:13.672332",
+ "modified": "2020-04-29 17:32:41.055883",
"modified_by": "Administrator",
"module": "Website",
"name": "Blog Post",
diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py
index 148ba15be7..e2e24afbab 100644
--- a/frappe/website/doctype/blog_post/blog_post.py
+++ b/frappe/website/doctype/blog_post/blog_post.py
@@ -65,16 +65,18 @@ class BlogPost(WebsiteGenerator):
context.content = get_html_content_based_on_type(self, 'content', self.content_type)
- context.description = self.blog_intro or strip_html_tags(context.content[:140])
+
+ #if meta description is not present, then blog intro or first 140 characters of the blog will be set as description
+ context.description = self.meta_description or self.blog_intro or strip_html_tags(context.content[:140])
context.metatags = {
"name": self.title,
"description": context.description,
}
+ #if meta image is not present, then first image inside the blog will be set as the meta image
image = find_first_image(context.content)
- if image:
- context.metatags["image"] = image
+ context.metatags["image"] = self.meta_image or image or None
self.load_comments(context)
@@ -95,7 +97,6 @@ class BlogPost(WebsiteGenerator):
else:
context.comment_text = _('{0} comments').format(len(context.comment_list))
-
def get_list_context(context=None):
list_context = frappe._dict(
template = "templates/includes/blog/blog.html",
diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html
index 285223a2af..ab3c2afa1a 100644
--- a/frappe/website/doctype/blog_post/templates/blog_post.html
+++ b/frappe/website/doctype/blog_post/templates/blog_post.html
@@ -15,7 +15,7 @@
- {{ description }}
+ {{ blog_intro }}
{{ content }}