タグ: plugin

6.設定値をDBに格納する

この記事は 5.管理画面のHTMLを作る の続きです。

いよいよDBへ値の登録&呼び出しです。
expNoticeAdminPage関数は管理ページのHTMLに全力を注いできたので、未だフォーム以外のものが殆ど見当たりません。これに
$_POST[‘action’] == ‘update’
だった場合の処理を追加していきます。
DBに値を渡す関数としてupdate_option関数というものがあるみたいです。この関数のリファレンスページは日本語版はまだ無いらしいです。なのでリンク先は英語版。
言っていることは簡単で
update_option(名, 値)
で、それぞれ指定された値をoptionsテーブルに記録する、だけ。
「名」がoptionsテーブルに存在しない時は「値」を登録、存在する時は「値」を上書き、です。
「名」はフォームのinputでそれぞれにつけたnameと同じにするのがならわしらしいです。
変な値を書き込まれたらどうするんだろうとか、そのへんの検証はしてません。
とりあえず、このupdate_option関数を使ってパキパキ書きます。

  if ($_POST['action'] == 'update') {
    $katz_en_default_year_post = intval($_POST['katz_en_default_year']);
    update_option('katz_en_default_year', $katz_en_default_year_post);
    $katz_en_default_month_post = intval($_POST['katz_en_default_month']);
    update_option('katz_en_default_month', $katz_en_default_month_post);
    $katz_en_default_day_post = intval($_POST['katz_en_default_day']);
    update_option('katz_en_default_day', $katz_en_default_day_post);
    $katz_en_default_hour_post = intval($_POST['katz_en_default_hour']);
    update_option('katz_en_default_hour', $katz_en_default_hour_post);
    $katz_en_default_minute_post = intval($_POST['katz_en_default_minute']);
    update_option('katz_en_default_minute', $katz_en_default_minute_post);
    $katz_en_default_second_post = intval($_POST['katz_en_default_second']);
    update_option('katz_en_default_second', $katz_en_default_second_post);

    $katz_en_mae_html_post = $_POST['katz_en_mae_html'];
    update_option('katz_en_mae_html', $katz_en_mae_html_post);
    $katz_en_ato_html_post = $_POST['katz_en_ato_html'];
    update_option('katz_en_ato_html', $katz_en_ato_html_post);

    $katz_en_mae_css_post = $_POST['katz_en_mae_css'];
    update_option('katz_en_mae_css', $katz_en_mae_css_post);
    $katz_en_ato_css_post = $_POST['katz_en_ato_css'];
    update_option('katz_en_ato_css', $katz_en_ato_css_post);
  }

年月日時分秒の値6つとメッセージ2つ、スタイルシート2つの計10個を登録します。

