ショートコード / ブロック
[mqs_simulator id="設問セットID"]— 設問セットを描画。idは必須。- ブロック名
mqs/simulator(「診断シミュレーション」)。属性id(integer, 初期値 0)。
カスタム投稿タイプ
| post_type | 用途 |
|---|---|
mqs_question_set | 設問セット(診断1件の親) |
mqs_question | 設問 |
mqs_content | 結果コンテンツ |
フィルターフック
| フック | 型 / デフォルト | 用途 |
|---|---|---|
mqs_force_enqueue_assets | bool / 設定値 | テンプレートやACF経由でショートコードを呼ぶ場合に、CSS/JSを強制読込 |
mqs_force_cf7_assets | bool / false | 診断未設置ページでもCF7連携アセットを読込 |
mqs_analytics_rate_limit_per_minute | int / 120 | 計測REST APIのIP単位レート上限(分あたり) |
mqs_event_log_retention_days | int / 設定値 | 計測イベントログの保持日数(cronで自動削除) |
mqs_import_max_file_size | int(bytes) / 5MB | JSONインポートの最大ファイルサイズ |
mqs_cf7_spam_preserve_agents | array / ['wpcf7','recaptcha','turnstile','stripe'] | CF7誤判定救済モードで「判定を尊重(救済しない)」エージェント一覧 |
mqs_locate_template | string | 解決済みテンプレートパスを差し替え |
mqs_template_path | string / 'templates/' | テーマ側オーバーライドの探索ディレクトリ |
例: 計測APIのレート上限を緩和
add_filter( 'mqs_analytics_rate_limit_per_minute', function () {
return 300;
} );
例: サードパーティのスパム対策を救済対象に含める
add_filter( 'mqs_cf7_spam_preserve_agents', function ( $agents ) {
// 一覧から外したエージェントの判定は「救済」されうる
return array_diff( $agents, [ 'akismet' ] );
} );
JSフック
フロントエンドJS(assets/js/script.js)には、外部スクリプトや埋め込みコンテンツから挙動を拡張するための2種類のフック機構が実装されています。
- ① CustomEvent ベースのイベントフック(DOMイベント)
- ② コンテンツ単位のインラインJSフック(埋め込みコード実行)
① CustomEvent ベースのイベントフック
mqsDispatch() で発火します。コンテナ要素に bubbling 付きで dispatch されるため、container.addEventListener(...) でも document.addEventListener(...) でも捕捉できます。
各イベントの detail には共通で以下が付与されます。
{ container, questionSetId, postId, /* 各イベント固有の値 */ }
イベント一覧
| イベント名 | 発火タイミング | detail(固有分) |
|---|---|---|
mqs:start | 最初の回答時(1回だけ) | answers |
mqs:answer | 各回答ごと | questionId, choiceId, stepNumber, answers |
mqs:complete | 全問回答完了時 | answers |
mqs:beforeResults | 結果HTML挿入の直前 | html, count, answers |
mqs:afterResults | 結果HTML挿入の直後 | html, count, answers, resultItems |
mqs:results:rendered | 埋め込みフォーム初期化後(CF7 / Turnstile 等の連携用) ※ resultsContent 上で発火・共通payloadなし | container, simulator |
mqs:contentBeforeShow | 各結果アイテム描画直前(paint前・同期) | contentId, element, container, questionSetId, postId, answers |
mqs:contentShow | 各結果アイテム描画後(次のpaint後) | 同上 |
mqs:restart | やり直しボタン押下時 | (共通payloadのみ) |
利用例
// 全問回答完了を捕捉
document.addEventListener('mqs:complete', function (e) {
console.log('回答:', e.detail.answers);
console.log('質問セット:', e.detail.questionSetId);
});
// 結果アイテムが表示されたタイミングで処理
document.addEventListener('mqs:contentShow', function (e) {
const { contentId, element } = e.detail;
// element に対する追加処理など
});
② コンテンツ単位のインラインJSフック
各結果アイテム内に埋め込まれた <script class="mqs-content-hooks">(JSON)から before / after のコード文字列を読み取り、mqsRunHook() で new Function('event', 'mqs', code) として実行する仕組みです。
動作フロー
mqsReadItemHooks()が結果アイテム内のJSONをパースbeforeのコード →mqs:contentBeforeShowのタイミングで実行afterのコード →mqs:contentShowのタイミングで実行
実行コンテキスト
フックコード内では以下が利用できます。
| 変数 | 内容 |
|---|---|
event | 発火した CustomEvent(mqs:contentBeforeShow / mqs:contentShow) |
mqs | コンテキストオブジェクト(下記) |
this | 対象の結果アイテム要素(ctx.element) |
mqs(ctx)の中身:
{ contentId, element, container, questionSetId, postId, answers }
埋め込みJSONの形式
<script class="mqs-content-hooks" type="application/json">
{
"before": "/* paint前に実行されるJSコード文字列 */",
"after": "/* paint後に実行されるJSコード文字列 */"
}
</script>
補足
assets/js/analytics.js 側のイベント(start / answer / complete / result_view)は上記JSフックとは別物です。MQSAnalytics.trackEvent() によるサーバー送信用トラッキングであり、拡張用のフック機構ではありません。
テンプレートのオーバーライド
フロント描画テンプレートは、お使いのテーマに同名ファイルを置くと差し替えできます。
wp-content/themes/<theme>/templates/shortcode/simulator.phpwp-content/themes/<theme>/templates/shortcode/results.php
探索ディレクトリは mqs_template_path、最終パスは mqs_locate_template で変更可能です。
アンインストール時の挙動
既定ではアンインストールしてもデータは保持されます。mqs_uninstall_remove_all_data オプションを有効(管理画面「設問セット > 設定 > 高度な設定 > アンインストール」)にすると、関連する投稿・カスタムテーブル・オプションを完全削除します。