Как ограничить доступ к странице [без плагина]

8 июл. 2012 г., 20:01:59
Просмотры: 13.5K
Голосов: 4

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

Кто-нибудь знает, как реализовать это без плагина? Спасибо.

3
Комментарии

-1 – Это чистая территория плагинов.

fuxia fuxia
8 июл. 2012 г. 21:17:47

почему вы не хотите использовать плагин?

Sisir Sisir
8 июл. 2012 г. 21:20:18

Нашел хороший ресурс для этого: https://www.scratchcode.io/how-to-restrict-pages-or-posts-access-without-login-into-wordpress

Mayank Dudakiya Mayank Dudakiya
20 дек. 2020 г. 12:05:15
Все ответы на вопрос 3
7

Это можно легко реализовать с помощью шорткода. Подключитесь к хуку 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]
8 июл. 2012 г. 20:32:34
Комментарии

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

chrisguitarguy chrisguitarguy
9 июл. 2012 г. 15:43:33

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

chrisguitarguy chrisguitarguy
9 июл. 2012 г. 16:55:20

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

Juan Lie Juan Lie
9 июл. 2012 г. 17:10:24

Вы вошли в систему. Вероятно, в этом и заключается проблема.

chrisguitarguy chrisguitarguy
9 июл. 2012 г. 18:17:02

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

Juan Lie Juan Lie
10 июл. 2012 г. 16:41:39

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

chrisguitarguy chrisguitarguy
10 июл. 2012 г. 17:18:18

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

pulla pulla
1 июл. 2016 г. 13:28:17
Показать остальные 2 комментариев
0

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

8 июл. 2012 г. 20:08:45
0

Сначала вам нужно добавить пользовательский метабокс, который позволит помечать запись как скрытую.

Для подробностей перейдите по этой ссылке на оригинальный ответ

Я модифицировал эту функцию, чтобы она соответствовала вашим потребностям

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);
        }

    }
}
1 окт. 2019 г. 15:49:14