位置情報を扱う「位置リスト」機能について少し考えてみた

この記事はa-blog cms Advent Calendar 2018 の11日目の記事です。

皆さん、a-blog cmsの位置情報機能を使ってますか? 私はそこそこ使ってます。今年も何案件かやりました。

他のCMSをお使いの方に説明しておきますと、最初は2017年4月にリリースされたバージョン2.7で搭載された機能で、エントリー(記事)に位置情報(緯度と経度)を持たせることで、あるエントリーの位置情報から近い順にエントリーを並べたり、GPSを使って現在位置から近い順にエントリーを並べたりすることができる機能です。

「現在地から探す」なんて高度な機能がプログラムができない人でも作れるようになったわけですね(a-blog cmsはPHPが使えなくてもカスタマイズできるのが特徴です)。

おもしろいので、私も調子に乗ってこんなサイトを作ってしまいました。ちょっと多忙で更新できていませんが・・・。

スマホ時代ですし、複数の店舗やスポットを表示したいサイトではものすごく使い勝手がいい機能です。最寄りの店舗の表示とかが標準機能だけで使えるわけですよ。観光スポットを紹介したい観光協会とか、複数の店舗・拠点を持つ会社とか、全国の代理店を紹介したいとかいう要件なら、ものすごくいい機能じゃないですかね。

他のCMSをお使いの方で、ここまで位置情報の導入の敷居が低いものはあまりないはずなので、ぜひこの機会にa-blog cmsも視野に入れていただくとよいのではないでしょうか。

1つのスポットでも位置情報は使えますよ

という感じで書くと、「複数のスポットがあるそこそこ大きなサイト」という感じの話になってしまうわけで、今回の記事の後半もだいたいそんな話になるのですが、実は1つしかスポットがなくても位置情報は十分に使えるものなんです。

サイトに訪問してもらうという前提はありますが、現在位置が距離が近い人に何か特別なオファーを出すなんてこともできます。

「近くの人を対象に何かする」ような距離で何かを判断する際には、位置情報が必要であることを知ってもらえればと思います。地図を表示することだけが位置情報機能ではないですよ。

と、ここまでが一般的なお話で、ここからが既にa-blog cmsを使ってるけど、位置情報はまだちょっと使ってないというユーザー向けのお話です。

エントリー以外の位置情報機能がついた!

2018年10月にエントリーの位置情報だけでなく、ブログ、カテゴリー、ユーザーにも位置情報を持たせることができるようになりました。実は2.7リリース当初から要望していた機能です。

エントリーの位置情報だけで、実は普通にやりたいことはほとんどできます。が、この機能が登場する前に、同様の機能をカスタマイズで作ってもらって導入したことがあったので、「多くの店舗があって、店舗ブログがたくさんあるような場合、何千とか何万という記事の中から、位置情報が入っている記事だけを引っ張ってきて並べる」ようなのは、実装はできても速度とか運用で苦労するのではないかなと。


エントリー位置リスト+個ブログを使った場合の構造図

今まではエントリーしか位置情報を持てなかったため、スポット情報と新着情報が混在

位置情報を使いたい場合でも、管理する人や運営する人はその都度異なるので、エントリー以外のところに位置情報があれば、もっとスマートに処理できるのではないかなと思った次第です。

とは言え、私も今やっている案件の位置情報は、エントリーの位置情報だけで足りてしまうので、それぞれこういうところで使うとよいのではないかなというのをまとめてみました。

エントリーの位置情報(エントリー位置リスト Entry_GeoList)

管理・更新する人が少なく、権限をルートブログに集約できる場合

一般的な使い方で、例えばいろんな店舗が掲載されていたとしても、その店舗からは更新しないような場合です。

ブログの位置情報(ブログ位置リスト Blog_GeoList)

スポットごとにブログがあるような場合に使います。子ブログに位置情報を持たせて、そのブログ情報を並べます。


ブログ位置リストを使った場合の構造図

ブログに位置情報を持たせるので、エントリーがすっきり

