WP DS FAQ Plusプラグイン in Wordpress

木谷 公哉(KITANI Kimiya)
kitani@bakkers.gr.jp

Japanese | English

最近の履歴
WP DS FAQ Plus プラグイン (WP3.5で動作確認)

WP DS FAQ1.3.3(2011/08/19に新バージョンが出た)をベースに、セキュリティ強化(CSRF対策やSQL Injection強化等)と利便性向上を目的に作成中。まだいろいろ課題はあるにせよ、とりあえず使えそうなので公開。問題があったらご指摘ください。

[新機能紹介]
  • 管理画面

    ログイン後の左サイドメニューの「設定」→「FAQの設定」(初期値:管理者の閲覧・変更可)。編集者であれば、左サイドメニューの「FAQ」から「管理設定」のリンクをたどって設定をみることは出来ます(閲覧専用・変更不可)。


    管理画面(1) 管理画面(2)

    管理権限は、FAQに関するすべての権限を持ちます。初期値はプラグイン管理者(level_8)です。編集権限は、FAQに関する編集のみの権限を持ちます(カテゴリー内の質問投稿・編集・削除のみ)。初期値は、編集者(level_7)です。細かい設定についてはイメージには載せていませんが、説明文がありますので御覧ください。

    管理画面(3)

    ショートコードについては、1.0.13(2011.09.14)より管理画面の冒頭に表示することにしました。複雑化したためです


  • 編集画面

    編集画面からも「管理設定」にいけます。こちらについては先程の管理画面で編集権限を持つユーザも管理画面を見ることが可能になります

    先ほどの管理画面の「安全措置」ですべての「削除」機能を無効にしています。またソートを追加しています。WP DS FAQでは、ソートキー「カスタム」、ソート順「昇順」になっています。カスタムの場合のみ、、質問リストの上下矢印で表示位置を任意の場所に移動できます。


    編集画面(1) 編集画面(2)
  • 管理メニューとFAQ表示

    管理メニュー FAQ表示(記事評価)

[アップデート方法]
  1. 解凍すると、wp-ds-faq-plusフォルダができます
  2. すでにpluginフォルダにある「wp-ds-faq-plus」と置き換える(上書きする)。
  3. プラグインを有効化する
[インストール方法]
  1. ダウンロードした圧縮ファイルを展開(解凍)すると「wp-ds-faq-plus」というフォルダができます。このフォルダをWordpress側の「wp-content/plugins/」フォルダにコピー(転送)
  2. プラグインに「wp ds faq plus」が表示されるので、wp ds faqが停止(動いていない)ことを確認して有効化してください
※有効化の際に「プラグインを有効化する際に、413文字分の予期しない出力が発生しました」が出ていました(手元では出なくなりましたが)。日本語コメントいれまくったせいか、nkf -e で編集して、nkf -w で戻す作業を最初のころはしていたのでその影響かも知れません。なお利用には影響はありません。
※データ構造はWP DS FAQと同じなので、WP DS FAQを使ったり、WP DS FAQ Plusを使ったりと、行き来することができます
※1.0.9の新機能搭載に伴って一部互換性が失われています。戻すことも含めて下記の詳細をごらんください。 ※1.0.12で一部互換性が失われていた部分を修正しました
WP DS FAQ 1.3.2からの変更点と課題は、ソース内のreadmej.txtに記載しました。その抜粋は下記の通り。
WS DS FAQ WS DS FAQの入力画面
WS DS FAQ Plus WS DS FAQ Plusの入力画面
※タイムゾーンは、サーバのタイムゾーンに変換処理しています。ただし面倒なのでPHP5.2以降のみサポート。PHP5.1以下なら日時はUTCタイムになります(Wordpressでの設定にかかわらず、Wordpress本体側のシステム内部にタイムゾーンはUTCと決め打ち設定されているので、DBにはUTCタイムで保存される)。
■変更点

