mod: seo-теги и JSON-LD

This commit is contained in:
2026-05-11 19:43:03 +03:00
parent c4fb0a29b7
commit bb08213153
2 changed files with 101 additions and 51 deletions

View File

@@ -1,57 +1,103 @@
{% extends "base.html" %}{% load static %}
{% block Title %}Блог :: {{ HEADER|striptags }}{% endblock %}
{% block Title %}{{ HEADER|striptags }}{% endblock %}
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
{% block Description %}{{ TIZER|striptags|truncatewords:25 }}{% endblock %}
{% block Description %}{% if META_DESC %}{{ META_DESC }}{% else %}{{ TIZER|striptags|truncatewords:25 }}{% endif %}{% endblock %}
{% block Keywords %}oknardia, окнардия, blog, блог, публикация, {{ HEADER|striptags }}{% endblock %}
{% block Keywords %}{% if META_KW %}{{ META_KW }}{% else %}oknardia, окнардия, блог, публикация, {{ HEADER|striptags }}{% endif %}{% endblock %}
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
{% block Author4Meta %}: {{ USERNAME }}{% if NAME1 != "" or NAME2 != "" %} ({{ NAME1 }}{% if NAME2 != "" %} {{ NAME2 }}{% endif %}){% endif %}{% endblock %}
{% block Author4Meta %}{{ NAME1 }}{% if NAME2 %} {{ NAME2 }}{% endif %} ({{ USERNAME }}) в Блоге Окнардия{% endblock %}
{% block CopyrightAuthor4Meta %}: Блоги{% endblock %}
{% block CopyrightAuthor4Meta %}Окнардия — Блог{% endblock %}
{% block Top_Meta1 %}
{# <!-- Дополнительные Metatags --> #}{% if NAME1 != '' or NAME2 != '' %}
<meta itemprop="author" content="{{ NAME1 }} {{ NAME2 }}" />{% endif %}
<meta itemprop="image" content="{{ request.scheme }}://{{ request.get_host }}/media/{{ USER_AVATAR }}" />
<meta itemprop="datePublished" content="{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}" />
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="ОКНАРДИЯ: сборник цен на пластиковые окна" /></span>
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="{% if NAME1 != '' or NAME2 != '' %}{{ NAME1 }}{% if NAME2 != '' %} {{ NAME2 }}{% endif %}{% endif %}" /></span>
<meta itemprop="articleSection" content="ОКНАРДИЯ: Блог «{{ USERNAME }}»" />
<meta itemprop="headline" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />
<link rel="standout" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />
{# <!-- Разметка для соц-сетей Facebook Open Graph --> #}<meta property="fb:admins" name="admins" content="100000084781830" />
<meta property="fb:pages" content="276108456054163" />
<meta property="fb:app_id" content="258354027974262" />
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
{# <!-- Разметка OG-теги для соц-сетей и мессенджеров --> #}<meta property="og:locale" content="ru_RU" />
<meta property="og:site_name" content="oknardia.ru" />
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />
{% block Top_Meta1 %}{# <!-- Canonical разметка --> #}
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />{% if not BACK_DISABLE %}
<link rel="prev" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ BACK_ID }}/{{ BACK_HEADER_T }}?page-back={{ PAGE_BACK|add:'-1' }}" />{% endif %}{% if not FORW_DISABLE %}
<link rel="next" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ FORW_ID }}/{{ FORW_HEADER_T }}?page-back={{ PAGE_BACK }}" />{% endif %}
{# <!-- Meta-теги для социальных сетей (B2B/B2C для компаний и клиентов) --> #}
<meta property="og:locale" content="ru_RU" />
<meta property="og:type" content="article" />
<meta property="og:title" content="{{ HEADER|striptags }} | oknardia.ru" />
<meta property="og:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
<meta property="og:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{% endif %}{{ IMG_FOR_BLOG|default:"{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" }}" />
<link rel="image_src" href="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{% endif %}{{ IMG_FOR_BLOG|default:"{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" }}" />
<!-- Разметка для соц-сетей Twitter Card -->
<meta name="twitter:title" content="{{ HEADER|striptags }} | oknardia.ru" />
<meta name="twitter:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
<meta name="twitter:card" content="summary">
<meta property="og:title" content="{{ HEADER|striptags }}" />
<meta property="og:description" content="{% if META_DESC %}{{ META_DESC|escapejs|truncatewords:30 }}{% else %}{{ TIZER|striptags|truncatewords:25 }}{% endif %}" />
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />
<meta property="og:site_name" content="oknardia.ru" />
<meta property="og:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@oknardia" />
<meta name="twitter:domain" content="oknardia.ru" />
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{% endif %}{{ IMG_FOR_BLOG|default:"{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" }}" />
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{% endif %}{{ IMG_FOR_BLOG|default:"{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" }}">{% endblock %}
<meta name="twitter:title" content="{{ HEADER|striptags }}" />
<meta name="twitter:description" content="{% if META_DESC %}{{ META_DESC|escapejs|truncatewords:30 }}{% else %}{{ TIZER|striptags|truncatewords:25 }}{% endif %}" />
<meta name="twitter:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
{# <!-- /Meta-теги --> #}{% endblock %}
{% block Top_JS3%}
<script type="text/javascript">$(window).load(function(){var images = $('.half');images.each(function(i){$(this).width($(this).width()/2);});});</script>{% endblock %}
{% block ADD_TO_HEAD %}{# <!-- Schema.org JSON-LD разметка для отдельного блог-поста --> #}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "{{ HEADER|escapejs }}",
"description": "{% if META_DESC %}{{ META_DESC|escapejs }}{% else %}{{ TIZER|striptags|escapejs|truncatewords:25 }}{% endif %}",
"image": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG|escapejs }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}",
"datePublished": "{{ PUB_DAT|date:'Y-m-d' }}T{{ PUB_DAT|date:'H:i:s' }}Z",
"dateModified": "{% if PUB_MODIFY %}{{ PUB_MODIFY|date:'Y-m-d' }}T{{ PUB_MODIFY|date:'H:i:s' }}Z{% else %}{{ PUB_DAT|date:'Y-m-d' }}T{{ PUB_DAT|date:'H:i:s' }}Z{% endif %}",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}"
},
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Главная",
"item": "{{ request.scheme }}://{{ request.get_host }}/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Блог",
"item": "{{ request.scheme }}://{{ request.get_host }}/blog/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Страница {{ PAGE_BACK|add:'1' }}",
"item": "{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK }}"
},
{
"@type": "ListItem",
"position": 4,
"name": "{{ HEADER|escapejs }}",
"item": "{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}"
}
]
},
"author": {
"@type": "Person",
"name": "{{ NAME1 }}{% if NAME2 %} {{ NAME2 }}{% endif %}"
},
"publisher": {
"@type": "Organization",
"name": "ОКНАРДИЯ",
"logo": {
"@type": "ImageObject",
"url": "{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg"
}
},
"keywords": "{% if META_KW %}{{ META_KW|escapejs }}{% else %}блог, публикация, окна, поставщики{% endif %}"
}
</script>
{# <!-- /Schema.org JSON-LD --> #}{% endblock %}
{% block Main_Content %}
<dIv class="container-fluid" itemscope itemtype="http://schema.org/Article">
<div class="row">{% if not IS_ARCHIVE %}
@@ -78,7 +124,7 @@
</DIv>
</DiV>
{# Листалка: НАЧАЛО #}<div class="row">
<div class="col-md-11 col-xs-12">
<nav class="col-md-11 col-xs-12">
<hr class="dotted-black" />
{% if not IS_ARCHIVE %}<nav aria-label="перелистывание записей блога">
<ul class="pager">
@@ -90,7 +136,7 @@
{% else %}<li class="next"><a href="/blogpost/{{ FORW_ID }}/{{ FORW_HEADER_T }}?page-back={{ PAGE_BACK }}">Следующая запись <span aria-hidden="true">&rarr;</span></a></li>{% endif %}
</ul>
</nav>{% endif %}
</div>
</nav>
</div>{# Листалка: КОНЕЦ #}&nbsp;
{# --- Баннер: НАЧАЛО --- #}
<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>
@@ -103,4 +149,3 @@
{# ОТЛАДКА, ГАСИМ ВЕРХНЕЕ МЕНЮ #}
{% endblock %}
{% endcomment %}

View File

@@ -183,22 +183,27 @@ def blog_post(request: HttpRequest, post_id: str = "0", page_back: str = None) -
'ID': q.id})
if PATH_FOR_IMG_BLOG in q.sImgForBlogSocial.name:
to_template.update({'IMG_FOR_BLOG': q.sImgForBlogSocial})
to_template.update({'PUB_DAT': q.dPostDataBegin,
to_template.update({
'PUB_DAT': q.dPostDataBegin,
'PUB_MODIFY': q.dPostDataModify,
'HEADER': q.sPostHeader,
'HEADER_T': sanitize_slug(q.sPostHeader).lower(),
'HEADER': safe_html_spec_symbols(q.sPostHeader),
'HEADER_T': sanitize_slug(q.sPostHeader),
'USER_STATUS': q.kBlogAuthorUser.get_sUserStatus_display(),
'USER_AVATAR': q.kBlogAuthorUser.sUserAvatarImg,
'USER_TITLE': q.kBlogAuthorUser.sUserJobTitle,
'USER_FROM_ID_OFFICE': q.kBlogAuthorUser.kMerchantOffice,
'CONTENT': re.sub(r'<cut[\s\S]*?>', '', q.sPostContent, 0, re.IGNORECASE)})
'CONTENT': re.sub(r'<cut[\s\S]*?>', '', q.sPostContent, 0, re.IGNORECASE),
'MOD_DAT': q.dPostDataModify,
'META_DESC': q.sMetaDescription,
'META_KW': q.sMetaKeywords
})
content = to_template.get('CONTENT', '')
to_template.update({'TIZER': sanitize_slug(str(content))})
to_template.update({'TIZER': safe_html_spec_symbols(str(content))})
# получаем следующую по дате запись
try:
q1 = BlogPosts.objects.filter(dPostDataBegin__gt=q.dPostDataBegin, dPostDataBegin__lt=timezone.now(),
bPublished=True, bArchive=False).order_by('dPostDataBegin')[0]
to_template.update({'FORW_HEADER_T': sanitize_slug(q1.sPostHeader).lower(),
to_template.update({'FORW_HEADER_T': sanitize_slug(q1.sPostHeader),
'FORW_ID': q1.id})
except(IndexError, ObjectDoesNotExist, BlogPosts.DoesNotExist):
to_template.update({'FORW_DISABLE': True})
@@ -206,7 +211,7 @@ def blog_post(request: HttpRequest, post_id: str = "0", page_back: str = None) -
try:
q1 = BlogPosts.objects.filter(dPostDataBegin__lt=q.dPostDataBegin, bPublished=True,
bArchive=False).order_by('-dPostDataBegin')[0]
to_template.update({'BACK_HEADER_T': sanitize_slug(q1.sPostHeader).lower(),
to_template.update({'BACK_HEADER_T': sanitize_slug(q1.sPostHeader),
'BACK_ID': q1.id})
except(IndexError, ObjectDoesNotExist, BlogPosts.DoesNotExist):
to_template.update({'BACK_DISABLE': True})