• 解決済 hazudog

    (@hazudog)


    【構成】
    3名のユーザーがいて、それぞれのユーザが閲覧できるディレクトリを制限しているサイトを作っています。振り分けはユーザーレベルによって分岐しています。
    A(ユーザーレベル0)というユーザーはwww.example.com/A/というディレクトリー以下のみを閲覧でき、
    B(ユーザーレベル1)というユーザーはwww.example.com/B/というディレクトリー以下のみ閲覧できるという構成です。
    それぞれの2ディレクトリにはグローバルナビを配置していて、
    それぞれにディレクトリがいくつかあります。
    また、C(ユーザーレベル6)というスーパーユーザーが一人いて、
    唯一それぞれのディレクトリを閲覧できるようにしています。

    【解決できないこと】
    スーパーユーザーが例えば、
    http://www.example.com/A/にアクセスした時に、
    グローバルメニューをAのディレクトリのグローバルナビを読み込み、
    http://www.example.com/B/にアクセスした時に、
    グローバルメニューをBのディレクトリのグローバルナビを読み込みを実装したいですが、
    どのように分岐すべきかがわかりません。

    http://www.example.com/A/のヘッダーの読み込みは以下の記述にて読み込んでおります。

    <?php
        global $current_user;
        get_currentuserinfo();
        if (0 == $user_level) {
    	get_header("A");
      }  elseif (1 == $user_level) {
    	get_header("B");
          }
      }
    ?>

    拙い説明ですが、どうかご教授いただけますでしょうか。

    よろしくお願いいたします。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • AおよびBは固定ページですか?
    その場合、次のような書き方で大丈夫だと思います。

    <?php
    	global $current_user;
    	get_currentuserinfo();
    	if (0 == $user_level || 6 == $user_level && (is_page( AのページID ) || in_array(AのページID, get_post_ancestors( $post->ID ) ))) {
    		get_header("A");
    	}  elseif (1 == $user_level || 6 == $user_level && (is_page( BのページID ) || in_array(BのページID, get_post_ancestors( $post->ID ) ))) {
    		get_header("B");
    	}
    ?>

    コード内を対象ページのIDにそれぞれ書き変えてください。

    http://wpdocs.sourceforge.jp/Conditional_Tags#WordPress_.E3.83.9A.E3.83.BC.E3.82.B8

    トピック投稿者 hazudog

    (@hazudog)

    ご教授ありがとうございました。

    AとBはカテゴリですので、スーパーユーザー向けのヘッダーを作成して以下のように記述し解決いたしました。

    <?php if( $parent_id == AのページID ){?>
    <?php wp_nav_menu(array( ‘theme_location’ => ‘globalNavi-A’)); ?>
    <?php }else if( $parent_id == BのページID ){?>
    <?php wp_nav_menu(array( ‘theme_location’ => ‘globalNavi-B’)); ?>
    <?php }else{ ?>
    <?php wp_nav_menu(array( ‘theme_location’ => ‘globalNavi-B’)); ?>
    <?php } ?>

    またよろしくお願いいたします。

    トピック投稿者 hazudog

    (@hazudog)

    お世話になります。
    上記の通り自己解決したと書きましたが、見当違いで、解決しておりませんでした。
    さらに追加で質問が出てきてしまいましたのでご教授いただきたくお願いいたします。

    AおよびBはカテゴリーとなりますので、以下のように記述し、
    スーパーユーザーのCがそれぞれのディレクトリにアクセスしたときに、
    カテゴリAではAのヘッダーが読み込まれ、
    カテゴリBではBのヘッダーが読み込まれるようになりました。

    <?php
    	global $current_user;
    	get_currentuserinfo();
    	if (0 == $user_level || 6 == $user_level && (is_category( AのページID ) || in_array(AのページID, get_post_ancestors( $post->ID ) ))) {
    		get_header("A");
    	}  elseif (1 == $user_level || 6 == $user_level && (is_category( BのページID ) || in_array(BのページID, get_post_ancestors( $post->ID ) ))) {
    		get_header("B");
    	}
    ?>

    新たな質問(解決できないこと):
    (1)AとBにはそれぞれ記事を持っていて、single.phpに同じく上記のヘッダーを振り分ける分岐コードをいれました。
    AおよびBのユーザーでログインして記事を表示させると、ヘッダーは読み込まれるのですが、
    スーパーユーザーのCでログインして、記事ページを表示してもヘッダーが読み込まれません。
    原因とどのように記述すべきが分かりませんので、ご教授いただけませんでしょうか。

    未確認ですが、is_categoryの替わりにin_categoryを使うと出来ると思います。
    single.php用は、以下のコードに変更してみてください。

    <?php
    	global $current_user;
    	get_currentuserinfo();
    	if (0 == $user_level || 6 == $user_level && (in_category( AのページID ) )) {
    		get_header("A");
    	}  elseif (1 == $user_level || 6 == $user_level && (in_category( BのページID ) )) {
    		get_header("B");
    	}
    ?>

    http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/in_category

    トピック投稿者 hazudog

    (@hazudog)

    検証していたら返信遅くなりました、ご教示ありがとうございます。
    ご教授いただきましたコードですと、なぜかヘッダーが読み込まれませんでしたので、
    以下のコードを埋め込み表示されたのですが、また新たな解決できないことが出てきてしました。。
    以下のコードは、親カテゴリがAの時、Aのヘッダーを読み込み、Bのカテゴリの時はBのヘッダーを読み込むようにしました。

    【解決できないこと】
    スーパーユーザのCはAのカテゴリーとCのカテゴリーを行き来できる仕様なのですが、
    AとBには共通の記事がありまして、親なしのカテゴリに記事を作成しています。
    そこで、共通記事を表示した際、AにはAのヘッダーを読み、BにはBのヘッダーを読みにいくようにしたいのですが、実現できません。
    そもそも、現状の構造では間違っているとか無理なのでしょうか?
    構造上で変更すべき箇所がありましたらご教授いただきたくお願いいたします。
    現状の構造で解決できれば一番いいのですが。

    <?php
    	$cat_now = get_the_category();
    	$cat_now = $cat_now[0];
    	/*親カテゴリーのID取得*/
    	$parent_id = $cat_now->category_parent;
    ?>
    <?php
    	global $current_user;
    	get_currentuserinfo();
    	if (0 == $user_level || 6 == $user_level && ($parent_id==AのID)) {
    		get_header("A");
    	}  elseif(1 == $user_level || 6 == $user_level && ($parent_id==BのID)) {
    		get_header("B");
    	}
    ?>

    どうかご教授のほどお願いいたします。

    記事がAおよびBに関係のないカテゴリーに属するのでしたら、アーカイブページでセッション(クッキー)を発行して判別するか、単一投稿ページでリファラーによるチェックを行うといいように思います。
    個人的には、リファラーの方が簡単に利用できると思います。

    <?php
    	global $user_level;
    	$ref = wp_get_referer();
    	if (0 == $user_level || 6 == $user_level && strpos($ref, 'Aのカテゴリースラッグ') !== false ) {
    		get_header("A");
    	}  elseif (1 == $user_level || 6 == $user_level && strpos($ref, 'Bのカテゴリースラッグ') !== false ) {
    		get_header("B");
    	}
    ?>

    http://codex.wordpress.org/Function_Reference/wp_get_referer

    今になって気がつきましたが、get_currentuserinfo()の使用方法を間違えているようです。
    $user_levelを使う場合は、get_currentuserinfo()は不要です。($current_user->user_levelのように使う場合に利用します。)
    http://wpdocs.sourceforge.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/get_currentuserinfo

    すみません。
    アーカイブページから移動した場合はヘッダーが読み込まれますが、単一投稿ページから前あるいは次の投稿へ移動した際は表示されませんね。
    カテゴリーAおよびBと、各投稿はどのような関係になっているのでしょう?
    もう少し具体的に提示してください。
    カテゴリーアーカイブに各投稿をどのように表示しているのか、各投稿へのリンクはどうしているのか、URLの例などもあると分かりやすいです。
    A・・・http://example.com/category/A/
    Aの各投稿・・・http://example.com/年/月/日/投稿タイトル

    トピック投稿者 hazudog

    (@hazudog)

    検証をしておりまして遅くなりすみません、ご教授ありがとうございます。
    まず構造につきまして先に詳しくお伝えすべきでした、申し訳ありません。
    詳しい構造は以下のようになっております。

    【構造】
    カテゴリAとBには、共通の”お知らせ”と”イベント案内”の記事がありまして、
    また共通でないそれぞれA、Bで固有に持つ、”お知らせ”と”イベント案内”の記事があります。

    共通の”お知らせ”の記事は、
    http://example.com/all-info/ のカテゴリに属し、
    共通の”イベント”の記事は、
    http://example.com/all-event/ のカテゴリに属すようにしております。

    A、Bで固有で持つ”お知らせ”の記事はそれぞれ、
    http://example.com/A/info-a/
    http://example.com/B/info-b/
    のカテゴリに属すようにしております。

    A、Bで固有で持つ”イベント”の記事は、
    http://example.com/A/event-a/
    http://example.com/B/event-b/
    のカテゴリに属すようにしております。

    その他に共通のカテゴリとして”会員名簿”、”各種手続き”という項目があり、
    それぞれ一枚のページとして存在しています。
    http://example.com/memberlist/
    http://example.com/formalities/

    各(http://example.com/A/ 、http://example.com/B/ )のグローバルナビゲーションは、以下を配置することとなっております。
    ー お知らせ
    ー イベント
    ー 会員名簿
    ー 各種手続き

    【解決できないこと】
    各投稿にはご教授いただきました通りリファラーを取得する方法にて、
    アーカイブページから移動した場合はヘッダーが読み込まれます。
    AとBに属さない”会員名簿”や”各種手続き”のヘッダーに記述するコードが見当つきません。自分なりに以下の様に記述しましたが、会員名簿へ遷移してその後、各種手続きに遷移すると希望通りのヘッダーが読み込まれない状況です。
    現状の構造では実現が難しいのでしょか。。
    度々となりまして、誠に恐縮ですが、ご教授いただきたくお願いいたします。

    <?php
    	global $user_level;
    	$ref = wp_get_referer();
    	if (0 == $user_level || 6 == $user_level && strpos($ref, 'A') !== false || 6 == $user_level && strpos($ref, 'info') !== false ||  6 == $user_level && strpos($ref, 'event') !== false || 6 == $user_level && strpos($ref, 'memberlist') !== false || 6 == $user_level && strpos($ref, 'formalities') !== false ){
    		get_header("A");
    	} elseif (1 == $user_level || 6 == $user_level && strpos($ref, 'A') !== false || 6 == $user_level && strpos($ref, 'info') !== false ||  6 == $user_level && strpos($ref, 'event') !== false || 6 == $user_level && strpos($ref, 'memberlist') !== false || 6 == $user_level && strpos($ref, 'formalities') !== false ){
    		get_header("B");
    	}
    ?>

    クッキー(セッション)を使った方がいいみたいです。
     
    カテゴリーアーカイブのget_header()実行前に次の記述を追加します。

    if(get_query_var('cat') == AのカテゴリID) setcookie('current_category', 'A', 0, '/');
    if(get_query_var('cat') == BのカテゴリID) setcookie('current_category', 'B', 0, '/');

     
    単一投稿ページには以下のように記述します。

    <?php
    	global $user_level;
    	$ref = wp_get_referer();
    	if (0 == $user_level || 6 == $user_level && isset($_COOKIE['current_category']) && $_COOKIE['current_category'] == 'A' ) {
    		get_header("A");
    	}  elseif (1 == $user_level || 6 == $user_level && isset($_COOKIE['current_category']) && $_COOKIE['current_category'] == 'B' ) {
    		get_header("B");
    	}
    ?>

     
    ただし、Aカテゴリ内の単一投稿からBカテゴリ内の単一投稿への移動ではクッキーが変更されませんので、必ずカテゴリーアーカイブページを経由して移動する必要があります。

    トピック投稿者 hazudog

    (@hazudog)

    popupさん

    検証していて返信遅れました。
    ご教授いただいたコードにて希望通りに実現できました。
    このたびは本当にありがとうございます。

10件の返信を表示中 - 1 - 10件目 (全10件中)

トピック「ユーザーレベルによる分岐」には新たに返信することはできません。