「Role Scoper」でカテゴリ単位で管理権限を設定する方法

<要件>

  1. 登録ユーザーをグループ分けして、それぞれに投稿できるカテゴリと投稿できないカテゴリを設定する。<例>本社、○○支店、△△支店….とか。mac記事、windows記事….とか。
  2. 各ユーザーの新規投稿画面には、投稿できないカテゴリを表示しない。

<前提>

  1. 登録ユーザーは「寄稿者」の管理権限を付与(うちのシステムではね。必ず寄稿者である必要はない)
  2. 新規登録時、必ず権限グループを選択する。

<前準備>

すでに色々設定しまった場合は、まずデフォルトに戻しましょう。
ただし、デフォルトに戻した後でも、僕の場合カテゴリー設定などはそのまま設定が残ってしまっていたので、地道に「remove」などを繰り返して設定を消していきました。

<投稿以外を対象外にする> ※追記分
まずは権限設定の概念(というか考え方)だが、このプラグインの場合、一旦すべての投稿にロックをかける。
そして、その後の設定で一つずつロックを解除していくという手法をとる。
なので、この段階では、一度すべての投稿にロックをかける。

  1. 「Role」→「General」のページを開く
  2. 「1. Select Assignment Mode」の項目を「Assign」にする。
  3. 「2. Select Users or Groups to Modify」で「WP Contributor」をチェック
  4. 「Modify role assignments for 固定ページ」で「Page Associate」にチェック
  5. 「Modify role assignments for Nav Menu Manager」で「Nav Menu Manager」にチェック
  6. 「Modify role assignments for Groups」で「Group Applicant」にチェック
  7. ページ右上にある「update」をクリック

これで、投稿・固定ページなど、すべてにロックがかかったと思う。
ためしに「寄稿者」権限のユーザーでログインして、新規投稿ページを開いてみる。
もしカテゴリー枠に何も表示されていなければ、ロックがかかっていることになる。

では、次にユーザーを「グループ」に振り分ける。
つまり、A、B、Cというユーザーがいて、AとBは天才グループ、Cを秀才グループに分類する。
そして、天才カテゴリーにはAとBしか書き込めないようにする。秀才グループはCのみ書き込み可能とする。

<権限グループの設定方法>

  1. サイドメニュー→「ユーザー」→「Role Groups」を選択。
  2. 「Create New Group」フォームで、グループ名を入力。日本語も使用できた。必要があれば説明文も入力する。
  3. フォームの右側にある「create」をクリックすれば、権限グループが追加される。

<権限グループの付与方法>

  1. サイドメニュー→「ユーザー」→「ユーザー一覧」→該当ユーザーのプロフィールを選択
  2. User GroupsフォームでSearch for Groupから該当グループを探す。グループが少ない場合は、そのまま「Search」ボタンを押せば、登録済みのグループがリストアップされる。
  3. 該当するグループを選択して「Add>」ボタンを押す。

以上。

では、最後に「書き込みをOKするカテゴリーを開放する」設定を行う。

<設定方法>

  1. サイドメニュー→「Roles」→「カテゴリー」を選択。
  2. 「1. Select Assignment Mode」で「Assign for selected and sub-category」を選択。これで、選択したカテゴリーとその下位階層に設定が適用されます。
  3. 「2. Select Uesr or Groups To Modify」で対象グループもしくはユーザーを選択します。
  4. 「4. select Roles To Assign/Remove」で、投稿を許可するカテゴリの「Post Auther」を選択する。別にAutherでなくてもよいが、権限が低いと記事を公開できなくなる場合もあるらしい。
  5. ページ上部右端の「update」を選択する。しかし、なんで上にしか「update」がないんだ。カテゴリ多いと面倒くさいぞ。

終わり。画像なくてすみません。

【Contact Form 7】確認用メールアドレスとメールチェック

参考サイト:Contact Form 7で確認用メールアドレスの入力フォームを加える方法(こぶたのラッパ)

(1)テンプレートのfunction.phpに下記を追加

