Support » Plugins and Hacks » Hacks » Pagination for shortcode for list of users

  • Resolved Joseneas

    (@enoquenroll)


    Hello,

    I would like to show a pagination after a list of users that will be displayed on a page through the Shortcode. I wanted to display only 5 users per page and just below the pagination for the user to navigate by other users.

    I am grateful for any help.

    Here’s an example of my code:

    add_shortcode('list-users', 'list_users');
    
    function list_users($atts){
    
    global $wpdb;
    
    $args = array(
        'blog_id'      => '',
        'role'         => 'student',
        'meta_key'     => 'pw_user_status', //I'm using the New User Approve Plugin
        'meta_value'   => 'approved',//If user is denied, he is not appears in the list
        'meta_compare' => '',
        'meta_query'   => array(),
        'include'      => array(),
        'exclude'      => array(),
        'orderby'      => 'display_name',
        'order'        => 'ASC',
        'offset'       => '',
        'search'       => '',
        'number'       => '2',
        'count_total'  => true,
        'fields'       => 'all',
        'who'          => ''
    );
    
    $students = get_users($args);
    
    if(is_user_logged_in()){
    
    $content = "<div id='list-of-users'>";
    
       foreach($students as $student){
    
        $content .= "<li>";
        $content .= "<div class=\"edit-profile\">";
        if(current_user_can('administrator')){
           $link_of_profile_of_user = get_edit_user_link($aluno->ID);
           $content .= "<a href=".$link_of_profile_of_user." class=\"edit-profile\">"."Edit this profile"."</a>";
         }
        $content .= "</div>";
        $content .= get_avatar($student->ID);
        $content .= "<span class='item'>Name: </span>" . get_the_author_meta('display_name', $student->ID) . "<br />";
        $content .= "<span class='item'>Date of Birth: </span>" . get_the_author_meta('date_of_birth_acf_student', $student->ID) . "<br />";
        $content .= "<span class='item'>Course: </span>" . get_the_author_meta('course_acf_student', $aluno->ID) . "<br />"
        $content .= "<span class='item'>Email: </span>" . get_the_author_meta('user_email', $student->ID) . "<br />";
        $content .= "<span class='item'>Phone: </span>" . get_the_author_meta('phone_acf_student', $student->ID) . "<br />";
        $content .= "<span class='item'>City: </span>" . get_the_author_meta('city_acf_student', $student->ID) . "<br />";
        $content .= "</li>";
    
       }//close foreach
    
    $content .= "</div>";
    
        return $content;
    
    }//close the conditional for user logged
    
    }//close function
Viewing 5 replies - 1 through 5 (of 5 total)
  • Hi,

    Now, the pagination is showing, but on each page is shown the last user from the previous page and the number of items of pagination is twice the total of users. Is appearing the twice of links on pagination.

    Example: If I want to display 5 users per page and I have 25 users, should show only 4 links in pagination(2 > 3 > 4 > 5). And in fact is showing 8 links. (2 > 3 > 4 > 5 > 6 > 7 > 8 >).

    add_shortcode('list-users', 'list_users');
    
    function list_users($atts){
    
    global $wpdb;
    
    $total_users = count_users();
    $total_users = $total_users['total_users'];
    $paged = get_query_var('paged');
    $number = 4;
    
    $args = array(
        'blog_id'      => '',
        'role'         => 'student',
        'meta_key'     => 'pw_user_status', //I'm using the New User Approve Plugin
        'meta_value'   => 'approved',//If user is denied, he is not appears in the list
        'meta_compare' => '',
        'meta_query'   => array(),
        'include'      => array(),
        'exclude'      => array(),
        'orderby'      => 'display_name',
        'order'        => 'ASC',
        'offset'       => $paged ? $paged : 0,
        'search'       => '',
        'number'       => $number,
        'count_total'  => true,
        'fields'       => 'all',
        'who'          => ''
    );
    
    $students = get_users($args);
    
    if(is_user_logged_in()){
    
    $content = "<div id='list-of-users'>";
    
       foreach($students as $student){
    
        $content .= "<li>";
        $content .= "<div class=\"edit-profile\">";
        if(current_user_can('administrator')){
           $link_of_profile_of_user = get_edit_user_link($aluno->ID);
           $content .= "<a href=".$link_of_profile_of_user." class=\"edit-profile\">"."Edit this profile"."</a>";
         }
        $content .= "</div>";
        $content .= get_avatar($student->ID);
        $content .= "<span class='item'>Name: </span>" . get_the_author_meta('display_name', $student->ID) . "<br />";
        $content .= "<span class='item'>Date of Birth: </span>" . get_the_author_meta('date_of_birth_acf_student', $student->ID) . "<br />";
        $content .= "<span class='item'>Course: </span>" . get_the_author_meta('course_acf_student', $aluno->ID) . "<br />"
        $content .= "<span class='item'>Email: </span>" . get_the_author_meta('user_email', $student->ID) . "<br />";
        $content .= "<span class='item'>Phone: </span>" . get_the_author_meta('phone_acf_student', $student->ID) . "<br />";
        $content .= "<span class='item'>City: </span>" . get_the_author_meta('city_acf_student', $student->ID) . "<br />";
        $content .= "</li>";
    
       }//close foreach
    
    if($total_users > ($number/2)){
    
    $current_page = max(1, get_query_var('paged'));
    
    echo '<div class="page_nav">';
      $pl_args = array(
         'base'     => add_query_arg('paged','%#%'),
         'format'   => '',
         'total'    => floor($total_users / $number),
         'current'  => max(1, $paged),
    );
      if($GLOBALS['wp_rewrite']->using_permalinks()){
        $pl_args['base'] = user_trailingslashit(trailingslashit(get_pagenum_link(1)).'page/%#%/', 'pagina');
      }
      echo paginate_links($pl_args);
    echo '</div>';  
    
    }
    
    $content .= "</div>";
    
        return $content;
    
    }//close the conditional for user logged
    
    }//close function
    Moderator bcworkz

    (@bcworkz)

    Your use of $total_users/$number for the total argument of paginate_links appears wrong. $total_users is the total of all users, while the users returned by get_users() are only student roles. You probably want to assign the value keyed as ‘student’ from the count_users() array.

    You also should not echo content from a shortcode handler, it usually ends up in the wrong place. You should accumulate all output in a string such as is done for the user content. At the end, all the content is returned in one single string containing all content.

    Hi, Thanks bcworkz.

    Actually there are many errors with the code, mainly in pagination. She appears in the wrong place and is not possible stylize.

    I admit I’m new to programming and PHP and unfortunately in the WordPress Codex on the documentation of get_users not explain how to use pagination.

    I followed this tutorial, but it was published in 2011 and does not talk about paging.

    http://theme.fm/2011/08/how-to-create-an-authors-list-shortcode-in-wordpress-1534/

    Do you know any tutorial explaining about it?

    Thanks. 🙂

    Moderator bcworkz

    (@bcworkz)

    A lot of the arguments for get_users() are the same as for class WP_Query. This article may help explain things:Making Custom Queries using Offset and Pagination.

    Hi bcworkz,

    Thanks for the tip, It is the information for I needed.

    But, I ended installing a plugin for the job, including for the search of users profile by custom field.

    The Plugin is: Members List Plugin

    Thanks.

Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘Pagination for shortcode for list of users’ is closed to new replies.