オンラインヘルプ項目を登録できるようにする – WordPressプラグインの作成 18

投稿者: | 2018年4月14日

オンラインヘルプ項目を新規作成するところが未完成ですので、今回はここを仕上げます。
ユーザーがフォームに入力したデータを受け取る処理はできています。仕上げに必要なのは、フォームから受け取ったデータの検証と、そのデータをデータベースのテーブルに登録する処理です。

データの検証

フォームから入力されたデータを検証します。想定するデータが入力されているかの確認です。
たとえば、「数値を入力するべき項目に、関係ない文字列が入力されていないか」や、「10文字以内で入力すべき項目に、10文字を超える文字が入力されていないか」などを確認します。想定外のデータが入力されているときは、フォーム画面の上部や該当項目部分にメッセージを表示して、データの修正を促します。
フォームから入力されたデータも含め、インターネット上で受け取ったデータは信頼できないのが前提です。データが想定の範囲内にあるかは必ず確認します。
オンラインヘルプの本文のようにデータ範囲の検証が難しいものは、データのエスケープ処理やタグの除去が必要になります。

データの検証は validate_edit関数で行いますが、実際の処理は Fow_OnlineHelp_Libクラスに記述します。細かい処理は別の部分に書いた方が、メイン処理の流れが一目で分かります。
まず、以下のようにグローバル変数 $onlinehelp_libを validate_edit関数内で使用できるようにしておきましょう(onlinehelp_admin.php : 115行目)。

    public function validate_edit($command)
    {
        global $onlinehelp_db;
        global $onlinehelp_lib;

フォームの[登録する]ボタンは value を ‘save’ にしていますので、switch文に $command が ‘save’ だったときの処理を追加します。

            case 'save':
                // 入力データを検証して保存する
                $this->message = $onlinehelp_lib->validate_edit_form($help);

                if (empty($this->message)) {
                    if ($onlinehelp_db->update_help($help)) {
                        $this->form = '';
                        $this->message = '正常に登録しました。';
                    } else {
                        $this->form = 'edit';
                        $this->edit_data = $help;
                        $this->message = '登録できませんでした。';
                    }
                } else {
                    $this->form = 'edit';
                    $this->edit_data = $help;
                }
                break;

150行目が入力データの検証です。validate_edit_form 関数はこのあと作成します。validate_edit_form 関数でデータを検証し、データに問題があった場合はエラーメッセージを返すようにします。
データに問題がなかった場合、update_help 関数でテーブルに登録します(153行目)。update_help 関数もあとで作成します。

validate_edit_form関数の作成

validate_edit_form関数は、Fow_OnlineHelp_Lib クラスのメソッドとして作成します。
(onlinehelp_consts.php)

    /**
     * オンラインヘルプの編集内容を検証する
     * @param   array   $data   入力されたデータの配列
     * @return  string  エラーメッセージ、エラーがないときは空文字
     */
    function validate_edit_form($data)
    {
        global $onlinehelp_db;

        // タイトルが入力されているか
        $result = '';
        if (empty($data['title'])) {
            $result = "タイトルを入力してください。\n";
        }

        // 正しい製品が選択されているか
        $product = $onlinehelp_db->fetch_product(intval($data['product_id']));
        if (is_null($product)) {
            $result .= "製品を選択してください。\n";
        }

        // 正しいカテゴリーが選択されているか
        $category = $onlinehelp_db->fetch_category(intval($data['cat_id']));
        if (is_null($category)) {
            $result .= "カテゴリーを選択してください。";
        }

        return $result;
    }

141、147行目のメッセージ末尾にある “\n” は、改行を表しています。これを改行として機能させるには、文字列を ” (ダブルクォーテーション)で囲む必要があります。
145、151行目はそれぞれ製品とカテゴリーが選択されているかを確認しています。フォームから取得した製品ID、カテゴリーIDをデータベースで検索し、その製品やカテゴリーが存在することを確認します。

fetch_product関数の作成

製品IDが存在するか確認するための fetch_product 関数を、Fow_OnlineHelp_Db クラスに作成します。
(onlinehelp_db.php)

    /**
     * 製品を取得する
     * @param   int $product_id 製品ID
     * @return  object  製品
     */
    public function fetch_product($product_id)
    {
        global $wpdb;

        $table = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['product'];
        $sql = "SELECT product_id, prod_name FROM $table WHERE product_id = $product_id;";

        return $wpdb->get_row($sql, OBJECT);
    }

(91行目) 取得する行(レコード)が1行だけの場合、get_row 関数を使用します。条件に一致する行がない場合、null が返ってきます(OBJECT を指定した場合)。

fetch_category関数の作成

カテゴリーIDが存在するか確認するための fetch_category 関数を、Fow_OnlineHelp_Db クラスに作成します。
(onlinehelp_db.php)

    /**
     * カテゴリーを取得する
     * @param   int $category_id    カテゴリーID
     * @return  object  カテゴリー
     */
    public function fetch_category($category_id)
    {
        global $wpdb;

        $table = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['category'];
        $sql = "SELECT cat_id, cat_name FROM $table WHERE cat_id = $category_id;";

        return $wpdb->get_row($sql, OBJECT);
    }

update_help関数の作成

ヘルプの内容をテーブルに保存できるよう update_help 関数を Fow_OnlineHelp_Db クラスに作成します。
(onlinehelp_db.php)

    /**
     * テーブルにヘルプ本体を登録、更新する
     * @param   array   $help   ヘルプデータ
     * @return  bool    (true)登録成功 (false)登録失敗
     */
    public function update_help($help)
    {
        global $wpdb;

        $table = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['helpbody'];

        $data = [
            'title' => sanitize_text_field($help['title']),
            'helpbody' => wp_kses_post($help['helpbody']),
            'tags' => sanitize_text_field($help['tags']),
            'relations' => sanitize_text_field($help['relations']),
            'product_id' => intval($help['product_id']),
            'category_id' => intval($help['cat_id']),
        ];

        $data_format = [
            '%s',
            '%s',
            '%s',
            '%s',
            '%d',
            '%d',
        ];

        if (intval($help['help_id']) === 0) {
            // 新規登録
            $data['created_at'] = date_i18n('Y-m-d H:i:s');
            $data_format[] = '%s';
            return ($wpdb->insert($table, $data, $data_format) !== false);
        } else {
            // 更新
            $where = [
                'help_id' => intval($help['help_id']),
            ];

            $where_format = [
                '%d',
            ];

            return ($wpdb->update($table, $data, $where, $data_format, $where_format) !== false);
        }
    }

update_help関数ではデータの新規登録(insert)と更新(update)のどちらにも対応できるようにします。新規登録と更新の見分けは、help_id で行います。help_id が 0 のときは ID が割り振られていないので新規登録となります。
300行目、insert関数は成功すると登録したレコード数(常に 1 になる)が返り、失敗すると false が返ります。
311行目、update関数は、成功すると更新したレコード数が返り、失敗すると false が返ります。update関数では関数自体は成功しても、更新されたレコードがない(条件に一致したレコードがない)ことがあります。この場合、戻り値は 0 になります。成功したことを判定するには、「戻り値 !== false」または「!(戻り値 === false)」と書くのが確実です。

これでヘルプを新規作成できるようになりました。実際に試してみてください。
見た目には問題なさそうですが、実際には隠れたエラーがあります。次回はこのエラーの修正を行います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)