構造化データには、検索結果にサイトリンク検索ボックス表示を促すものがあり、その際、Google のサイト検索ではなく、自サイトの検索を使用するようにすることができます。
Mezzanine にも 検索ボックスが存在するため、検索ボックス表示用途 schema.org 定義を JSON-LD埋め込んでみます。


参考サイト


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 があってもよいのかもしれません。
ただ、サイト要件でかわったりする要素もあるので、一律なんとかするというよりは、都度個別対応でしょうか。
そもそも、ページ数が多かったり、人気のあるサイトでしか表示されないものなので、実装する優先度は低い気がします。 以上です。

コメント

カテゴリー