[1.0.0]
- SQLインジェクション対策の強化
- 引用符問題('や"をいれると\'や\"のようにエスケープされてしまう)
- ソースコードの表示
-- WP Syntaxプラグインは使えることを確認
- 日本語翻訳
-- エラー表示をロシア語から英語に変更

[1.0.1]: 2011.03.18
- 「質問の削除」ボタンは、一番右へ
- 「最終更新日」を「編集」ボタンの右側に(投稿画面)
- 「最終更新日」でソート
- 「タイトルの先頭に()」があれば、タイトル右にカテゴリー名を表記(カッコは全角半角どちらでもいい)
-- smallタグを使って小さめに表示
- 「カテゴリー名」が存在した場合、その中に「-」があると改行(br)を付ける
- 全体的にtdタグのサイズを微調整

[1.0.2]: 2011.03.19
- SSL対応(管理画面をSSL化したときのAjaxトラブルを解決)

[1.0.3]: 2011.04.01
- FAQ表示画面での「削除」リンクの削除
- メインメニューへのメニュー追加(多言語対応)

[1.0.4]: 2011.04.07
- CSRF対策を施した

[1.0.5]: 2011.04.22
- FORCE_SSL_ADMIN(管理画面をSSL化)を指定したとき、その値がtrue以外でも処理されてしまう問題を修正

[1.0.6]: 2011.04.23
- メインメニューに追加したメニューのサブメニューにカテゴリーを表示
  ※クリックして選択したサブメニューのハイライトがうまくいきません

[1.0.7]: 2011.07.01
- 質問内容がなければ、「作成中」と表示されるようにした(英語はUnder Construction.)

[1.0.8]: 2011.07.11
- 作成中について、divタグのclass="dsfaq_plus_under_construction" で括った

[1.0.9]: 2011.07.19
- FAQの個別ソート機能を追加(「ソートキー」「ソート順」を追加)
 ソートキー:カスタム(WP DS FAQの標準で質問名の↓↑位置変更可能)、最終更新日、質問名
 ソート順:昇順、降順

--(バグ)「表示」「ソートキー」「ソート順」の2つ以上連続して変更すると、
          最後の変更しか反映されない
   ※Ajax周りは難しくて、現状では変更するたびにブラウザをリロードして確認してください。
   2つ以上変更してもシステムへの影響はありません。単純に最後の変更しか反映されないだけ
   です。
--(未対応)「降順」を選択すると、「ソートキーのカスタム」選択の挙動がおかしくなる
 ※昇順を前提として作成されているので、まだこの段階では未修正です。
 ※降順でカスタムしたければ、一旦昇順に変更してカスタム設定してから降順を選択してください。
-(互換問題)新機能(ソート)を設定すると、「1.0.8以下に戻した場合」あるいは
 「WP DS FAQプラグイン」に戻したときに、その部分のFAQが表示されなくなります。
  その場合、設定から該当の「表示」部分の選択をし直してください。

 ※今回の変更でデータが失われることはありません。新しい機能を加えるために多くの変更が
  必要であるため、主にAjax周りで対応ができていない部分があるだけです。
  従ってバージョンダウンしても若干表示部分での再設定は必要な部分もありますが、
  影響は軽微だと思います。

[1.0.10]: 2011.08.22
- WP DS FAQ 1.3.3が出たことで、変更点について必要な項目を修正
--(対応の必要無し)エスケープ処理修正
--(対応)いくつかの数字データのチェック機能強化
-(修正)ログイン時のFAQ表示ページにおいて、「編集」→「キャンセル」を押した後に「質問の削除」が
  表示されていしまう問題を修正(管理画面以外での削除を禁止するという1.0.3のポリシーに準拠)
-(修正)管理画面のFAQサブメニューについて、「名前」順でソートするように変更

[1.0.11]: 2011.08.26
- 環境設定の新設(サイドメニューの「設定」より「FAQの設定」にアクセス
-- 一般設定(タイトルの表示)
-- 権限の設定(従来は管理者のみだったが、変更可能。)
-- 安全措置の設定(削除機能のON/OFF)
-- 他プラグイン連携(WP-PostRatingとの連携)
-- ヘッダとカスケード設定もこちらに移設

[1.0.11-1]: 2011.08.26
- (修正)環境設定の「一般設定」のタイトル表示について反映されてなかった問題を修正

[1.0.12]: 2011.08.29
- (修正)いくつかのセキュリティ修正
- WP DS FAQプラグインとの完全互換するよう修正
-- 1.0.9から「ソート項目」を追加したため、完全な互換は失われていました。これを解決。
-- ソートに関する設定項目を新設(dsfaq_nameのcustom_mode)
-- 従来のモード(dsfaq_nameのmode)と連動するようにし、WP DS FAQとWP DS FAQ Plusの行き来
   をしてもデータが失われず、そのまま引き継がれるように調整
-- ※もちろんWP DS FAQとWP DS FAQ Plusは同時に動作しません。必ず一方を「停止」してから
   もう一方を「有効」にしてください。

[1.0.12-1]: 2011.08.30
- (修正)カテゴリー追加が出来なくなっていた問題を修正

[1.0.13]: 2011.09.14(大規模変更)
-(修正)いくつかのセキュリティ問題を修正(脆弱性の修正というより、いくつか多重チェック項目を追加)
-(改善)カテゴリータイトル表示の改善
-- FAQ設定の「FAQカテゴリ名の接頭文字」「FAQカテゴリ名の接尾文字」で変更可能にした
-(改善)タイムゾーン処理の修正と強化(convet_timezone_data関数の新設)
-- 1.0.1において暫定的にタイムゾーンを日本語に固定していた問題を修正
   本バージョンから後述する「最新リスト表示」を利用するため、タイムゾーンの本格的な利用
   が必要になったため。1.0.12-1までは影響は軽微だった
-- 「設定」→「タイムゾーン」に準拠するようにした
-- (特記事項)UTC+9等 date_i18n関数が対応していないマニュアルオフセットにも対応。
      ※PHP5.2以降は独自チェックを、5.1以下はdate_i18n関数があれば利用し、
       なければタイムゾーンは無視(UTC時間)が使われる
--(改善)質問管理画面の各質問の最終更新日に「タイムゾーン」を付与しました
--(修正)最初のカテゴリーが、FAQサブメニューに表示されない問題を解決
-(追加)最新更新リスト表示機能
-- [dsfaq latest="10" latest_format="li/dl/table"]のオプションを追加
-- いずれも新設した「wp-ds-faq-plus.css」でデザイン・レイアウトを変更可能にした
-- ※ その他細かい設定方法は、「設定」→「FAQの設定」に記載しました

[1.0.14]: 2011.09.22
-(修正)FAQ表示画面からの編集時に、保存、キャンセルを選択すると「Ajaxエラー」が表示されていた
        問題を解決(なお表示されても正しく処理はされていました)
-(改善)最新リスト表示のうち「table」フォーマットについて、各項目のタイトル表示をするように変更

[1.0.15]: 2012.12.11
-(修正)Copyright情報の訂正

[1.0.16]: 2013.01.10
-(修正)環境設定画面にて「ヘッダとカスケード(CSS)」設定の保存や復元ができなくなっていた件を修正

[1.0.17]: 2013.01.10
-(修正)PHP5.2を利用していた場合、「Call to undefined method DateTime::setTimestamp()」とエラーがでる問題を修正

■今後の課題(目標)

- 設定のインポートとエクスポート

- 編集ボタンのバグ
  AとBの編集ボタンを押して、Aを直して編集したら、Aの中身がBで上書きされてしまう
  Javascriptで編集ボタンが押されていることを判断。保存ボタンが押されるまでロックするような処理が必要か

- 削除確認がない(恐ろしい)
  質問やFAQの削除は、削除ボタンを押した瞬間、対象質問が消えます。
  少なくても「確認」画面は出すべき。
  さらにいえば、削除表示、非表示チェックボックスを設けて、普段は非表示にしておくのが無難だと思う
(あるいはボタンに対してdisable属性をつけとくといいか)
-- 1.0.11で環境設定を新設することで暫定解決

- サブメニューに追加したカテゴリー表示の多言語化
Appendix 1: add_main_menuとadd_submenu_pageについて
本FAQでは、
add_menu_page(__('DS FAQ Plus ', 'wp-ds-faq'), __('DS FAQ Plus', 'wp-ds-faq'), 10, __FILE__, 'options_page' );

foreach ($select as $s)
    add_submenu_page(__FILE__, $s['name_faq'], $s['name_faq'], 10, __FILE__.'&add_sub_id='.$s['id'], 'options_page');
がメイン部分になります。
  • __('デフォルトタイトル', '言語ファイル用タイトル') これは翻訳用
  • __FILE__ : ここではプラグインをさします(wp-ds-faq-plus/wp-ds-faq.php と同じ)
  • options_page : wp-ds-faq.php内の関数。ここで表示に関するプログラムが展開

  • add_menu_pageの__FILE__に当たるところは、admin.php?page=wp-ds-faq-plus/wp-ds-faq.php になります。
  • add_submenu_pageの1つ目の__FILE__は、メインメニューを指し示すものであり、この場合プラグインのパスを、plugins/ の以下から書き出します。ほとんど__FILE__で事足りるでしょう
  • 二つ目の__FILE__は、&add_sub_id=id を引数にいれてます。つまり admin?page=wp-ds-faq-plus/wp-ds-faq.php?id=FAQカテゴリーのid になります。これでoptions_page内で処理します。

さて具体的にoptions_pageで、サブメニューがおされたときにどう処理しているのでしょうか。
  function options_page(){
  
      if(isset($_GET['add_sub_id'])){
        // add_sub_idのみの処理
        echo $this->get_faq_book(false, htmlspecialchars($_GET['add_sub_id']));
      }else{
        // 従来の処理
      }
   }   
そう、このFAQプラグインはget_faq_bookでFAQカテゴリーの表示を制御させることが可能。そうでないのなら、制御できるように書き換える必要があるでしょう。
古い履歴
  • 2011.04.07: 公開
  • 2011.04.08: 別ページに分離
  • 2011.04.21: プラグインの圧縮形式を変更(tar+gz → zip)
  • 2011.04.22: 1.0.5を公開
  • 2011.04.24: 1.0.6を公開。Appendix 1: add_main_menuとadd_submenu_pageについてを追加
  • 2011.07.01: 1.0.7を公開
  • 2011.07.11: 1.0.8を公開
  • 2011.07.20: 1.0.9を公開
  • 2011.08.22: 1.0.10を公開。WP DS FAQ 1.3.3のバグフィックスの取り込み等
  • 2011.08.26: 1.0.11を公開(タイトル表示設定の反映を忘れていたため、修正版1.0.11-1をアップ)。設定画面の新設(WP-PostRatingプラグインとの連携、その他)。新機能については、[新機能紹介]を御覧ください。
  • 2011.08.29: 1.0.12を公開(WP DS FAQとの完全互換を実現)
  • 2011.08.30: 1.0.12-1を公開(カテゴリーを追加できなくなっていた問題を修正)- 1.0.11に本問題が出ておりました
  • 2011.09.14: 1.0.13を公開(タイムゾーンへの対応、最新FAQリスト表示機能など大きな変更を加えました)。特にdate_i18nで非対応なマニュアルオフセットにも対応したconvet_timezone_data関数を新設したことが大きいと思います。詳細は、「設定」→「FAQの設定」に記載しました(スクリーンショット
  • 2011.09.22: 1.0.14を公開(バグフィックスと最新FAQリストの改善)
  • 2011.12.14: Wordpress 3.3での動作確認OK