WordPress 4.7から「post_password_required」というアクションフィルターが追加されました。これを使って 1つしか設定できなかった パスワード保護ページの 投稿パスワードを複数登録して使えるようにできそうです。
WordPressでは 投稿にパスワードを設定すると 投稿ページは内容は表示されずに パスワード入力フォームが出てきます。
パスワードを入力して「確定(送信)」すると パスワードはwp-login.phpへ送られ クッキーに保存されてから投稿ページに戻され(リダイレクト)ます。
投稿ページでは クッキーのパスワードを照合して、合っていれば 投稿内容を表示します。
ここでは照合の中にある「post_password_required」フィルターを使って 投稿別にパスワードを複数登録して照合する簡易版を作りました。
以下の「追加照合用コード」と「パスワード登録・編集」を使ってみてください。
パスワード保護記事全部共通で個別の投稿パスワードを複数設定したい場合は以下の記事を参考にしてください。
「WordPress パスワード保護ページの 投稿パスワード を「全記事共通」で複数使えるようにする」
追加照合用コード
投稿の編集画面 で、設定したパスワードで照合するようにしています。
また期限チェックも追加しています。パスワードが合っていても期限が過ぎていたらNGになります。
カスタムフィールドのパスワードで照合する
以下のコードを my-plugin.php に張り付けてみてください。
/** * カスタムフィールドのパスワードで認証する * Filters whether a post requires the user to supply a password. * * @since WordPress 4.7.0 * post-template.php * * @param bool $required Whether the user needs to supply a password. True if password has not been * provided or is incorrect, false if password has been supplied or is not required. * @param WP_Post $post Post data. * License: GPLv2 or later */ function nendebcom_post_password_required( $required, $post ) { if ( !$required ) { return $required; } require_once ( ABSPATH . 'wp-includes/class-phpass.php' ); // パスワードデータ読込 $multi_postpass_data = maybe_unserialize( get_post_meta( $post->ID, 'multi_postpass', true ) ); $hasher = new PasswordHash( 8, true ); // 追加照合 $hash = isset( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ? wp_unslash( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) : ''; if ( 0 !== strpos( $hash, '$P$B' ) ) { $required = true; } else { if ( !empty( $multi_postpass_data ) ) { // パスワードチェック foreach ( $multi_postpass_data as $passdata ) { if ( $hasher->CheckPassword( $passdata[ 'postpass_pass' ], $hash ) ) { //期限チェック if ( strtotime( date_i18n( "Y/m/d" ) ) <= strtotime( $passdata[ 'postpass_kigen' ] ) ) { return false; } } } } } return $required; } add_filter( 'post_password_required', 'nendebcom_post_password_required', 10, 2 );
スポンサードリンク
パスワード登録・編集
投稿ごとに パスワードを登録・編集できるフォームを追加します。
「投稿パスワード」を複数 追加できるようにするのと「期限」も登録できるようにします。
編集画面に「投稿パスワード」の項目を追加
宣言用・フォーム用・保存用 とありますのでセットで利用してください。
以下のコードを my-plugin.php に張り付けてみてください。
/** * 投稿の編集画面に「投稿パスワード」の項目を追加 * Adds a box to the main column Multi Post Password * * License: GPLv2 or later */ function nendebcom_multi_postpass_meta_box() { add_meta_box( 'nendebcom_multi_postpass_area', '個別 投稿パスワード', 'nendebcom_multi_postpass_callback', 'post', 'advanced' ); } add_action( 'add_meta_boxes', 'nendebcom_multi_postpass_meta_box' ); /** * Prints the box Multi Post Password. * * @param WP_Post $post The object for the current post/page. * License: GPLv2 or later */ function nendebcom_multi_postpass_callback( $post ) { // Add a nonce field so we can check for it later. wp_nonce_field( 'nendebcom_multi_postpass_save_meta_box_data', 'nendebcom_multi_postpass_nonce' ); // デフォルトパスワード期限 ( 今日から1カ月後の月末 ) $kijitsu = date( 'Y/m/d', strtotime( date( 'Y/m/d', strtotime( date_i18n( 'Y-m-1' ) . ' 2 month' ) ) . ' -1 day' ) ); // 投稿パスワード取得(配列) $multi_postpass_data = maybe_unserialize( get_post_meta( $post->ID, 'multi_postpass', true ) ); if ( !$multi_postpass_data ) { $multi_postpass_data = array(); }else{ //登録日でソート foreach ( $multi_postpass_data as $key => $value ){ $key_id[$key] = $value['postpass_date']; } array_multisort ( $key_id , SORT_DESC , $multi_postpass_data ); } // 登録パスワード数 $tmp_max_id = count( $multi_postpass_data ); // CSS echo '<style type="text/css">'; echo ' div#multi_postpass{max-height: 200px;overflow: auto;}'; echo ' table.multi_postpass_table tr.header{background: #f3f3f3 none repeat scroll 0 0;}'; echo ' table.multi_postpass_table th{text-align: center;}'; echo ' table.multi_postpass_table td input[type="text"]{width: 100%;}'; echo ' table.multi_postpass_table td.kigen {width:15%;}'; echo ' table.multi_postpass_table td.pass{width:30%;}'; echo ' table.multi_postpass_table td.memo{width:40%;}'; echo ' table.multi_postpass_table td.date{width:15%;text-align: center;}'; echo '</style>'; // 表示テーブル echo '<div id="multi_postpass">'; echo '<table class="multi_postpass_table">'; echo '<tr class="header">'; echo '<th>期限</th>'; echo '<th>パスワード</th>'; echo '<th>メモ</th>'; echo '<th>登録日</th>'; echo '</tr>'; //新規 echo '<tr>'; echo '<input type="hidden" name="max_id" value="' . $tmp_max_id . '">'; echo '<td class="kigen"><input type="text" name="postpass_kigen_' . $tmp_max_id . '" value="' . $kijitsu . '" size="10" autocomplete="off"></td>'; echo '<td class="pass" ><input type="text" name="postpass_pass_' . $tmp_max_id . '" value="" size="20" autocomplete="off"></td>'; echo '<td class="memo" ><input type="text" name="postpass_memo_' . $tmp_max_id . '" value="" size="60" autocomplete="off"></td>'; echo '<td class="date">新規パスワード</td>'; echo '</tr>'; //修正・削除 if ( !empty( $multi_postpass_data ) ) { $i = 0; foreach ( $multi_postpass_data as $data ) { echo '<tr>'; echo '<td class="kigen"><input type="text" name="postpass_kigen_' . $i . '" value="' . $data[ 'postpass_kigen' ] . '" size="10"></td>'; echo '<td class="pass" ><input type="text" name="postpass_pass_' . $i . '" value="' . $data[ 'postpass_pass' ] . '" size="20"></td>'; echo '<td class="memo" ><input type="text" name="postpass_memo_' . $i . '" value="' . $data[ 'postpass_memo' ] . '" size="60"></td>'; echo '<td class="date" ><input type="hidden" name="postpass_date_' . $i . '" value="' . $data[ 'postpass_date' ] . '">' . date('Y/m/d', $data[ 'postpass_date' ] ) . '</td>'; echo '</tr>'; $i++; } } echo '</table>'; echo '</div>'; echo ' ※パスワードを 空欄にして保存すると、その行は削除されます。'; } /** * When the post is saved, saves our custom data Multi Post Password. * * @param int $post_id The ID of the post being saved. * License: GPLv2 or later */ function nendebcom_multi_postpass_save_meta_box_data( $post_id ) { // Check if our nonce is set. if ( !isset( $_POST[ 'nendebcom_multi_postpass_nonce' ] ) ) { return; } // Verify that the nonce is valid. if ( !wp_verify_nonce( $_POST[ 'nendebcom_multi_postpass_nonce' ], 'nendebcom_multi_postpass_save_meta_box_data' ) ) { return; } // If this is an autosave, our form has not been submitted, so we don't want to do anything. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // Check the user's permissions. if ( isset( $_POST[ 'post_type' ] ) && 'post' == $_POST[ 'post_type' ] ) { if ( !current_user_can( 'edit_post', $post_id ) ) { return; } } else { return; } // Make sure that it is set. if ( !isset( $_POST[ 'max_id' ] ) ) { return; } // 登録パスワード数 $max_id = isset( $_POST[ 'max_id' ] ) ? $_POST[ 'max_id' ] : 0; $multi_postpass_data = array(); $j = 0; for ( $i = 0; $i <= $max_id; $i++ ) { $postpass_kigen = isset( $_POST[ 'postpass_kigen_' . $i ] ) ? sanitize_text_field( $_POST[ 'postpass_kigen_' . $i ] ) : ''; $postpass_pass = isset( $_POST[ 'postpass_pass_' . $i ] ) ? sanitize_text_field( $_POST[ 'postpass_pass_' . $i ] ) : ''; $postpass_memo = isset( $_POST[ 'postpass_memo_' . $i ] ) ? sanitize_text_field( $_POST[ 'postpass_memo_' . $i ] ) : ''; $postpass_date = isset( $_POST[ 'postpass_date_' . $i ] ) ? sanitize_text_field( $_POST[ 'postpass_date_' . $i ] ) : current_time( 'timestamp' ); // Postpass Max255文字 $postpass_pass = substr( $postpass_pass, 0, 255 ); if ( $postpass_pass ) { $multi_postpass_data[ $j ][ 'postpass_kigen' ] = $postpass_kigen; $multi_postpass_data[ $j ][ 'postpass_pass' ] = $postpass_pass; $multi_postpass_data[ $j ][ 'postpass_memo' ] = $postpass_memo; $multi_postpass_data[ $j ][ 'postpass_date' ] = $postpass_date; $j++; } } // Update the meta field in the database. update_post_meta( $post_id, 'multi_postpass', $multi_postpass_data ); } add_action( 'save_post', 'nendebcom_multi_postpass_save_meta_box_data' );
※投稿パスワードフォームのいちばん上の行が新規登録用になります。
※消したいパスワードがある場合、該当のパスワードを 空欄にして保存すると、その行は削除されます。
※デフォルトパスワード期限は使う用途で変更してください。
※WordPressの標準の投稿パスワード設定は必要です。これをしないと パスワード保護機能自体 動作しません。
あとがき
ここまで出来たら、運用しだいでいろいろなケースに対応できそうです。
また、WordPressの標準の投稿パスワードは、全て同じパスワードをいれて、スーパーユーザー用とか確認用とかに使ったらどうでしょうか?
こんな場合の全て同じパスワードを簡単に設定できる方法はこちらにあります。
「パスワード保護ページの 投稿パスワード を 一括編集できるようにする」
パスワード保護記事全部共通で個別の投稿パスワードを複数設定したい場合は以下の記事を参考にしてください。
「WordPress パスワード保護ページの 投稿パスワード を「全記事共通」で複数使えるようにする」
あまりパスワード数が多くなると、使いにくくなりますので 実用的に変更しないといけません。
追加用の投稿パスワード情報は投稿ごとに 1つのカスタムフィールドにまとめて入るようにしてます。
もしかしたら パスワード情報を 新しい別のテーブルに持たせるようにした方が安心かもしれません。
参考
post_password_required | Hook | WordPress Developer Resources
https://developer.wordpress.org/reference/hooks/post_password_required/
関数リファレンス/add meta box – WordPress Codex 日本語版
http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_meta_box