4

How to restricted a page in wordpress. For example : user [without login] can see 5 of game list. [example.com/game/] and after click 'view more', user must login/register and after that, user can access full/100 game list. [example.com/game/]

Anyone know to make it without plugin? thank you

3
  • 1
    -1 – That’s pure plugin territory.
    – fuxia
    Jul 8, 2012 at 18:17
  • 1
    why you don't want to use plugin?
    – Sisir
    Jul 8, 2012 at 18:20
  • Found good resource to do that : scratchcode.io/… Dec 20, 2020 at 10:05

3 Answers 3

4

You can do this pretty easily with a shortcode. Hook into init and add the shortcode in your hooked function.

<?php
add_action('init', 'wpse57819_add_shortcode');
/**
 * Adds the shortcode
 *
 * @uses add_shortcode
 * @return null
 */
function wpse57819_add_shortcode()
{
    add_shortcode('restricted', 'wpse57819_shortcode_cb');
}

Then in your callback function, you can check to see if the user is logged in. If they are, show them the content. If not, show them a login message. You can do literally whatever you want here: check for user capabilities to show them the content (different "membership levels"), show them an entire login form. A simple example:

<?php
/**
 * Callback function for the shortcode.  Checks if a user is logged in.  If they
 * are, display the content.  If not, show them a link to the login form.
 *
 * @return string
 */
function wpse57819_shortcode_cb($args, $content=null)
{
    // if the user is logged in just show them the content.  You could check
    // rolls and capabilities here if you wanted as well
    if(is_user_logged_in())
        return $content;

    // If we're here, they aren't logged in, show them a message
    $defaults = array(
        // message show to non-logged in users
        'msg'    => __('You must login to see this content.', 'wpse57819'),
        // Login page link
        'link'   => site_url('wp-login.php'),
        // login link anchor text
        'anchor' => __('Login.', '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;
}

As a plugin.

Usage

Somewhere in your pages/posts:

[restricted]
Content for members only goes here
[/restricted]
7
  • 1
    You can drop the code above in your functions.php file (minus the opening <?php tags). Example usage added to the answer. Jul 9, 2012 at 12:43
  • It's not in php code, the [restricted] is a shortcode: codex.wordpress.org/Shortcode_API Jul 9, 2012 at 13:55
  • @Davis: Sorry, but not working in my syntax. [restricted] <a href="sample.com">Sample</a> [/restricted] Whats wrong? thx
    – Juan Lie
    Jul 9, 2012 at 14:10
  • You're logged in. That's probably what's wrong. Jul 9, 2012 at 15:17
  • 1
    If you want to do it directly in a php file just use the is_user_logged_in conditional directly. Jul 10, 2012 at 14:18
1

May be a custom shortcode is useful See this plugin http://wordpress.org/extend/plugins/restrictedarea It is obsolete but you should use the code for your pourpose

0
1

First you need to add a custom meta box that allows you to mark the post as hidden.

For detail please click on the original answer this source link

I modify this function to fulfill your needs

add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query )
{

  // Check if on frontend and main query.
    if( ! is_admin() && $query->is_main_query() ) 
    {
        if( ! is_user_logged_in() )
        {
            // For the posts we want to exclude.
            $exclude = array();

            // Locate our posts marked as hidden.
            $hidden = get_posts(array(
              'post_type' => 'post',
              'meta_query' => array(
                array(
                  'key' => 'meta-box-checkbox',
                  'value' => 'true',
                  'compare' => '==',
                ),
              )
            ));

               // Create an array of hidden posts.
            foreach($hidden as $hide)
            {
              $exclude[] = $hide->ID;
            }
            // Exclude the hidden posts.
            $query->set('post__not_in', $exclude);
        }

    }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.