I’m creating a shortcode to display the list of users with a particular profile in WordPress.
But I can not enable or display the pagination. I have 25 users on my site and would like to display 5 profile users per page and include the pagination.
I added a new Role student, and multiple custom fields using Advanced Custom Fields for the student profile.
So I need to display a list of students as the appropriate fields. So far so good, the problem is with paging that I could not enable.
Here a 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
I realise that you say that you can’t enable paging of users, but if it’s a case of you don’t know how, you can pass ‘number’ and ‘offset’ in the args array.
In your example to get page 2 of your users, set ‘number’ as ‘5’ and ‘offset’ as ‘5’.
If using those variables is not suitable you can always use a for loop with a count (instead of foreach) and insert a break every 5 iterations eg.
I don’t use pages in WordPress posts or pages too often, so I first did a test with this hand written markup. I used 26 users to purposefully get a last page with less than 5 students on it. Just to be certain.
WordPress produces 6 pages with links in both the Page and the Post editor. You didn’t specify which you were using.
To produce this markup with PHP, I created list of dummy students (A-Z) with this code since I could not produce your list.
I got this:
Which I pasted into a page to test.
Then I adjusted the
$students_per_page
variable to6
, which got me this:So, it looks like the algorithm works on different students per page, even when the final page is less than a full page.
NOTE: You will need to change the
wpse_98352_get_student_page()
function to produce your page data. I just used this markup to make testing possible. You will also have to stuff all this into the shortcode function.