管理ページ画面の 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.php
の Fow_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;
}