WordPressで、登録したユーザに
細かく閲覧権限を与えることができるプラグインの機能を使用して
記事の閲覧制限を行いたく、コードを作成いたしました。
プラグインはWishListMemberというプラグインです。
このプラグインを使用すると、例えば、
ユーザA
- 閲覧レベル1
- 閲覧レベル2
ユーザB
- 閲覧レベル2
- 閲覧レベル3
ユーザC
- 閲覧レベル3
- 閲覧レベル4
といったようにユーザ毎にレベルを設定できます。
また記事毎にもレベルが設定できます。
「閲覧レベル1」を持った記事は、
「閲覧レベル1」を持った「ユーザA」しか見ることができません。
同じように、
「閲覧レベル2」を持った記事は、
「閲覧レベル2」を持った「ユーザA」と「ユーザB」しか見ることができません。
しかし、このプラグインでは、
記事の閲覧制限はできますが、
記事が見れないユーザにも一覧表示されてしまうのです。
ややこしくて大変申し訳ないです…。
ここまでが前提条件です。
そこで、直接DBにアクセスし、
ユーザレベルと記事に設定されたレベルが一致した記事のみを一覧表示するようなコードを、
PHP初心者ながらに四苦八苦しながら何とか作成し、
無事に思った通りの結果を得ることができました。
が、問題はここからで、
このテーマを設置したさくらサーバで
503エラーが頻発するようになってしまいました。
(さくらのリソース情報によると、一番多いときで約10万回/1日です)
もしかしたらサーバやプランを変えることで解決できるのかもしれません。
さくらサーバにも現在問い合わせている状況です。
しかし素人が作ったプログラムのせいで、
エラー処理などが甘く、サーバに多大な負荷をかけている可能性が高いと思い、
みなさまのお力をお借りすることができればと考えております。
以下が実際に作成したコードです(名前などは変更してあります)。
post_contentlevelsには記事のレベルが、
user_userlevelsにはユーザに設定されたレベルが入っております。
拙いプログラムで大変恐縮ではございますが、
負荷を軽減するアドバイスや、
正しいエラー処理などを教えていただけると幸いです。
どうかよろしくお願い致します!!
lang
1<?php 2 3//データベース情報読み込み 4include( get_bloginfo('url').'/wp-config.php'); 5 6//データベース情報代入 7$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8'; //ホストとデータベース名 8$user = DB_USER; //ユーザ名 9$password = DB_PASSWORD; //パスワード 10 11//データベース接続 12try { 13 $dbh = new PDO($dsn,$user,$password); 14} catch(PDOException $e) { 15 var_dump($e->getMessage()); 16 exit; 17} 18 19//ユーザ情報取得 20$wpm_current_user = wp_get_current_user(); 21 22//ユーザレベル代入 23$user_id = $wpm_current_user->ID; 24 25//管理者以外の場合に実行する処理 26if ($user_id != 1) { 27 $sql = "SELECT `content_id` FROM `post_contentlevels` JOIN `user_userlevels` ON `post_contentlevels`.level_id=`user_userlevels`.level_id WHERE `user_userlevels`.user_id=$user_id"; 28 //クエリ発行、メンバーレベル識別子の取得 29 $stmt = $dbh->query($sql); 30 //データの数を数える 31 $count = $dbh->query($sql)->fetchColumn(); 32 //データが存在するときに実行する処理 33 if ( $count > 0 ) { 34 //変数宣言 35 $i = 0; 36 $post_pre = array(); 37 $num = 1; 38 //配列の数だけループ 39 foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $content_id) { 40 //記事IDから記事情報取得,配列として$postへ代入 41 $post = get_post($content_id['content_id'], "ARRAY_A"); 42 $post_pre[$i] = $post; 43 $i++; 44 } 45 46 //投稿日時でソート 47 foreach($post_pre as $key=>$value){ 48 $date[$key]=$value['post_date']; 49 } 50 51 //ソート 52 array_multisort($date,SORT_ASC,SORT_NATURAL,$post_pre); //昇順 53 54 //記事を表示するループ 55 for($n = 0; $i > 0; $i--){ 56 //記事IDからカテゴリIDを取得 57 foreach( (get_the_category( $post_pre[$n]['ID'] ) ) as $obj) 58 { 59 $cat_id = $obj->category_parent; 60 if( strcmp($cat_id,'0')==0 ) { 61 $cat_id = $obj->cat_ID; 62 } 63 } 64 //現在のカテゴリと一致し、かつ公開設定の投稿記事だけ表示 65 if($cat_id == $cat && $post_pre[$n]['post_status'] == 'publish' && $post_pre[$n]['post_type'] == 'post'){ 66 ?> 67 <div class="*****"> 68 <a href="<?php echo($catSlug);echo'/';echo($post_pre[$n]['ID']); ?>"> 69 <h2><?php echo($post_pre[$n]['post_title']); ?></h2> 70 </a> 71 </div> 72 <?php 73 } //if($cat_id == $cat && $post_pre[$n]['post_status'] == 'publish' && $post_pre[$n]['post_type'] == 'post') 74 $n++; 75 } //for($n = 0; $i > 0; $i--) 76 } //if ( $count > 0 ) 77 78 //記事IDがない場合に実行する処理 79 else { 80 echo "<p>表示可能な記事がありません</p>"; 81 } 82} //if ($user_id != 1) 83 84//管理者の場合に実行する処理 85else { 86 if(is_archive()) : query_posts($query_string.'&order=ASC'); endif; 87 if (have_posts()): 88 while (have_posts()): 89 the_post(); 90 get_template_part('content-archive'); 91 endwhile; 92 endif; 93} 94 95//データベース切断 96$dbh = null;
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/19 01:59
2015/05/19 08:57
2015/05/19 15:11
2015/05/19 15:25