2026年6月30日
2026年6月30日
WordPressでサポートチケットシステムを構築する方法|プラグイン・自作・外部ヘルプデスクの選び方
WordPressでサポートチケットシステムを作る方法は、「チケット管理プラグインを使う」「フォームとカスタム投稿タイプで自作する」「外部のヘルプデスクとつなぐ」の3通りです。問い合わせの件数と対応する人数、メールからの起票が必要かどうかで選ぶと失敗しにくくなります。この記事では、それぞれの構築手順と、チケットに含まれる個人情報の扱い、担当者の権限、メール連携の考え方を解説します。
チケットシステムでできること
問い合わせをメールだけで受けていると、担当者の重複対応や返信漏れが起きやすく、過去のやり取りも探しにくくなります。チケットシステムでは、問い合わせ1件を「チケット」として番号付きで登録し、次のような情報を一か所で管理します。
- 問い合わせた人、件名、内容、受付日時
- 状態(未対応・対応中・回答待ち・完了など)
- 担当者と、担当者同士の内部メモ
- 返信の履歴
WordPressで構築すると、会員サイトやWooCommerceのアカウントと同じログインで問い合わせを受けられ、問い合わせた人が自分のチケットの状況を確認できるようにもできます。
構築方法の選び方
チケット管理プラグインを使う
もっとも手早いのは、チケット管理用のプラグインを入れる方法です。代表的なものに Awesome Support、SupportCandy、Fluent Support があり、いずれもサイト上の受付フォーム、チケット一覧、担当者の割り当て、状態の管理といった基本機能を備えています。
選ぶときは次の点を確認してください。
- メールからの起票・返信: メールで届いた問い合わせをチケットにする機能は、有料版やアドオンで提供されていることが多い
- 担当者の権限: 担当者専用の権限グループが用意されているか、担当者ごとに見られるチケットを絞れるか
- 添付ファイルの保存場所: 誰でもURLで開ける場所に保存されないか
- 更新状況: WordPress.orgやベンダーのページで最終更新日と対応バージョンを確認し、長く更新されていないものは避ける
無料版と有料版で使える機能の範囲は変わることがあります(2026年10月現在)。導入前に公式ページで最新の機能一覧を確認し、テスト環境で受付から完了までの流れを一通り試してから本番に入れてください。
フォームとカスタム投稿タイプで自作する
問い合わせの件数が少なく、必要なのが「受付・状態管理・担当者への通知」程度なら、カスタム投稿タイプで小さく自作する方法もあります。見た目や項目を自由に決められ、プラグインの機能の多さに振り回されずに済みます。具体的な手順は次の章で紹介します。
外部のヘルプデスクとつなぐ
Zendesk、Freshdesk、Help Scoutのような外部のヘルプデスクサービスは、メールの取り込み、返信テンプレート、担当者の割り振り、対応時間の集計まで最初からそろっています。WordPress側は問い合わせフォームを置き、送信先をヘルプデスクの受付用メールアドレスにするだけでも連携でき、サービスによってはWordPress向けの連携プラグインやウィジェットも用意されています。
対応する人が複数いて、問い合わせが毎日一定数あるなら、WordPress内で作り込むより外部サービスのほうが運用の負担は小さくなりがちです。その場合は、チケットの個人情報が外部サービスに保存されることをプライバシーポリシーに記載しておきます。
カスタム投稿タイプで簡易チケットを作る
ここでは、ログイン中のユーザーがフォームからチケットを送ると、非公開のチケットとして保存され、担当者にメールで通知される最小構成を作ります。ログインを前提にしているのは、問い合わせた人を特定でき、スパム投稿をほぼ防げるためです。
作業前にサイトのバックアップを取り、テスト環境で試してから本番に入れてください。次のコードを wp-content/plugins/simple-support-tickets/simple-support-tickets.php として保存し、管理画面の「プラグイン」から有効化します。
<?php
/**
* Plugin Name: Simple Support Tickets
* Description: ログイン中のユーザーがチケットを送信できる簡易チケット受付
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// チケット用の非公開投稿タイプ
add_action( 'init', function () {
register_post_type( 'support_ticket', array(
'labels' => array(
'name' => 'サポートチケット',
'singular_name' => 'サポートチケット',
),
'public' => false, // サイト側にURLを持たせない
'show_ui' => true, // 管理画面には表示する
'show_in_rest' => false, // REST API からは読ませない
'menu_icon' => 'dashicons-sos',
'supports' => array( 'title', 'editor', 'author' ),
) );
} );
// 受付フォーム: 固定ページに [support_ticket_form] と書いて表示する
add_shortcode( 'support_ticket_form', function () {
if ( ! is_user_logged_in() ) {
return '<p>チケットを送信するにはログインしてください。</p>';
}
ob_start();
?>
<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
<input type="hidden" name="action" value="submit_support_ticket">
<?php wp_nonce_field( 'submit_support_ticket', 'support_ticket_nonce' ); ?>
<p><label>件名<br><input type="text" name="ticket_subject" maxlength="200" required></label></p>
<p><label>内容<br><textarea name="ticket_body" rows="8" required></textarea></label></p>
<p><button type="submit">送信する</button></p>
</form>
<?php
return ob_get_clean();
} );
// 送信の受け取り(ログイン中のユーザーだけ。未ログイン用の nopriv フックは登録しない)
add_action( 'admin_post_submit_support_ticket', function () {
check_admin_referer( 'submit_support_ticket', 'support_ticket_nonce' );
$subject = isset( $_POST['ticket_subject'] ) ? sanitize_text_field( wp_unslash( $_POST['ticket_subject'] ) ) : '';
$body = isset( $_POST['ticket_body'] ) ? sanitize_textarea_field( wp_unslash( $_POST['ticket_body'] ) ) : '';
if ( '' === $subject || '' === $body ) {
wp_die( '件名と内容を入力してください。', '', array( 'back_link' => true ) );
}
$ticket_id = wp_insert_post( array(
'post_type' => 'support_ticket',
'post_status' => 'private',
'post_title' => $subject,
'post_content' => $body,
'post_author' => get_current_user_id(),
), true );
if ( is_wp_error( $ticket_id ) ) {
wp_die( '送信に失敗しました。時間をおいて再度お試しください。' );
}
// 担当者への通知には問い合わせ内容を載せず、管理画面へのリンクだけを送る
wp_mail(
get_option( 'admin_email' ),
'新しいサポートチケット #' . $ticket_id,
"新しいチケットが届きました。\n" . admin_url( 'post.php?post=' . $ticket_id . '&action=edit' )
);
$back = wp_get_referer() ? wp_get_referer() : home_url( '/' );
wp_safe_redirect( add_query_arg( 'ticket', 'sent', $back ) );
exit;
} );
フォームを置きたい固定ページにショートコード [support_ticket_form] を書くと、ログイン中のユーザーにだけ受付フォームが表示されます。送信の処理では、nonceで正規のフォームからの送信かを確認し、入力値を sanitize_text_field() と sanitize_textarea_field() で整えてから保存しています。
確認方法は、購読者のテスト用アカウントでログインしてフォームを送信し、管理者アカウントの管理画面に「サポートチケット」として非公開で登録されているか、通知メールが届くかを見ます。メールが届かない場合は、WordPressのメール送信の設定(SMTPの設定など)を先に見直してください。
この構成から広げるなら、状態を管理するタクソノミー(未対応・対応中・完了)を追加したり、問い合わせた人が自分のチケットを一覧できるページを作ったりします。一覧は WP_Query で author に現在のユーザーID、post_status に private を指定すれば取得できます。返信のやり取りまで作り込む段階になったら、プラグインか外部サービスへの切り替えを検討したほうが、保守の手間を抑えられます。
担当者の権限を整理する
上のコードでは投稿タイプの権限を通常の投稿と同じ扱いにしているため、他人の非公開投稿を読める権限を持つ編集者と管理者がチケットを閲覧できます。投稿者や寄稿者、購読者は他人のチケットを一覧で見ることはできません。
編集者の中にチケットを見せたくない人がいる場合は、register_post_type() の capability_type に専用の名前を指定し、担当者用の権限グループにだけその権限を付与します。プラグインを使う場合も、担当者を管理者にしてしまうとサイト全体の設定まで触れるようになるため、プラグインが用意する担当者用の権限グループを使い、管理者権限は必要な人だけに絞ってください。
チケットの個人情報を守る
チケットには氏名、メールアドレス、注文情報、ときにはサイトのログイン情報まで書かれることがあります。次の点を運用ルールにしておきます。
- 公開範囲: チケットは非公開で保存し、REST APIやサイト内検索に出ないことを確認する
- 添付ファイル: メディアライブラリのアップロード先は、URLがわかれば誰でも開ける。添付を受ける場合は、直接アクセスを制限した場所に保存できる仕組みを選ぶ
- パスワードを書かせない: 受付フォームに「パスワードは記載しないでください」と明記する
- 通知メール: 通知には内容を載せず、管理画面へのリンクだけにすると、メールの転送や誤送信による漏えいを減らせる
- 保存期間と削除: 完了したチケットをいつまで残すかを決め、プライバシーポリシーに利用目的とあわせて記載する
WordPressの「ツール」にある個人データのエクスポート・消去の機能は、そのままではカスタム投稿タイプのチケットを対象にしません。本人からの開示や削除の依頼に対応したい場合は、wp_privacy_personal_data_exporters と wp_privacy_personal_data_erasers フィルターでチケット用の処理を登録するか、これらに対応したプラグインを選びます。
メールからチケットを作る仕組み
問い合わせをメールで受け付け、そのままチケットにする機能は「メールパイピング」などと呼ばれます。方式は大きく2つです。
- メールサーバーから転送する方式: 受信したメールをサーバー上のプログラムに渡して起票する。サーバー側の設定が必要で、共用サーバーでは使えないことがある
- メールボックスを定期的に読みに行く方式: プラグインがIMAPなどで受付用メールボックスを定期的に確認し、新しいメールをチケットにする。WP-Cronで動く場合はアクセスが少ないと取り込みが遅れるため、サーバーのcronからWP-Cronを動かす設定にすると安定する
返信をどのチケットに結び付けるかは、件名に入れたチケット番号や返信用アドレスで判定するのが一般的です。自作で実装すると手間がかかる部分なので、メールでの起票が必須なら、対応したプラグインの有料版か外部ヘルプデスクを選ぶのが近道です。どの方式でも、送信側のメールがスパム扱いされないよう、SMTPでの送信とドメインのSPF・DKIMの設定を整えておきます。
まとめ
- 構築方法はチケット管理プラグイン、フォームとカスタム投稿タイプでの自作、外部ヘルプデスクの3通り。件数・人数・メール起票の要否で選ぶ
- プラグインは Awesome Support、SupportCandy、Fluent Support などがある。メール起票や権限の機能は版によって異なるため、最終更新日とあわせて確認する
- 自作する場合は非公開の投稿タイプに保存し、nonce・サニタイズ・ログイン確認を入れる
- 担当者には専用の権限グループを使い、管理者権限を広げない
- チケットは個人情報として扱い、添付ファイルの保存場所、通知メールの内容、保存期間を決めておく