ブログの記事にはイベント情報などで位置情報を持たせたいこともあるはずです。エントリーの位置情報とスポット情報を分ければ整理しやすいはずです。

ブログ位置リストを使うメリットとしては、権限が分けやすいことです。各スポットに複数のユーザーを充てられるので、店長クラスとアルバイトクラスで異なる権限を与えるのも簡単です。

a-blog cmsの場合、子ブログを含めた横断検索は標準機能ですので、店舗検索なんかも簡単に作れますね。

### カテゴリーの位置情報(カテゴリー位置リスト Category_GeoList)

権限をあまり考えなくてよいのなら、カテゴリー位置リストを使っても大丈夫です。

使い方としてはスポットごとにカテゴリーを分けて、それぞれに新着情報を付けたいような場合でしょうか。


カテゴリー位置リストを使った場合の構造図

スポットの位置情報をカテゴリーに持たせた場合。ユーザーの権限が必要なければこれで十分

みたいな構造がいいかなと思います。

カテゴリーの位置情報ってどう使うんだろうと思ってたけど、あれこれ考えるうちにかなり使えそうな気がしてきました。

ユーザーの位置情報(ユーザー位置リスト User_GeoList)

位置とユーザー数が1:1(更新するのはユーザー情報だけで、1アカウントだけ与えれば十分な場合)であれば、ユーザー位置リストを使ってもよいと思います。

単純に近くの人を探すとか、個人でやってる人を検索するサイト(先生を探すようなやつ)で、それぞれのユーザーはエントリーを必要としないという場合に使えますね。ちょっとしたお知らせくらいなら、ユーザーのカスタムフィールドで十分です。

位置リストはエントリーサマリーの親戚です

まだ実案件ではエントリー位置リスト以外のものには出会っていないんですけど、こんな感じでいろいろなサイトに使えそうだなと思ってます。

位置リストのモジュールはエントリーサマリーとかを使える人なら、誰でも使うことができます。一番簡単で高度な機能と言えると思います。使い方もアイディア次第で他のCMSではできないことが楽にできるので、ぜひいろんな人が使っているのを見たいと思っています。

そういえば、a-blog cms awardsという事例コンテストも開催するとのことなので、おもしろい事例が見れそうで楽しみにしています。



グローバル変数

