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 }}