Мне удалось это сделать:
- Создание структуры каталогов в файловой системе, защищенной .htaccess.
- Добавление настраиваемого поля на любую страницу, которую яхотите защитить, указывает, какой каталог используется для его защиты.
- Изменение шаблона page.php для ограничения доступа к странице в зависимости от того, имеет ли пользователь доступ к каталогу, указанному в настраиваемом поле.
Конкретные шаги следующие:
- Создание каталога "groups" внутри каталога wp-content.
Создание wp-content / groups/index.php со следующим содержимым:
<?php
require( dirname(__FILE__) . '/../../wp-load.php' );
class CASGroupAuth {
static function authenticate(){
$groups = @$_SESSION['cas-groups'];
if ( !$groups ) $groups = array();
$groupdir = basename(dirname($_SERVER['PHP_SELF']));
$groups[$groupdir] = true;
$_SESSION['cas-groups'] = $groups;
if (!@$_GET['redirect_to'] ){
die("You didn't provide a redirect");
}
header('Location: '.$_GET['redirect_to']);
exit;
}
}
CASGroupAuth::authenticate();
- Создать подкаталог «mygroup» внутри каталога «groups».
Создать символическую ссылку на группы/index.php в каталоге mygroups.Т.е.
$ cd mygroup
$ ln -s ../index.php index.php
Добавьте файл .htaccess в каталог groups / mygroup с соответствующими ограничениями доступа.В моем случае я использовал модуль Apache CAS, поэтому мой файл .htaccess выглядел следующим образом:
AuthType CAS
require sfu-user shannah !my-maillist
Измените шаблон page.php в моей теме (т.е. внутри wp-content/ themes / mytheme /) должно быть:
<?php if (have_posts()) : the_post();
$group = get_post_meta(get_the_ID(), 'cas-group', true);
if ( trim($group) ){
$group = trim($group);
$existingGroups = @$_SESSION['cas-groups'];
if ( !$existingGroups or !@$existingGroups[$group] ){
nocache_headers();
header('HTTP1.1 302 Moved Temporarily');
header('Location: ' . get_settings('siteurl') . '/wp-content/groups/'.basename($group).'/index.php?redirect_to='.urlencode($_SERVER['REQUEST_URI']));
header('Status: 302 Moved Temporarily');
exit;
}
}
?>
<?php get_header(); ?>
<div id="content" class="narrowcolumn">
<div id="PageTitle"><!-- TemplateBeginEditable name="PageTitle" --><?php the_title(); ?><!-- TemplateEndEditable --></div>
<div class="post" id="post-<?php the_ID(); ?>">
<div class="entry">
<?php the_content('<p class="serif">Read the rest of this page »</p>'); ?>
</div>
</div>
<?php edit_post_link('Edit this entry.', '<p>', '</p>'); ?>
</div>
<?php get_footer(); ?>
<?php endif; ?>
Важной частью этого является раздел вверху, поскольку код проверяет настраиваемое поле cas-groups и перенаправляетпользователь, должен быть запущен перед отправкой любого вывода в браузер.Чтобы сделать это, я изменил расположение инструкции if (has_posts ()), чтобы обернуть всю страницу, а не только содержимое, как в шаблоне по умолчанию.
На этом этапе, если вы добавитенастраиваемое поле для любой страницы сайта WordPress с именем «cas-group» и значением «mygroup», тогда доступ к этой странице будет надлежащим образом ограничен для пользователей, которые имеют доступ к вашему каталогу groups / mygroup на основании правил в нем.htaccess файл.
Если вы хотите иметь разные группы, вы можете просто сделать копию каталога mygroup и изменить ограничения файла .htaccess внутри него.