登録が終わったらすかさず呼び出す。
呼び出しはget_option関数を使います。
これも使い方は簡単で
get_option(名, デフォルト値)
だけです。
「名」にupdate_option関数でつけた「名」を入れて、テーブルにその名前に対応する「値」があればそれが返ってきます。見つからなかった場合は「デフォルト値」を返す、「デフォルト値」を指定していなかった場合はfalseが返ってくるようです。

  $katz_en_default_year = get_option('katz_en_default_year', '0');
  $katz_en_default_month = get_option('katz_en_default_month', '0');
  $katz_en_default_day = get_option('katz_en_default_day', '60');
  $katz_en_default_hour = get_option('katz_en_default_hour', '0');
  $katz_en_default_minute = get_option('katz_en_default_minute', '0');
  $katz_en_default_second = get_option('katz_en_default_second', '0');
  $katz_en_mae_html = get_option('katz_en_mae_html', 'このページは **/**/** **:**:** まで有効です。');
  $katz_en_ato_html = get_option('katz_en_ato_html', 'このページの有効掲載期限は **/**/** **:**:** までです。<br />記載されていることの正確性を確認ねがいます。');
  $katz_en_mae_css = get_option('katz_en_mae_css', "text-align: right;
border-bottom: solid 1px #7aaeff;
background: #f2faff;
color: #454742;
line-height: 18px;
font-size: 0.8em;
margin-top: -8px;
margin-bottom: 14px;
padding: 0px 1em 0px 1em;");
  $katz_en_ato_css = get_option('katz_en_ato_css', "text-align: center;
border: solid 1px #ff0000;
background: #ffe1ff;
color: #222222;
line-height: 18px;
margin-bottom: 18px;
padding: 1.5em;");

こんなカンジで呼び出してみる。5.管理画面のHTMLを作る で書いたvalueをデフォルト値として再度指定しておく。
こうすればこの管理画面に初めてアクセスした時にデフォルト値としてそれぞれの項目に値を入れておける。
スタイルシートはちょっと細かく書いてみた。

せっかく値を取得したのだから、取得した値をHTMLの中に反映させたい。
それぞれの値が入る部分を

<?=$katz_en_default_year; ?>

こんなカンジで置き換える。

ここまでやってできたのがコレ。

<?php
/*
Plugin Name: Expiration Notice
Plugin URI: http://katzplus.com/
Description: 最終更新日から一定期間経過した記事に対して、指定日数以上経過していることを表示します。
Author: katz
Version: 0.1
Author URI: http://katzplus.com/
*/

// 実際のショートコード用のソースここから
add_shortcode('exp_notice', 'expNoticeAdd');
function expNoticeAdd($param) {
  extract(
    shortcode_atts(
      array( 'y' => '0'
            ,'m' => '0'
            ,'d' => '0'
            ,'h' => '0'
            ,'i' => '0'
            ,'s' => '0'
      )
      , $param
    )
  );
  $ret = "HOE ".$y.$m.$d.$h.$i.$s." HOE";
  return $ret;
}
// 実際のショートコード用のソースここまで

// 管理画面用のソースここから
add_action('admin_menu', 'expNoticeAdmin');
function expNoticeAdmin() {
# add_submenu_page('options-general.php', 'Expire Notice Configure', 'Expire Notice', '0', __FILE__, 'expNoticeAdminPage');
 add_options_page('Expiration Notice Configure', 'Expiration Notice', '0', __FILE__, 'expNoticeAdminPage');
}
function expNoticeAdminPage () {
  if ($_POST['action'] == "update") {
    $katz_en_default_year_post = intval($_POST['katz_en_default_year']);
    update_option('katz_en_default_year', $katz_en_default_year_post);
    $katz_en_default_month_post = intval($_POST['katz_en_default_month']);
    update_option('katz_en_default_month', $katz_en_default_month_post);
    $katz_en_default_day_post = intval($_POST['katz_en_default_day']);
    update_option('katz_en_default_day', $katz_en_default_day_post);
    $katz_en_default_hour_post = intval($_POST['katz_en_default_hour']);
    update_option('katz_en_default_hour', $katz_en_default_hour_post);
    $katz_en_default_minute_post = intval($_POST['katz_en_default_minute']);
    update_option('katz_en_default_minute', $katz_en_default_minute_post);
    $katz_en_default_second_post = intval($_POST['katz_en_default_second']);
    update_option('katz_en_default_second', $katz_en_default_second_post);

    $katz_en_mae_html_post = $_POST['katz_en_mae_html'];
    update_option('katz_en_mae_html', $katz_en_mae_html_post);
    $katz_en_ato_html_post = $_POST['katz_en_ato_html'];
    update_option('katz_en_ato_html', $katz_en_ato_html_post);

    $katz_en_mae_css_post = $_POST['katz_en_mae_css'];
    update_option('katz_en_mae_css', $katz_en_mae_css_post);
    $katz_en_ato_css_post = $_POST['katz_en_ato_css'];
    update_option('katz_en_ato_css', $katz_en_ato_css_post);
  }
  $katz_en_default_year = get_option('katz_en_default_year', '0');
  $katz_en_default_month = get_option('katz_en_default_month', '0');
  $katz_en_default_day = get_option('katz_en_default_day', '60');
  $katz_en_default_hour = get_option('katz_en_default_hour', '0');
  $katz_en_default_minute = get_option('katz_en_default_minute', '0');
  $katz_en_default_second = get_option('katz_en_default_second', '0');
  $katz_en_mae_html = get_option('katz_en_mae_html', 'このページは **/**/** **:**:** まで有効です。');
  $katz_en_ato_html = get_option('katz_en_ato_html', 'このページの有効掲載期限は **/**/** **:**:** までです。<br />記載されていることの正確性を確認ねがいます。');
  $katz_en_mae_css = get_option('katz_en_mae_css', "text-align: right;
border-bottom: solid 1px #7aaeff;
background: #f2faff;
color: #454742;
line-height: 18px;
font-size: 0.8em;
margin-top: -8px;
margin-bottom: 14px;
padding: 0px 1em 0px 1em;");
  $katz_en_ato_css = get_option('katz_en_ato_css', "text-align: center;
border: solid 1px #ff0000;
background: #ffe1ff;
color: #222222;
line-height: 18px;
margin-bottom: 18px;
padding: 1.5em;");
?>
 <div class="wrap">
  <div id="icon-options-general" class="icon32">
   <br>
  </div>
  <h2>Expiration Notice Configure</h2>
  <form method="post" action="<?= str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>">
<?php wp_nonce_field('update-options'); ?>

  <h3>デフォルトの有効期日</h3>
   <table class="form-table" style="width: 480px;">
    <tr>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_year" value="<?=$katz_en_default_year; ?>" style="text-align:right;" />年</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_month" value="<?=$katz_en_default_month; ?>" style="text-align:right;" />月</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_day" value="<?=$katz_en_default_day; ?>" style="text-align:right;" />日</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_hour" value="<?=$katz_en_default_hour; ?>" style="text-align:right;" />時</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_minute" value="<?=$katz_en_default_minute; ?>" style="text-align:right;" />分</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_second" value="<?=$katz_en_default_second; ?>" style="text-align:right;" />秒</td>
    </tr>
   </table>
   <p>ショートコードに有効期日を指定しなかった場合、ここで指定した期日が使用されます。</p>

  <h3>表示するメッセージ</h3>
   <h4>有効期日前メッセージ</h4>
    <textarea name="katz_en_mae_html" cols="90" rows="2"><?=$katz_en_mae_html; ?></textarea>
   <h4>有効期日経過後メッセージ</h4>
    <textarea name="katz_en_ato_html" cols="90" rows="2"><?=$katz_en_ato_html; ?></textarea>
   <p>下記の置き換えパターンが使用できます。</p>
   <table width="300px">
    <tr>
     <th>有効期限</th>
     <td>%target_date%</td>
    </tr>
    <tr>
     <th>最終更新日時</th>
     <td>%modified_date%</td>
    </tr>
    <tr>
     <th>超過日時</th>
     <td>%overtime%</td>
    </tr>
    <tr>
     <th>残存日時</th>
     <td>%timeleft%</td>
    </tr>
   </table>

  <h3>メッセージのスタイルシート</h3>
   <h4>有効期日前メッセージのスタイルシート</h4>
    <textarea name="katz_en_mae_css" cols="90" rows="2"><?=$katz_en_mae_css; ?></textarea>
   <h4>有効期日経過後メッセージのスタイルシート</h4>
    <textarea name="katz_en_ato_css" cols="90" rows="2"><?=$katz_en_ato_css; ?></textarea>
   <p>スタイルシートを独自のものに変更することができます。</p>

   <input type="hidden" name="action" value="update" />
   <input type="hidden" name="page_options" value="new_option_name,some_other_option,option_etc" />

   <p class="submit">
    <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
   </p>
  </form>
 </div>
<?php
}
// 管理画面用のソースここまで
?>

うむ。設定値の登録&呼び出しできた。

Next is [7.設定値をショートコードに反映させる]

5.管理画面のHTMLを作る

この記事は 4.管理画面を作ってみる の続きです。

とりあえず、管理画面のデザインを他のものと揃えるためにちょっとした決まりがあるみたい。
設定ページの作成にその旨記載があるので、まずはこのとおりに進めてみる。
自作部分のexpNoticeAdminPage関数に管理画面のHTMLをそのまま書いているので、ここを修正していく。

 <div class="wrap">
  <div id="icon-options-general" class="icon32">
   <br>
  </div>
  <h2>Expiration Notice Configure</h2>

この頭の5行はこのままで問題無し。
次の

  <div>
   管理画面だよ
  </div>

部分を改変していく。

  <form method="post" action="options.php">
<?php wp_nonce_field('update-options'); ?>

  <h3>デフォルトの有効期日</h3>
   <table class="form-table" style="width: 480px;">
    <tr>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_year" value="0" style="text-align:right;" />年</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_month" value="0" style="text-align:right;" />月</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_day" value="0" style="text-align:right;" />日</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_hour" value="0" style="text-align:right;" />時</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_minute" value="0" style="text-align:right;" />分</td>
     <td style="width: 80px;"><input type="text" size="2" name="katz_en_default_second" value="0" style="text-align:right;" />秒</td>
    </tr>
   </table>
   <p>ショートコードに有効期日を指定しなかった場合、ここで指定した期日が使用されます。</p>

  <h3>表示するメッセージ</h3>
   <h4>有効期日前メッセージ</h4>
    <textarea name="katz_en_mae_html" cols="90" rows="2">このページは **/**/** **:**:** まで有効です。</textarea>
   <h4>有効期日経過後メッセージ</h4>
    <textarea name="katz_en_ato_html" cols="90" rows="2">このページの有効掲載期限は **/**/** **:**:** までです。<br />記載されていることの正確性を確認ねがいます。</textarea>
   <p>下記の置き換えパターンが使用できます。</p>
   <table width="300px">
    <tr>
     <th>有効期限</th>
     <td>%target_date%</td>
    </tr>
    <tr>
     <th>最終更新日時</th>
     <td>%modified_date%</td>
    </tr>
    <tr>
     <th>超過日時</th>
     <td>%overtime%</td>
    </tr>
    <tr>
     <th>残存日時</th>
     <td>%timeleft%</td>
    </tr>
   </table>

  <h3>メッセージのスタイルシート</h3>
   <h4>有効期日前メッセージのスタイルシート</h4>
    <textarea name="katz_en_mae_css" cols="90" rows="2">background-color: #d0f0ff;</textarea>
   <h4>有効期日経過後メッセージのスタイルシート</h4>
    <textarea name="katz_en_ato_css" cols="90" rows="2">background-color: #ffe1ff;</textarea>
   <p>スタイルシートを独自のものに変更することができます。</p>

   <input type="hidden" name="action" value="update" />
   <input type="hidden" name="page_options" value="new_option_name,some_other_option,option_etc" />

   <p class="submit">
    <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
   </p>
  </form>

こんなカンジかなぁ?
実際に表示させてみる…

将来的な希望も入り交じっているけどまあ、とりあえずはコレで。

Next is [6.設定値をDBに格納する]

4.管理画面を作ってみる

この記事は 3.引数を使えるようにする の続きです。
プラグインなんだから、ちょっとは色々なことをしたい。
そのために管理画面を作ってみる。

add_action('admin_menu', 'expNoticeAdmin');
function expNoticeAdmin() {
 add_options_page('Expiration Notice Configure', 'Expiration Notice', '0', __FILE__, 'expNoticeAdminPage');
}
function expNoticeAdminPage () {
?>
 <div class="wrap">
  <div id="icon-options-general" class="icon32">
   <br>
  </div>
  <h2>Expiration Notice Configure</h2>
  <div>
   管理画面だよ
  </div>
 </div>
<?php
}
?>

add_action関数は前に出てきたadd_shortcode関数と似たようなもの。
第1パラメータに呼び出される場所、第2パラメータに呼び出す関数を指定する。
add_options_page関数は設定メニューのサブメニューとして呼び出す、ということ。

add_options_page(titleタグに入る文字列, サブメニューに表示される名前, アクセスレベル, メニューページのコンテンツがあるファイル名, 呼び出す関数)

ってカンジらしい。
こんなのを追加して以下のようにしてみる。

<?php
/*
Plugin Name: Expiration Notice
Plugin URI: http://katzplus.com/
Description: 最終更新日から一定期間経過した記事に対して、指定日数以上経過していることを表示します。
Author: katz
Version: 0.1
Author URI: http://katzplus.com/
*/

// 実際のショートコード用のソースここから
add_shortcode('exp_notice', 'expNoticeAdd');
function expNoticeAdd($param) {
  extract(
    shortcode_atts(
      array( 'y' => '0'
            ,'m' => '0'
            ,'d' => '0'
            ,'h' => '0'
            ,'i' => '0'
            ,'s' => '0'
      )
      , $param
    )
  );
  $ret = "HOE ".$y.$m.$d.$h.$i.$s." HOE";
  return $ret;
}
// 実際のショートコード用のソースここまで

// 管理画面用のソースここから
add_action('admin_menu', 'expNoticeAdmin');
function expNoticeAdmin() {
 add_options_page('Expiration Notice Configure', 'Expiration Notice', '0', __FILE__, 'expNoticeAdminPage');
}
function expNoticeAdminPage () {
?>
 <div class="wrap">
  <div id="icon-options-general" class="icon32">
   <br>
  </div>
  <h2>Expiration Notice Configure</h2>
  <div>
   管理画面だよ
  </div>
 </div>
<?php
}
// 管理画面用のソースここまで
?>

これで改めて管理画面の設定メニューを覗いてみると

おーメニューができてるー
クリックしてみると…

ほっほー一応管理画面?

Next is [5.管理画面のHTMLを作る]

3.引数を使えるようにする

この記事は 2.とりあえず動くようにしてみる の続きです。
現状だとあまりにあれなので、引数を使えるようにする。

今までのコードは

add_shortcode('exp_notice', 'expNoticeAdd');
function expNoticeAdd($param) {
  $ret = "HOEHOE";
  return $ret;
}

$paramをせっかくつけているのでここに何か値が来た時にしっかり受け取れるようにする。
$ret = “HOEHOE”;
の部分を以下のように書き換える。

  extract(
    shortcode_atts(
      array( 'y' => '0'
            ,'m' => '0'
            ,'d' => '0'
            ,'h' => '0'
            ,'i' => '0'
            ,'s' => '0'
      )
      , $param
    )
  );
  $ret = "HOE ".$y.$m.$d.$h.$i.$s." HOE";
}

shortcode_atts という関数があるのでそれを使う。
第1パラメータにデフォルト値、第2パラメータに実際に取り込まれた引数を指定する。第1パラメータで指定されなかったものについては第2パラメータに存在しても無視されるとのこと。
とりあえず、年月日時分秒をymdhisで指定してみる。

結果が
[ exp_notice ] → 「HOE 000000 HOE」指定がないので全てデフォルトの値が入る
[ exp_notice d=5 ] → 「HOE 005000 HOE」指定があるのでその部分は指定値、その他はデフォルト値が入る
[ exp_notice y=1 m=2 d=3 h=4 i=5 s=6 ] → 「HOE 123456 HOE」全部に指定があればその値が入る
[ exp_notice y=1 moge=100 ] → 「HOE 100000 HOE」変な値が来ても無視される
とかになれば成功。

Next is [4.管理画面を作ってみる]

2.とりあえず動くようにしてみる

この記事は 1.フォルダとファイルを作る の続きです。
1で作った expirationNotice.php に以下の文面を足す。

add_shortcode('exp_notice', 'expNoticeAdd');
function expNoticeAdd($param) {
  $ret = "HOEHOE";
  return $ret;
}

これだけで[ exp_notice ]ってショートコードが全部「HOEHOE」に変換されるプラグイン完成!
ここでadd_shortcodeという関数を使います。
これは第1パラメータに実際のショートコードタグ、第2パラメータに呼ばれる関数名を書けばいいらしい。

[ exp_notice ] → 「HOEHOE」

ってなれば今のところOK。

Next is [3.引数を使えるようにする]

1.フォルダとファイルを作る

とりあえずはプラグインを入れるフォルダとファイルを作る。
\wp-content\plugins
の中に
expiration-notice
というフォルダを作成。
このフォルダの中に
expirationNotice.php
という空のファイルを作成。
で、このファイルに以下の文面を書き足す。

<?php
/*
Plugin Name: Expiration Notice
Plugin URI: http://katzplus.com/
Description: 最終更新日から一定期間経過した記事に対して、指定日数以上経過していることを表示します。
Author: katz
Version: 0.1
Author URI: http://katzplus.com/
*/

とりあえずはコレで第1段階終了。
この段階で管理ページからインストール済みプラグインメニューを覗いてみると

こんなカンジで認識された。
とりあえず有効化しておこう…

Next is [2.とりあえず動くようにしてみる]

making plugin

カスタマイズしてるとバージョンアップの時にすべてが消えるのでプラグイン化してみる。
作ってみるのはカスタムのショートコードを使えるようにするプラグイン。

Last modified items Widget

Last modified items Widget
これでどのページが更新されたのか出していくことができる。
メモ書きだから、一度書いたら終わりじゃなくてチマチマ更新していく事が多いので、公開日よりも更新日のほうがイイ。

難点は更新日でしか検索・ソートしないので公開しただけだとこのwidgetには表示されないってことかな。

Better Related Posts

Better Related Posts
ちょっとめんどくさいけどコレがいいような気がする。
これで固定ページの関連ページを個別記事の下部に出すことができます。
Related ItemsRelated Posts for WordPressあたりは手動で関連ページをリストアップしなくてはならなかったり、Yet Another Related Posts Pluginは投稿には対応しているけれども固定ページには対応していなかったりで、なかなか…
いいかも?と思ったELI’s Related Posts Footer Links and Widgetもスコアリングの基準が全くわからなくてイマイチ信憑性に欠けたし。

そんなこんなでたどり着いたのがBetter Related Postsです。
ちょっとめんどくさい部分は、現状だとテーマを自分で編集してRelated Postsを表示する部分にタグを入れなくてはいけない、ということ。
でもそんなに難しいことではないのでやってしまいます。

外観→テーマ編集から
固定ページテンプレート (page.php)や単一記事の投稿 (single.php)の

<?php while ( have_posts() ) : the_post(); ?>
<?php endwhile; ?>

ループが終わる終盤に

<?php the_related(); ?>

を足すだけです。

<?php while ( have_posts() ) : the_post(); ?>
・・・
・・・
・・・
<?php the_related(); ?>
<?php endwhile; ?>

こんなカンジで。

おお、なんか関連が強そうなページが出たぁ!
ちょっと安心できました。

ELI’s Related Posts Footer Links and Widget

ELI’s Related Posts Footer Links and Widget
これで固定ページの関連ページを個別記事の下部に出すことができます。
Related ItemsRelated Posts for WordPressあたりは手動で関連ページをリストアップしなくてはならなかったり、Yet Another Related Posts Pluginは投稿には対応しているけれども固定ページには対応していなかったりで、なかなか…
コレはどういったアルゴリズムで関連性を見出しているのかちょっと不安が残ります…
同じタグのものを優先的に表示してるのかと思いきや、必ずしもそうではないらしい…

よくわからないなーと思っていたところでBetter Related Postsを見つけてしまったのでそちらに移行することにします。

Dave’s WordPress Live Search

Dave’s WordPress Live Search
これでインクリメンタルサーチがWordpressに実装できます。

  • 検索結果の表示件数
  • 何文字入力されるまで待つか
  • メタデータ、サムネイル、抜粋の表示・非表示

なんかも選択できるので現状では必要十分な検索窓強化です。
唯一の難点は、検索結果が0件だった時になにも表示せずに終わってしまうことぐらいかな。
「0件だったよ」くらい言ってくれれば良いと思うの。

Advanced Most Recent Posts Mod

Advanced Most Recent Posts Mod
これで「最近の固定ページ」が実現できる。
なぜデフォルトの Widget には「最近の投稿」と「最近のコメント」があって「最近の固定ページ」がないんだろう。固定だからかw