WordPress.org

Forums

Achievements for WordPress
Award for logging in x times (15 posts)

  1. jonioscm
    Member
    Posted 1 year ago #

    Was struggling to get anywhere with this - so figured out a roundabout way of getting it done. Might help someone, so posting here just in case.

    Essentially what I ended up doing was redirecting the user on login to a dummy page with a "mini-template" of the following code;

    <?php
    /*
    Template Name: Login Counter
    */
    	do_action('user_front_end_login', $current_user->ID);
    	header("Location: " . '/end-up-here/');
    	exit();
    ?>

    Where '/end-up-here/' is where you really want the user to end up after logging in and being pushed through the above page.

    My redirect code is as follows - it essentially sends admin users to wp-admin, and anyone else to the Login Counter page above;

    function jw_loginredirect( $redirect_to, $request, $user  ) {
    	return ( is_array( $user->roles ) && in_array( 'administrator', $user->roles ) ) ? admin_url() : '/login-counter/';
    }
    add_filter( 'login_redirect', 'jw_loginredirect', 10, 3 );

    For more info on redirecting users on login - check here.

    I think that covers everything you need. Hope this helps someone save the hours I've spent =o)

    https://wordpress.org/plugins/achievements/

  2. jonioscm
    Member
    Posted 1 year ago #

    By the way, the 'user_front_end_login' is a custom one I added using the instructions from PG here.

    Thanks for the amazing plugin - I've had heaps of fun =o)

    Jon

  3. Apokh
    Member
    Posted 1 year ago #

    Hey, sounds good. Can you share this one?

  4. Unit9
    Member
    Posted 1 year ago #

    This sounds great! Would love to see the complete code as well! :D

  5. Unit9
    Member
    Posted 1 year ago #

    Hi Jonioscm & Apokh,

    I wasn't sure about redirecting users after login as it breaks standard usability functionality: A person should be returned to the page before they logged in (unless they login through the login page I suppose! :) ).

    So this will help you store the login count of individual users without it redirecting anywhere.

    function my_user_login_count($username, $user) {
        $login_count = intval(get_user_meta($user->ID, 'my_user_count', true));
    
        $login_count++;
        update_user_meta($user->ID, 'my_user_count', $login_count);
    
        // Activate Achievements event according $login_count
    }
    add_action('wp_login', 'my_user_login_count', 10, 2);

    I have no idea how to add the achievement event but this is a start. You can still add the login redirect if you like but this is purely to store the user login count.

    Perhaps Paul could tell us how to add this as an achievement event? :D

  6. Paul Gibbs
    BuddyPress Lead Developer
    Plugin Author

    Posted 1 year ago #

    Neat solution

  7. jonioscm
    Member
    Posted 1 year ago #

    I went down the same route as Unit9, initially - but changed for flexibility (rather than having to hard code individual achievements. If you go that way, you would essentially add an if statement where the // comment line is - so code might be;

    function my_user_login_count($username, $user) {
        $login_count = intval(get_user_meta($user->ID, 'my_user_count', true));
    
        $login_count++;
        update_user_meta($user->ID, 'my_user_count', $login_count);
    
        if ($login_count == 10) {
            do_action('logged_in_10_times', $current_user->ID);
        }
        if ($login_count == 20) {
            do_action('logged_in_20_times', $current_user->ID);
        }
    }
    add_action('wp_login', 'my_user_login_count', 10, 2);
  8. jonioscm
    Member
    Posted 1 year ago #

    Just a thought, but I guess you could use a variable rather than the if statement like this (untested!);

    function my_user_login_count($username, $user) {
        $login_count = intval(get_user_meta($user->ID, 'my_user_count', true));
    
        $login_count++;
        update_user_meta($user->ID, 'my_user_count', $login_count);
        $theaction = 'logged_in_' . $login_count . '_times';
    
        do_action($theaction, $current_user->ID);
        }
    }
    add_action('wp_login', 'my_user_login_count', 10, 2);
  9. Unit9
    Member
    Posted 1 year ago #

    Awesome jonioscm! :D

    How do we make that activate an achievement though? :D

  10. jonioscm
    Member
    Posted 1 year ago #

    You'll need to add the actions via plug-in extension - see here

    About halfway down the page is the "Reference Plugin" which should make it straight forward enough. Work through that template making the changes, and you should be right. Save in your theme folder as (for example) achextend.php - then add this to your functions.php;

    function mg_achievements_init() {
      require 'achextend.php';
    }
    add_action( 'dpa_init', 'mg_achievements_init' );

    I'm pretty sure that should get you up and running. You can then add the achievements in via the wp-admin thingo =o)

    You might choose not to save it in the theme folder - depending on how your site is structured. I'm running a local intranet, with a single theme, as the only administrator - so this works for me.

    I think that should get you up and going =o)

  11. Unit9
    Member
    Posted 1 year ago #

    Thanks Jonioscm! :D

    I have a really stupid question and I'm a noob, but, what does 'your_textdomain' mean in the actions?

    $this->actions = array(
    'logins_event' => __( 'The user logs into your site', 'your_textdomain' ),
    );

    Should it be $login_count from my previous post? Or should the 'logins_event' be '$login_count' from my previous post?

    Thanks - as I said - I'm a noob!

  12. jonioscm
    Member
    Posted 1 year ago #

    No problem, Unit9

    your_textdomain is for (I believe) translating/language related. There is a bit of info here on text domains.

    Hope this helps =o)

  13. Apokh
    Member
    Posted 1 year ago #

    Hey guys. For I am really not used to php coding especially not used to WordPress for I use it for some weeks now I have really some questionmarks above my head:

    First:
    I made up an "xlogin.php" with that content now. It is for sure not "right" but perhaps we can make it for others, who are like me not used to it:

    <?php
    /**
    * Welcome to your first Achievements extension.
    *
    * Edit this base plugin, and then save it in /plugins/. You'll want to start by replacing
    * the example class/function prefixes, and fill in the actions that you want to integrate
    * into Achievements in the constructor's <code>$this->actions</code> array.
    *
    * For more information, see http://achievementsapp.com/developers/adding-other-plugins/.
    * For support, post on https://wordpress.org/support/plugin/achievements/.
    *
    * Version 1.
    */
    
    if ( ! defined( 'ABSPATH' ) ) exit;
    
    // This safely loads your extension.
    function pg_init_your_extension() {
    achievements()->extensions->my_user_login_count = new PG_Your_Extension;
    
    // Tell the world that your custom extension is ready
    do_action( 'pg_init_your_extension' );
    }
    add_action( 'dpa_ready', 'pg_init_your_extension' );
    
    // This is the actual extension.
    function my_user_login_count($username, $user) {
        $login_count = intval(get_user_meta($user->ID, 'my_user_count', true));
    
        $login_count++;
        update_user_meta($user->ID, 'my_user_count', $login_count);
    
        // Activate Achievements event according $login_count
    }
    add_action('wp_login', 'my_user_login_count', 10, 2);
    
    /**
    * These bits of information are important. <code>id</code> should be a short, unique string for the name of your extension or plugin.
    * Don't include any spaces, punctuation, or other weird characters.
    *
    * Incrementing the version number won't do anything automatically. Look at the <code>do_update()</code> method in the <code>PG_Your_Extension</code> class.
    */
    $this->id = 'my_user_login_count';
    $this->version = 1;
    
    // All the rest of this is information to populate the details for your plugin in the [wp-admin > Achievements > Supported Plugins] screen.
    $this->contributors = array(
    array(
    'name' => 'Paul Gibbs',
    'gravatar_url' => 'http://www.gravatar.com/avatar/3bc9ab796299d67ce83dceb9554f75df',
    'profile_url' => 'http://profiles.wordpress.org/DJPaul/',
    ),
    );
    
    $this->description = __( 'This is a sample Achievements extension for a fake plugin called "your-plugin".', 'achievements' );
    $this->name = __( 'Your Extension', 'your_textdomain' );
    $this->image_url = trailingslashit( achievements()->includes_url ) . 'admin/images/buddypress.png';
    $this->rss_url = 'http://buddypress.org/blog/feed/';
    $this->small_image_url = trailingslashit( achievements()->includes_url ) . 'admin/images/buddypress-small.png';
    $this->wporg_url = 'http://wordpress.org/plugins/your-extension/';
    }
    }

    As you see I took Pauls template for it. Not really sure...

    Second:
    Created a "plugins" folder within the "achievements" folder and put the php file in there.

    Third:
    I read here, that I´ll now have to integrate

    function mg_achievements_init() {
      require 'achextend.php';
    }
    add_action( 'dpa_init', 'mg_achievements_init' );

    into functions.php to make the plugin aviable in the actions list of the achievements plugin.
    BUT there a several of these within the achievements/includes folder.

  14. Apokh
    Member
    Posted 1 year ago #

    not? :/

  15. jonioscm
    Member
    Posted 1 year ago #

    Hi Apokh,

    Apologies for delay in responding - currently in process of house move so only internet access I have is at work! Looks like you got a bit mixed up with where to add things. I'll try to clarify what I did.

    Your file xlogin.php should just be used for adding the "actions" - it appears you've added Unit9's function in there, too. Whilst it may work, it also might not. Work through the base plugin extension template, just changing the things you need to (ie. the eat pizza/cake sections).

    I'd add those other functions to your theme folders functions.php (just make one if you don't have it already) if you're only using the one theme. You'll have to make sure the "require" function in your last code example (mg_achievements_init) is able to find the actual xlogin.php file. I placed it in my theme folder simply because it means I can call it with 'xlogin.php' - rather than adding paths.

    Hope this helps,

    Jon

Topic Closed

This topic has been closed to new replies.

About this Plugin

  • Achievements for WordPress
  • Frequently Asked Questions
  • Support Threads
  • Reviews

About this Topic

Tags

No tags yet.