Как ограничить доступ к странице [без плагина]
Как ограничить доступ к странице в WordPress. Например: пользователь [без авторизации] может видеть 5 элементов из списка игр. [example.com/game/] и после нажатия "показать ещё", пользователь должен войти или зарегистрироваться, и только тогда он получит доступ к полному списку из 100 игр. [example.com/game/]
Кто-нибудь знает, как реализовать это без плагина? Спасибо.

Это можно легко реализовать с помощью шорткода. Подключитесь к хуку init
и добавьте шорткод в вашу функцию-обработчик.
<?php
add_action('init', 'wpse57819_add_shortcode');
/**
* Добавляет шорткод
*
* @uses add_shortcode
* @return null
*/
function wpse57819_add_shortcode()
{
add_shortcode('restricted', 'wpse57819_shortcode_cb');
}
Затем в вашей callback-функции вы можете проверить, вошел ли пользователь в систему. Если да — покажите ему контент. Если нет — отобразите сообщение о необходимости входа. Здесь вы можете сделать буквально что угодно: проверить права пользователя, чтобы показать контент (разные "уровни членства"), отобразить целую форму входа. Простой пример:
<?php
/**
* Callback-функция для шорткода. Проверяет, вошел ли пользователь в систему.
* Если да — отображает контент. Если нет — показывает ссылку на форму входа.
*
* @return string
*/
function wpse57819_shortcode_cb($args, $content=null)
{
// если пользователь вошел в систему, просто покажите ему контент.
// Здесь также можно проверить роли и права, если нужно
if(is_user_logged_in())
return $content;
// Если мы здесь, значит пользователь не вошел в систему — покажем сообщение
$defaults = array(
// сообщение для неавторизованных пользователей
'msg' => __('Вы должны войти, чтобы увидеть этот контент.', 'wpse57819'),
// ссылка на страницу входа
'link' => site_url('wp-login.php'),
// текст ссылки для входа
'anchor' => __('Войти.', 'wpse57819')
);
$args = wp_parse_args($args, $defaults);
$msg = sprintf(
'<aside class="login-warning">%s <a href="%s">%s</a></aside>',
esc_html($args['msg']),
esc_url($args['link']),
esc_html($args['anchor'])
);
return $msg;
}
Как плагин.
Использование
Где-нибудь в ваших страницах/записях:
[restricted]
Контент только для участников здесь
[/restricted]

Вы можете добавить приведенный выше код в файл functions.php (без открывающих тегов <?php
). Пример использования добавлен в ответ.

Это не php-код, [restricted]
- это шорткод: http://codex.wordpress.org/Shortcode_API

@Davis: Извините, но у меня не работает в таком синтаксисе. [restricted] <a href="sample.com">Sample</a> [/restricted] В чем проблема? Спасибо.

@Davis: Извините, но можно ли этот код поместить в любой php-файл, а не в запись. Однако в моем случае это не сработало:
<?
php code
[restricted]
php code
[/restricted]
php code
?>
Спасибо

Если вы хотите сделать это напрямую в php-файле, просто используйте условие is_user_logged_in
напрямую.

У меня есть страница с шорткодами. Она показывает только названия шорткодов.. Я сделал так [restricted] [my-shortcode] [/restricted]. но отображается только "[my-shortcodes]" как текст, а не настоящий шорткод. Поэтому я изменил на..." return do_shortcode($content);" и теперь всё работает нормально. Я правильно делаю? В чём разница?

Возможно, пользовательский шорткод будет полезен. Посмотрите этот плагин http://wordpress.org/extend/plugins/restrictedarea Он устарел, но вы можете использовать его код для своих целей.

Сначала вам нужно добавить пользовательский метабокс, который позволит помечать запись как скрытую.
Для подробностей перейдите по этой ссылке на оригинальный ответ
Я модифицировал эту функцию, чтобы она соответствовала вашим потребностям
add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query )
{
// Проверяем, что это фронтенд и основной запрос.
if( ! is_admin() && $query->is_main_query() )
{
if( ! is_user_logged_in() )
{
// Для постов, которые мы хотим исключить.
$exclude = array();
// Находим посты, помеченные как скрытые.
$hidden = get_posts(array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'meta-box-checkbox',
'value' => 'true',
'compare' => '==',
),
)
));
// Создаем массив скрытых постов.
foreach($hidden as $hide)
{
$exclude[] = $hide->ID;
}
// Исключаем скрытые посты.
$query->set('post__not_in', $exclude);
}
}
}