global varsvalues
%{BID}2
%{UID}
%{CID}44
%{EID}715
%{RID}
%{RVID}
%{UTID}
%{CMID}
%{TBID}
%{KEYWORD}
%{TAG}
%{FIELD}
%{DATE}
%{START}1000-01-01 00:00:00
%{END}9999-12-31 23:59:59
%{PAGE}1
%{ORDER}
%{QUERY}
%{QOL}?
%{ADMIN}
%{IS_ADMIN}0
%{ADMIN_PATH}
%{ADMIN_PATH_MID}
%{MID}
%{MODULE_ID}
%{MODULE_NAME}
%{STYLEGUIDE_PAGE}acms-admin
%{GETTEXT_TYPE}user
%{BCD}blog
%{UCD}
%{CCD}ablogcms
%{ECD}ablogcms-geolist.html
%{BLOG_NAME}ブログ
%{USER_NAME}
%{CATEGORY_NAME}a-blog cms
%{ENTRY_TITLE}位置情報を扱う「位置リスト」機能について少し考えてみた
%{RULE_NAME}
%{CONFIG_SET_NAME}共通の設定
%{THEME_SET_NAME}ブログテーマ
%{EDITOR_SET_NAME}編集の基本設定
%{RCID}44
%{PCID}
%{RCCD}ablogcms
%{PCCD}
%{ROOT_CATEGORY_NAME}a-blog cms
%{PARENT_CATEGORY_NAME}
%{RBID}1
%{PBID}1
%{RBCD}
%{PBCD}
%{ROOT_BLOG_NAME}フォルトゥナ
%{PARENT_BLOG_NAME}フォルトゥナ
%{ALIAD_ID}
%{ALIAS_ID}
%{ALIAS_DOMAIN}
%{ALIAS_CODE}
%{ALIAS_NAME}
%{CHARSET}UTF-8
%{META_KEYWORDS}
%{META_DESCRIPTION}
%{NOW_DATE}2024-10-11
%{NOW_TIME}02:39:33
%{BLOG_THEME_COLOR}#559655
%{BLOG_THEME_CONTRAST_COLOR}#ffffff
%{VERSION}3.1.22
%{SNAME}sid
%{SID}
%{SESSION_USER_ID}
%{SESSION_BLOG_ID}
%{MAX_PUBLISHES}15
%{ROOT_TPL}/themes/blog@base/_entry.html
%{ROOT_TPL_NAME}_entry
%{ROOT_DIR}/
%{DOCUMENT_ROOT}/
%{THEMES_DIR}/themes/
%{JS_DIR}/js/
%{JS_LIB_DIR}/js/library/
%{JS_LIB_JQUERY_DIR}/js/library/jquery/
%{JS_LIB_JQUERY_DIR_VERSION}3.6.1
%{LOGIN_SEGMENT}login
%{ADMIN_RESET_PASSWORD_SEGMENT}admin-reset-password
%{ADMIN_RESET_PASSWORD_AUTH_SEGMENT}admin-reset-password-auth
%{ADMIN_TFA_RECOVERY_SEGMENT}admin-tfa-recovery
%{SIGNIN_SEGMENT}signin
%{SIGNUP_SEGMENT}signup
%{RESET_PASSWORD_SEGMENT}reset-password
%{RESET_PASSWORD_AUTH_SEGMENT}reset-password-auth
%{TFA_RECOVERY_SEGMENT}tfa-recovery
%{PROFILE_UPDATE_SEGMENT}mypage/update-profile
%{PASSWORD_UPDATE_SEGMENT}mypage/update-password
%{EMAIL_UPDATE_SEGMENT}mypage/update-email
%{TFA_UPDATE_SEGMENT}mypage/update-tfa
%{WITHDRAWAL_SEGMENT}mypage/withdrawal
%{SYSTEM_THEMES_DIR}/themes/system/
%{CURRENT_THEMES_DIR}/themes/blog@base/
%{ARCHIVES_DIR}/archives/
%{MEDIA_ARCHIVES_DIR}/media/
%{MEDIA_STORAGE_DIR}storage/
%{BID_ARCHIVES_DIR}/archives/002/
%{YM_ARCHIVES_DIR}/archives/002/202410/
%{ARCHIVES_DIR_TEMP}/archives/temp/
%{ARCHIVES_CACHE_SERVER}
%{HTTP_THEMES_DIR}https://www.color-fortuna.com/themes/
%{HTTP_CURRENT_THEMES_DIR}https://www.color-fortuna.com/themes/blog@base/
%{HTTP_ARCHIVES_DIR}https://www.color-fortuna.com/archives/
%{HTTP_MEDIA_ARCHIVES_DIR}https://www.color-fortuna.com/media/
%{HTTP_ARCHIVES_DIR_TEMP}https://www.color-fortuna.com/archives/temp/
%{HTTP_BID_ARCHIVES_DIR}https://www.color-fortuna.com/archives/002/
%{HTTP_YM_ARCHIVES_DIR}https://www.color-fortuna.com/archives/002/202410/
%{HTTP_REQUEST_URL}https://www.color-fortuna.com/blog/ablogcms/ablogcms-geolist.html
%{IMAGES_DIR}/themes/system/images/
%{SCRIPT_ROOT}/
%{REWRITE_OFFSET}/
%{HTTP_ROOT}https://www.color-fortuna.com/
%{DOMAIN}www.color-fortuna.com
%{DOMAIN_ROOT}www.color-fortuna.com
%{HTTP_HOST}www.color-fortuna.com
%{BASE_URL}http://www.color-fortuna.com/blog/
%{ADMIN_BASE_URL}https://www.color-fortuna.com/
%{BLOG_URL}https://www.color-fortuna.com/blog/
%{ROOT_BLOG_URL}https://www.color-fortuna.com/
%{PARENT_BLOG_URL}https://www.color-fortuna.com/
%{CATEGORY_URL}https://www.color-fortuna.com/blog/ablogcms/
%{ROOT_CATEGORY_URL}https://www.color-fortuna.com/blog/ablogcms/
%{PARENT_CATEGORY_URL}https://www.color-fortuna.com/blog/
%{CANONICAL_URL}https://www.color-fortuna.com/blog/ablogcms/ablogcms-geolist.html
%{ENTRY_URL}https://www.color-fortuna.com/blog/ablogcms/ablogcms-geolist.html
%{PERMALINK}https://www.color-fortuna.com/blog/ablogcms/ablogcms-geolist.html
%{INHERLINK}https://www.color-fortuna.com/blog/ablogcms/ablogcms-geolist.html
%{CURRENT_URL}https://www.color-fortuna.com/blog/ablogcms/ablogcms-geolist.html
%{HOME_URL}https://www.color-fortuna.com/
%{BASE_ACMS_PATH}blog/
%{ACMS_PATH_BASE}blog/
%{SCRIPT_DIR}/home/kyunitan/color-fortuna.com/public_html/
%{CURRENT_ROOT}/blog/ablogcms/ablogcms-geolist.html
%{REQUEST_PATH}/blog/ablogcms/ablogcms-geolist.html
%{REQUEST_DIRNAME}/blog/ablogcms
%{MODULE}
%{VALID_ID_REGEX}@^[a-zA-Z0-9_-]+$@
%{REGEX_VALID_ID}@^[a-zA-Z0-9_-]+$@
%{REGEX_VALID_PASSWD}@^[!-~]+$@
%{CATEGORY_EXISTS}1
%{CATEGORY_LEVEL}1
%{VIEW}entry
%{UA}CCBot/2.0 (https://commoncrawl.org/faq/)
%{CH_UA}
%{CH_UA_MOBILE}0
%{CH_UA_PLATFORM}
%{UA_GROUP}PC
%{REMOTE_ADDR}3.238.82.77
%{MAINTENANCE_MODE}
%{PROTOCOL}https
%{BLOG_CODE}blog
%{USER_CODE}
%{CATEGORY_CODE}ablogcms
%{ENTRY_CODE}ablogcms-geolist.html
%{BLOG_ID}2
%{USER_ID}
%{CATEGORY_ID}44
%{ENTRY_ID}715
%{SUID}
%{SBID}
%{SESSION_USER_AUTH}
%{SESSION_USER_NAME}
%{SESSION_USER_CODE}
%{SESSION_USER_MAIL}
%{SEARCH_ENGINE_KEYWORD}
%{MAIL_MAGAZINE_FROM}info@example.com
%{MAIL_TRACKBACK_FROM}
%{MAIL_COMMENT_FROM}info@example.com
%{MAIL_REMIND_FROM}
%{MAIL_SUBSCRIBE_FROM}info@example.com
%{MAIL_SUBSCRIBE_ADMIN_FROM}info@example.com
%{PHP_FILE_MAX_SIZE}30M
%{PHP_POST_MAX_SIZE}30M
%{MEDIA_LIBRARY}on
%{IS_DEVELOPMENT}off
%{IS_TRIAL}off
%{TRIAL_COUNT_DOWN}0
%{IS_SUBSCRIPTION}off
%{SUBSCRIPTION_PLAN}
%{UNLICENSED_REASON}
%{SUBSCRIPTION_PAYMENT}
%{ACTIVATION_ENDPOINT}https://mypage.a-blogcms.jp/api/activation
%{GOOGLE_API_KEY}
%{PREVIEW_DEFAULT_DEVICE}iPhone 6/7/8
%{PREVIEW_HAS_HISTORY_DEVICE}
%{APPROVAL_PREVIEW_DEFAULT_DEVICE}iPhone 6/7/8
%{APPROVAL_PREVIEW_HAS_HISTORY_DEVICE}
%{TIMEMACHINE_PREVIEW_DEFAULT_DEVICE}PC
%{TIMEMACHINE_PREVIEW_HAS_HISTORY_DEVICE}
%{d}11
%{D}Fri
%{j}11
%{l}Friday
%{N}5
%{S}th
%{w}5
%{z}284
%{W}41
%{F}October
%{m}10
%{M}Oct
%{n}10
%{t}31
%{L}1
%{o}2024
%{Y}2024
%{y}24
%{a}am
%{A}AM
%{B}777
%{g}2
%{G}2
%{h}02
%{H}02
%{i}39
%{s}33
%{u}000000
%{e}Asia/Tokyo
%{I}0
%{O}+0900
%{P}+09:00
%{T}JST
%{Z}32400
%{c}2024-10-11T02:39:33+09:00
%{r}Fri, 11 Oct 2024 02:39:33 +0900
%{U}1728581973

モジュール処理時間

moduleidentifierrun timesql
Entry_Body0.03113
Entry_ListentryList0.018316
Ogp0.0120212
TopicpathtopicPath0.009125
Category_ListcategoryList0.0086410
Blog_FieldtopBlog0.005923
Blog_FieldtopBlog0.005863
NavigationglobalNavi0.005861
Blog_FieldtopBlog0.005493
NavigationglobalNavi0.005381
Topicpathtopicpath0.005183
TopicpathtopicPath0.004825
Blog_FieldtopBlog0.004663
Blog_FieldtopBlog0.004434
Entry_Field0.00362
Blog_FieldtopBLog0.003331
Entry_Field0.002561
Touch_Unlogin0.002450
Entry_Field0.002431
Blog_FieldtopBLog0.001632
Form0.001511
Form2_Unit0.001320
Form2_Unit0.001170
Form2_Unit0.000791
Js0.00030
Field_Search0.000240
Admin_Entry_Add0.000220
Form2_Unit0.00020
Tag_Filter0.00020
Touch_GeolocationEntryFunction0.000190
Touch_SessionWithContribution0.000190
Touch_NotPreview0.000180
Touch_ApprovalEditVersion0.000170
Touch_EditDirect0.000170
Touch_MailMagazineEnable0.000170
Touch_SessionWithAdministration0.000170
Touch_NotEditDirect0.000160
Touch_NotEditInplace0.000160
Touch_RelatedEntryFunction0.000160
Touch_Version0.000160
Touch_Admin0.000150
Touch_HigherLicense0.000150
Touch_NotApprovalEditVersion0.000150
Touch_NotEntry0.000150
Touch_SessionWithAdministration0.000150
Touch_SubCategoryFunction0.000150
Touch_Edit0.000140
Touch_EditInplace0.000140
Touch_Entry0.000140
Touch_Login0.000140
Touch_NotAdmin0.000140
Touch_NotTimemachineMode0.000140
Touch_NotsessionWithApprovalAdministrator0.000140
Touch_SessionWithCompilation0.000140
Touch_Approval0.000130
Touch_Entry0.000130
Touch_Index0.000130
Touch_NotApprovalORsessionWithApprovalAdministrator0.000130
Touch_SessionWithAdministration0.000130
Touch_Benchmark0.000120
Touch_Form20.000120
Touch_NotPreview0.000120
Touch_Entry0.000110
Touch_Entry0.000110
Touch_NotPreview0.000110
Touch_NotPreview0.000110
Touch_RelatedEntryFunction0.000110
Touch_SessionWithContribution0.000110
Touch_SessionWithContribution0.000110
Touch_GeolocationEntryFunction0.00010
Touch_NotEdit0.00010
Touch_SessionWithAdministration0.00010
Touch_SubCategoryFunction0.00010
Touch_sessionWithApprovalAdministrator0.00010
Touch_Admin9.0E-50
Touch_Category9.0E-50
Touch_Debug9.0E-50
Touch_Edit9.0E-50
Touch_Keyword9.0E-50
Touch_NotAdmin9.0E-50
Touch_NotCategory9.0E-50
Touch_NotEdit9.0E-50
Touch_NotEdit9.0E-50
Touch_NotEdit9.0E-50
Touch_NotPreview9.0E-50
Touch_NotTag9.0E-50
Touch_SessionWithContribution9.0E-50
Touch_SessionWithContribution9.0E-50
Touch_SessionWithContribution9.0E-50
Touch_Tag9.0E-50
Touch_Top9.0E-50
Touch_Version9.0E-50
Touch_Admin8.0E-50
Touch_NotPreview8.0E-50
Touch_NotPreview8.0E-50
Touch_SessionWithAdministration8.0E-50
Touch_NotApprovalORsessionWithApprovalAdministrator7.0E-50
Touch_NotEntry7.0E-50
Touch_sessionWithApprovalAdministrator7.0E-50
Touch_EditInplace6.0E-50
Touch_Entry6.0E-50
Touch_Entry6.0E-50
Touch_Entry6.0E-50
Touch_Entry6.0E-50
Touch_NotEntry6.0E-50
Touch_NotPreview6.0E-50
Touch_SessionWithAdministration6.0E-50
Touch_SessionWithContribution6.0E-50
Touch_SessionWithContribution6.0E-50
Touch_SessionWithContribution6.0E-50
Touch_Tag6.0E-50
Touch_Unlogin6.0E-50
Touch_Unlogin6.0E-50
MODULE TOTAL TIME0.1578181
BOOT TOTAL TIME0.20779
BUILD TOTAL TIME0.2166
REWRITE PATH TOTAL TIME0.01106
PROCCESS TIME0.675639

テンプレート

template
themes/base/include/head/meta.html
themes/base/include/head/robots.html
themes/base/include/head/link.html
themes/base/include/head/js.html
themes/base/include/head/structured-data.html
themes/base/include/body-start.html
themes/base/include/header.html
themes/base/include/header/dynamicGlobalNavi.html
themes/system/admin/module/setting.html
themes/blog@base/include/header/page-title.html
themes/base/include/header/topicpath.html
themes/system/admin/action.html
themes/system/include/check-seo.html
themes/base/include/footer.html
themes/base/include/body-end.html
themes/base/include/module/tag/filter.html
themes/base/include/module/entry/bodyNoDate.html
themes/system/admin/entry/revision-info.html
themes/system/admin/entry/title.html
themes/system/include/unit.html
themes/base/include/unit/tag-select.html
themes/system/include/gmaps-error.html
themes/base/include/unit/custom.html
themes/base/include/unit/extend.html
themes/base/include/module/entry/continue.html
themes/base/include/form/unit.html
themes/base/include/form/input.html
themes/base/include/form/confirm.html
themes/system/admin/entry/edit.html
themes/system/admin/entry/style.html
themes/system/admin/entry/geo.html
themes/system/admin/map/_google-map-picker.html
themes/system/admin/map/_open-street-map-picker.html
themes/system/admin/entry/related.html
themes/system/admin/entry/related-table.html
themes/base/admin/entry/field.html
themes/base/admin/entry/ogp.html
themes/base/admin/entry/pickup.html
themes/base/admin/entry/seo.html
themes/system/admin/entry/unit.html
themes/base/admin/entry/unit/extend.html
themes/base/admin/entry/field_foot.html
themes/system/admin/entry/revision.html
themes/system/admin/entry/js.html
themes/system/admin/entry/add.html
themes/system/admin/form2/edit.html
themes/system/admin/form2/unit.html
themes/system/admin/entry/action.html
themes/base/include/module/entry/list.html
themes/base/include/module/category/list.html

メモリー

keyvalue
memory_limit200M
memory_get_usage3.57 MB
memory_get_peak_usage5.27 MB

Query Count

query count
122