
先日、 GraphQL のクエリとかを Craft CMS のテンプレート(Twig)でも使える!と1人感動したエントリを書いた。
だったらサイト内検索にも使えるのではないか?ということで試してみた。
検索結果表示コード一部
コードとしてはこんな感じで、検索結果の表示で entries をループする感じになる。
{% set query = craft.app.request.getParam('q') %}
{% set articles %}
query data($needle: String!)
{
entries(section:"article",search:$needle){
id
title
url
postDate
dateUpdated
contentTag{
title
id
}
}
}
{% endset %}
{% set variables = {'needle': (query)} %}
{% set searchArticles = gql(articles, variables) %}
{% set entries = searchArticles.data.entries %}
variables をどう渡すのか悩んでたんだけど、 @BUN に教えてもらったエントリが非常に参考になった。
nystudio107 | Using the Craft CMS “headless” with the GraphQL API
https://nystudio107.com/blog/u…
感謝感謝 m(_ _)m
検索結果表示のループ
もともと、検索キーワードを元に検索して Craft のタグだけで検索&表示してたので、例えば検索結果の entries のループを回すときは
{% for entry in entries.all() %}
のような感じで all() が必要になるが、今回は必要ない。
{% if entries |length %}
{% for entry in entries %}
<div class="post-preview">
<a href="{{ entry.url }}">
<h2 class="post-title">{{ entry.title }}</h2>
</a>
検索クエリからのrelationalなタグ部分の表示
タグの表示についても元々は
{% set tags = entry.contentTag %}
{% if tags|length %}Tag :
{% for tag in tags.all() %}
<a href="/tag/{{ tag.title }}">{{ tag.title }}</a>
{% endfor %}
{% endif %}
みたいな感じなのが
{% if entry.contentTag|length %}Tag :
{% for tag in entry.contentTag %}
<a href="/tag/{{ tag.title }}">{{ tag.title }}</a>
{% endfor %}
{% endif %}
だけになる。
この辺は切り替える場合はいくつか修正が必要そうではある。
ハッシュに変数を渡す
検索キーワード q を取り出して query にセットした後にどうやって渡すのか?というのが結構試行錯誤したのだけど、
{% set variables = {'needle': (query)} %}
という感じで、変数を ( ) で囲むことでいけるということを知った。
記事書いていただいてほんとありがたい。
どっちがパフォーマンスがいいのか?とかはあるけど、そこはおって調べてみたいと思う(いつかやる)。
スマホでみてると気にならないのだけど、PCでみてると重い気がする。