<?php
add_filter( 'wpcf7_validate_email', 'wpcf7_text_validation_filter_extend', 11, 2 );
add_filter( 'wpcf7_validate_email*', 'wpcf7_text_validation_filter_extend', 11, 2 );
function wpcf7_text_validation_filter_extend( $result, $tag ) {
$type = $tag['type'];
$name = $tag['name'];
$_POST[$name] = trim( strtr( (string) $_POST[$name], "n", " " ) );
if ( 'email' == $type || 'email*' == $type ) {
if (preg_match('/(.*)_confirm$/', $name, $matches)){
$target_name = $matches[1];
if ($_POST[$name] != $_POST[$target_name]) {
$result['valid'] = false;
$result['reason'][$name] = '確認用のメールアドレスが一致していません';
}
}
}
return $result;
}
?>

(2)contactform7の設定画面に、下記フォームを追加

<p>メールアドレス<br />
[email* your-email] </p>

<p>メールアドレス (確認用)<br />
[email* your-email_confirm] </p>

以上。今からテストする。

アイキャッチ画像のパラメータ取得

最初に使ったのがこれ。

the_post_thumbnail()

でも、これだとimgタグごと吐き出す。
こっちはaタグにファイルパスを入れたいだけなのに、余計なことしやがる(いや、本当は大変ありがたいんだけどね)

そこで、

$image_data = wp_get_attachment_image_src($id, ‘thumbnail’ );

これを使ってアイキャッチ関係の情報を取得するのだ。

「$id」は投稿ID。表示ループの中であれば、the_ID();で取得できる。
‘thumbnail’はアイキャッチ用の引数。

これで、$image_dataには、該当する投稿のアイキャッチ画像に関するデータが、配列として格納される。

継承先クラスにコンストラクタを作るときの注意

こんなことをしてしまうと、継承元のコンストラクタが無効になってしまうので注意。
どうしても継承先でコンストラクタを使用したい場合は、
明示的に継承元のコンストラクタを起動する。

例えば継承元のコンストラクタが「Database」という名前で、継承先のコンストラクタが「Database2」だった場合は、以下のようにする。ちなみに、この仕様はPHP4のものを前提にしているが、PHP5でも有効に動く。ただし、PHP5純正の方式では、コンストラクタの命名方法が異なるらしい(調べてない)。

function Database2($option) {

  parent::Database($option);

}

これでOK。引数を橋渡ししたい場合も、すでにDatabase2では取得しているはずなので、そのまま引き渡せば大丈夫。

autoloadのスクリプトをhtaccessでロード

PHPでクラスを使う場合、クラス・ファイルをいちいちrequireしないといけないわけで、それをスクリプトに書き忘れると、PHPに怒られるわけ。
でも、わしって時々ファイル名を変えたくなる衝動に駆られるもんで、
その度にrequireしているファイル名を修正するのが面倒になる。
一つのファイルにまとめてrequire記述して、そのファイルを読みこめばいいじゃんってご意見もあるだろうが、それだと、全部のクラスをロードすることになって、あるスクリプトでは使うけど、こっちでは使わないって場合、すごく無駄なロードをするはめになるわけだ。

そこで、クラスのrequireを一切しないですむ方法が、auto_prepend_fileってわけです。

まずは下記のfunctionを記述したPHPファイルを作る。この場合のファイル名はなんでも良い。
ここでは便宜上「autoloder.php」としておく。
ただし、クラスファイルのファイル名には、クラス名を含ませておく必要がある。
$className という関数は、読み込んでいないクラス名が自動で取得されるが、
そのクラス名を元に読み込むファイルを紐付ける必要があるためだ。
例えば、「Database」というクラスを自動読み込みの場合は、
「/your/root/path内にあるDatabase.class.phpをrequireする」という動作をする。

function __autoload($className) {

  $class_path = "/your/root/path/";
  $fileName = $class_path . $className . '.class.php';
  if (is_file($fileName)) {
    require $fileName;
  }else{
    #ロードできない場合のエラー表示
    echo "[unloded]" , $fileName;
  }
}

次に.htaccessに下記のコマンドを記述します。

ファイル名の部分に、上記で作成したファイルの名前を記述。

<IfModule mod_php5.c>
  php_value auto_prepend_file "ファイル名"
</IfModule>

こうすることにより、php実行時に、そのスクリプトで利用するクラスがロードされていない時は、

自動でそのクラスを読み込んでくれるはず。