構造化データには、検索結果にサイトリンク検索ボックス表示を促すものがあり、その際、Google のサイト検索ではなく、自サイトの検索を使用するようにすることができます。
Mezzanine にも 検索ボックスが存在するため、検索ボックス表示用途 schema.org 定義を JSON-LD
を埋め込んでみます。
参考サイト
-
schema.orgを使ってGoogleの検索結果にサイトリンク検索ボックスを表示させよう | 海外SEO情報ブログ
JSON-LD
の定義について、参考になりました。
記事に記載がありますが、そもそもアクセス数や、ページ数が少ないと、検索ボックス自体が出てこないですが、それはそれとして実装していきます。 -
Configuration — Mezzanine 4.2.3 documentation
page-menu-templates の説明が記載されています。 -
Can you check the internet protocol from Django’s template? - Stack Overflow
django で https/http どちらでアクセスしているかを判定する方法が記載されています。
JSON-LD 定義を記述するページについて
トップページのみ記述しておけば、よいものと判断しました。このブログだと、mezzanine の blog ページを home として設定しています。
どのページを home とするかは、urls.py
に設定する必要があります。
defalut だと、blog ページを home とする設定はコメントアウトされていて、このコメントアウトを解除すると、mezzanine の ルート URL 直下が、blog list ページになります。
以下、urls.py
の抜粋です。
- urls.py
# HOMEPAGE FOR A BLOG-ONLY SITE # ----------------------------- # This pattern points the homepage to the blog post listing page, # and is useful for sites that are primarily blogs. If you use this # pattern, you'll also need to set BLOG_SLUG = "" in your # ``settings.py`` module, and delete the blog page object from the # page tree in the admin if it was installed. url("^$", blog_post_list, name="home"),
通常の blog list を表示している場合、トップページの blog list を表示している場合の区別を付ける必要があります。
判断に使える api がないか確認したところ、on_home という template tag で home で表示しているかどうかを判断できることがわかりました。
この tag は、PAGE_MENU_TEMPLATES
で指定された template のみで使用できるようになっています。
PAGE_MENU_TEMPLATES
のデフォルト定義は以下になります。
- デフォルト定義
( (1, 'Top navigation bar', 'pages/menus/dropdown.html'), (2, 'Left-hand tree', 'pages/menus/tree.html'), (3, 'Footer', 'pages/menus/footer.html') )
今回追加先は、pages/menus/dropdown.html
ですので、デフォルト定義に含まれるため、設定変更は不要でした。
追加した記述
pages/menus/dropdown.html
内に以下の記述を追加しました。
pages/menus/dropdown.html
{% for page in page_branch %}
{% if not has_home and page.is_primary and forloop.first %}
<li{% if on_home %} class="active"{% endif %} id="dropdown-menu-home">
<a href="{% url "home" %}">{% trans "Home" %}</a>
</li>
#######################
// この記述追加
{% if on_home %}
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "WebSite",
"url": "{{ request.scheme }}://{{ request.get_host }}",
"potentialAction": {
"@type": "SearchAction",
"target": "{{ request.scheme }}://{{ request.get_host }}{% url "search" %}?q={search_term}"
"query-input": "required name=search_term"
}
}
</script>
{% endif %}
#######################
{% endif %}
{% if page.in_menu %}
{% endif %}
説明
-
{{ request.scheme }}://{{ request.get_host }}
{{ request.scheme }}
で http/https のブラウザでアクセスしているプロトコルが、{{ request.get_host }}
で domain 名が取得できます。1
[1] Django Mezzanine で、複数サイトを共存させ同時に運用する の状況で動くかは試せてないです。複数サイトの場合は動作しないかもしれません。 -
{% url “search” %}
{% url "search" %}
で、mezzanine の 検索ボックスの URL を指定しています。これでサイト内検索時は、mezzanine の 検索が使われるようになります。
まとめ
サイト内検索の検索ボックス 表示させる JSON-LD
について記載しました。
こういう一連のものがある plugin があってもよいのかもしれません。
ただ、サイト要件でかわったりする要素もあるので、一律なんとかするというよりは、都度個別対応でしょうか。
そもそも、ページ数が多かったり、人気のあるサイトでしか表示されないものなので、実装する優先度は低い気がします。
以上です。
コメント