編集ボタンで記事を編集できるようにする – WordPressプラグインの作成 20

投稿者: | 2018年5月22日

オンラインヘルプ設定ページの「編集」をクリックして、チェックを入れたヘルプ項目を編集できるようにします。
ほとんど部分は「新規作成」時と共通の処理となります。「新規作成」と「編集」の処理の違いは、「編集」ボタンを押したとき、データベースからデータを取得してビューに渡すということだけです。

POSTの検証

「編集」ボタンは type を submit にしているので、これを押すとPOSTが発生します。POSTで送信されたデータの検証は、Fow_OnlineHelp_Adminクラスの validate_top メソッドで行います。

validate_topメソッドの修正

validate_topメソッドを以下のように修正します(onlinhelp_admin.php : 245-261行目)。

    /**
     * トップ画面のバリデーション
     * @param   string  $command    submitボタンの値
     */
    public function validate_top($command)
    {
        // 現在の状態の取得
        $product = filter_input(INPUT_POST, 'product');
        $category = filter_input(INPUT_POST, 'category');

        // 絞り込み状態
        if ($product !== 'none') {
            $this->settings['product'] = intval($product);
        }
        if ($category !== 'none') {
            $this->settings['category'] = intval($category);
        }

        // 押されたボタンによって分岐
        switch ($command) {
            case 'new':
                $this->form = 'new';
                break;

            case 'edit':
                global $onlinehelp_db;

                // チェックを入れた項目の確認
                $selected = filter_input(INPUT_POST, 'cb-select', FILTER_DEFAULT, FILTER_FORCE_ARRAY);
                if (empty($selected)) {
                    return;
                }

                // 最初の項目だけを編集対象にする
                $help_id = intval($selected[0]);
                $this->edit_data = $onlinehelp_db->fetch_help($help_id);
                if (!is_null($this->edit_data)) {
                    $this->form = 'edit';
                }

                break;
        }
    }

36-39行目
チェックを入れた項目が編集対象になるので、チェックを入れた項目を取得します。複数のチェックボックスを同じ名前(name)に設定しているので、配列として取得します。
チェックが1つも入っていなければ、配列は空になります。その場合、何もせずにメソッドを抜けます。
42-46行目
配列が空でなければ最初の要素だけ取得し、これを編集対象にします。データベースからデータを取得し、編集データ保管用のフィールド(メンバー)にデータを保管しておきます(43行目)。
データベースからデータ取得に失敗したり、配列に入っていた値が不正だったりした場合、fetch_help メソッドの戻り値は null になります。戻り値が null ではないことを確認します(44行目)。

fetch_helpメソッドの作成

データベースからヘルプのデータを取得できるよう、fetch_helpメソッドを Fow_OnlineHelp_DB クラスに作成します。
コードは以下のようになります。

  /**
     * ヘルプのデータを取得する
     * @param   int     $help_id    ヘルプID
     * @return  mixed   ヘルプデータの配列、またはnull
     */
    public function fetch_help($help_id)
    {
        global $wpdb;

        $table_help = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['helpbody'];
        $sql = "SELECT help_id, title, helpbody, tags, relations, product_id, category_id
            FROM $table_help
            WHERE help_id = $help_id;";

        $result = $wpdb->get_row($sql, ARRAY_A);
        if (empty($result)) {
            return null;
        } else {
            return $result;
        }
    }

edit.php で編集画面を表示させる際、既存データの指定に $help['title'] のような連想配列を使っています。そのため、76行目のデータベースからのデータ取得には、ARRAY_A を指定して、連想配列でデータを受け取ります。

edit.phpの修正

これで、登録済みのヘルプを修正できるようになりました。しかし、もう少し手を加えましょう。
編集画面が表示された際、タイトルやヘルプ本文などのテキストデータは表示されますが、製品とカテゴリーのドロップダウンが、何も選択されていない状態(「選択してください」の状態)になってしまいます。edit.php を修正して、製品とカテゴリーが選択された状態になるようにします。
edit.php を以下のように修正します(44行目、63行目)。

            <tr>
                <th scope="row"><label for="input-product">製品</label></th>
                <td>
                    <span>
                        <select id="input-product" name="product_id">
                            <option value="0">選択してください</option>
                            <?php foreach ($products as $_product): ?>
                                <option value="<?=esc_attr($_product->product_id)?>" <?=intval($_product->product_id) === intval($help['product_id']) ? 'selected' : ''?>><?=esc_html($_product->prod_name)?></option>
                            <?php endforeach;?>
                        </select>
                    </span>
                    <span>
                        <input type="text" name="new_product" class="regular-text" placeholder="登録する製品名">
                    </span>
                    <span>
                        <button type="submit" name="submit" class="button button-secondary" value="add-product">製品の登録</button>
                    </span>
                </td>
            </tr>
            <tr>
                <th scope="row"><label for="input-category">カテゴリー</label></th>
                <td>
                    <span>
                        <select id="input-category" name="cat_id">
                            <option value="0">選択してください</option>
                            <?php foreach ($categories as $_category): ?>
                                <option value="<?=esc_attr($_category->cat_id)?>" <?=intval($_category->cat_id) === intval($help['category_id']) ? 'selected' : ''?>><?=esc_html($_category->cat_name)?></option>
                            <?php endforeach;?>
                        </select>
                    </span>
                    <span>
                        <input type="text" name="new_category" class="regular-text" placeholder="登録するカテゴリー">
                    </span>
                    <span>
                        <button type="submit" name="submit" class="button button-secondary" value="add-category">カテゴリー登録</button>
                    </span>
                </td>
            </tr>
        </table>

以上で、「編集」ボタンでの編集が可能になりました。
次回は、一覧のタイトルをクリックして、その項目を編集できるようにします。

編集ボタンで記事を編集できるようにする – WordPressプラグインの作成 20」への1件のフィードバック

  1. 山内万寿夫

    データを読めるように努力するが? 実は私にはわかりません。

    返信

コメントを残す

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

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