管理ページを表示する – WordPressプラグインの作成 13

投稿者: | 2018年3月3日

管理ページ画面の HTML はできたので、これを実際に表示できるようにします。
WordPress設定メニューの「オンラインヘルプ設定」をクリックすると、Fow_OnlineHelp_Admin クラスの print_admin_page 関数が実行されるので、この関数の中で top.php を読み込みます。

必要なデータの追加

Fow_OnlineHelp_Adminクラスに、以下のデータ(メンバー)を追加します(9-31行目)。

class Fow_OnlineHelp_Admin
{
    /**
     * 定数
     */
    const EMPTY_PAGINATION = [
        'current' => 1,
        'max' => 1,
        'middle' => 5,
    ];

    /**
     * フィールド
     */
    private $message = '';

    private $settings = [
        'sortlink' => '',
        'itemlink' => '',
        'sorted' => 0,
        'sorted-order' => 0,
        'row_begin' => 0,
        'row_end' => -1,
        'rows' => 25,
        'pagination' => self::EMPTY_PAGINATION,
    ];

Print_admin_page関数の実装

print_admin_page関数の内容を、以下のように修正します。

    /**
     * 管理ページを出力する
     */
    public function print_admin_page()
    {
        if (!current_user_can('manage_options')) {
            wp_die(__('管理ページへのアクセス権限がありません。'));
        }

        global $onlinehelp_db;
        global $onlinehelp_lib;

        // データの取得
        $products = $onlinehelp_db->fetch_products();
        $categories = $onlinehelp_db->fetch_categories();
        $items = $onlinehelp_db->fetch_helps();

        // データの設定
        $pagination = $this->settings['pagination'];
        $pagination['max'] = $onlinehelp_lib->get_page_max(count($items), $this->settings['rows']);

        $this->settings['sortlink'] = $onlinehelp_lib->format_url(['sort']);
        $this->settings['itemlink'] = $onlinehelp_lib->format_url(['item', 'sort']);
        $this->settings['row_begin'] = ($pagination['current'] - 1) * $this->settings['rows'];
        $this->settings['row_end'] = $this->settings['row_begin'] + $this->settings['rows'] - 1;
        if ($this->settings['row_end'] >= count($items)) {
            $this->settings['row_end'] = count($items) - 1;
        }

        $this->settings['pagination'] = $pagination;

        // ビューの読み込み
        require_once FOW_OH_PLUGIN_DIR . '/views/top.php';
    }

(55-57行目)
誰でも設定を変更できてしまうと困るので、アクセスしてきた人の権限を確認します。ここでは manage_options 以上の権限があれば、設定ページが表示されます。この権限に満たないときは、「管理ページへのアクセス権限がありません。」と表示され、設定ページにアクセスできません。
なお、__( ) というのは WordPress に用意されている関数です。この関数に渡した英文が、実際のロケールに応じて翻訳されます(一致する語句が辞書に登録されていればの話ですが)。英文を翻訳する関数なので、日本語文に __( ) を使用するのは意味がありませんが、説明のためにあえて使用しています。
(82行目)
top.php をインクルードします。これで設定ページに top.php の内容が表示されます。

データベースからデータを取得する関数の追加

画面に表示する各種データを、データベースが取得する必要があります。設定ページのトップ画面に必要なデータは、製品の一覧、カテゴリーの一覧、及びオンラインヘルプの一覧です。これらのデータを取得する関数を、Fow_OnlineHelp_DB クラスに、順番に追加していきます。

fetch_products関数の追加

製品の一覧を取得する fetch_products 関数を追加します。以下のとおりになります(8-20行目)。

/**
 * DB操作クラス
 */
class Fow_OnlineHelp_DB
{
    /**
     * 製品の一覧を取得する
     * @return  array   製品一覧
     */
    public function fetch_products()
    {
        global $wpdb;

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

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

fetch_categories関数の追加

カテゴリーの一覧を取得する fetch_categories 関数は、以下のとおりです。

    /**
     * カテゴリーの一覧を取得する
     * @param array   カテゴリー一覧
     */
    public function fetch_categories()
    {
        global $wpdb;

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

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

fetch_helps関数の追加

ヘルプの一覧を取得する fetch_helps 関数は以下のとおりになります。

    /**
     * ヘルプの一覧を取得する
     * @param   int     $product    対象の製品ID
     * @param   int     $category   対象のカテゴリーID
     * @return  array   ヘルプの一覧
     */
    public function fetch_helps($product = 0, $category = 0)
    {
        global $wpdb;

        $table_help = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['helpbody'];
        $table_product = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['product'];
        $table_category = $wpdb->prefix . Fow_OnlineHelp_Lib::FOW_OH_TABLES['category'];

        $sql = "SELECT help_id, title, helpbody, tags, relations, th.product_id AS prod_id, prod_name AS product,
            category_id, cat_name AS category, th.created_at, th.updated_at
            FROM ($table_help AS th INNER JOIN $table_product ON th.product_id = $table_product.product_id)
            INNER JOIN $table_category ON th.category_id = $table_category.cat_id";

        $where = [];
        if (intval($product) !== 0) {
            $where[] = "(th.product_id = $product)";
        }
        if (intval($category) !== 0) {
            $where[] = "(category_id = $category)";
        }

        if (count($where) > 0) {
            $sql .= " WHERE ";

            for ($i = 0; $i < count($where) - 1; $i++) {
                if ($i > 0) {
                    $sql .= " AND ";
                }
                $sql .= $where[$i];
            }
        }

        $sql .= " ORDER BY th.product_id, category_id, help_id;";
        return $wpdb->get_results($sql, OBJECT);
    }

引数 $product と引数 $category は、製品やカテゴリーで絞り込みを行うためのものです。0 (ゼロ)が渡された場合、または引数が省略された場合、絞り込みは行いません。

データを加工する関数の追加

Fow_OnlineHelp_Lib クラスに関数を追加します。

get_page_max 関数の追加

ページネーションでのページの分割数(最終ページ番号)を取得する関数です。onlinehelp_consts.phpFow_OnlineHelp_Lib クラスに追加します。コードは以下のとおりです。

    /**
     * ページネーションのページ分割数を取得する
     * @param   int $all        総行数
     * @param   int $in_page    1ページの行数
     * @return  int ページの分割数
     */
    function get_page_max($all, $in_page)
    {
        return intval(floor($all / $in_page)) + ($all % $in_page !== 0 ? 1 : 0) + (intval($all) === 0 ? 1 : 0);
    }

format_url 関数の追加

URLにパラメーターを付加するための関数です。コードは以下のとおりです。

    /**
     * パラメーター付きURLのフォーマットを作成する
     * @param   array   $params パラメーターの配列
     * @return  string  作成したフォーマット
     */
    function format_url($params)
    {
        $baseurl = $_SERVER['REQUEST_URI'];
        if ((strpos($baseurl, 'http://') === false) && (strpos($baseurl, 'https://') === false)) {
            $url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $baseurl;
        } else {
            $url = $baseurl;
        }

        $delimiters = array(
            '?',
            '&',
        );

        foreach ($params as $_param) {
            // URLにパラメーターがあるときは削除する
            foreach ($delimiters as $_delim) {
                $item_pos = strpos($url, $_delim . $_param . '=');
                if ($item_pos !== false) {
                    $item_end_pos = strpos($url, '&', $item_pos + 1);
                    if ($item_end_pos === false) {
                        $url = substr($url, 0, $item_pos);
                    } else {
                        if ($_delim === '?') {
                            $url = substr_replace($url, '', $item_pos + 1, $item_end_pos - $item_pos);
                        } else {
                            $url = substr_replace($url, '', $item_pos, $item_end_pos - $item_pos);
                        }
                    }
                }
            }

            // パラメーターを付ける
            $delim = '?';
            if (strpos($url, $delim) !== false) {
                $delim = '&';
            }

            $url .= $delim . $_param . "=%s";
        }

        return $url;
    }

コメントを残す

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

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