WordPress.org

Ready to get started?Download WordPress

Forums

[resolved] Pagination for shortcode for list of users (6 posts)

  1. Joseneas
    Member
    Posted 1 year ago #

    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
  2. Joseneas
    Member
    Posted 1 year ago #

    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
  3. bcworkz
    Member
    Posted 1 year ago #

    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.

  4. Joseneas
    Member
    Posted 1 year ago #

    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. :)

  5. bcworkz
    Member
    Posted 1 year ago #

    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.

  6. Joseneas
    Member
    Posted 1 year ago #

    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.

Topic Closed

This topic has been closed to new replies.

About this Topic