WP_User_Query에 대한 페이지 매김 링크를 표시하는 방법은 무엇입니까?


10

나는 이것에 거의 거기에 있다고 생각하지만, 내가 만들고있는 저자의 디렉토리에 대해 페이지 매김 링크를 얻을 수 없습니다.

내 코드는 아래에 있지만 링크를 작성하여 저자의 페이지를 탐색하는 방법을 모르겠습니다. 누구든지 나를 도울 수 있습니까? 이것이 쓸모가 있다고 생각하지만 그것을 구현하는 방법을 모르겠습니다.

paginate_links ()

감사

오스

    <?php 
/* ****************************************************************** */
                        /* !LIST AUTHORS */
/* ****************************************************************** */ 

// THANKS TO:
// http://www.mattvarone.com/wordpress/list-users-with-wp_user_query/

// pagination
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // Needed for pagination
$paged -= 1;
$limit = 2;
$offset = $paged * $limit;

// prepare arguments
$args  = array(
    // search only for Authors role
    'role'      => 'Subscriber',
    // order results by display_name
    'orderby'   => 'display_name',
    // return all fields
    'fields'    => 'all_with_meta',
    'number'    => $limit,
    'offset'    => $offset      
);
// Create the WP_User_Query object
$wp_user_query = new WP_User_Query($args);
// Get the results
$authors = $wp_user_query->get_results();
// Check for results
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // loop trough each author
    foreach ($authors as $author)
    {
        $author_info = get_userdata($author->ID); ?>

        <span style="float:left;padding:0 5px 0 0;"><?php echo get_avatar( $author->ID, 50 ); /* http://codex.wordpress.org/Function_Reference/get_avatar */ ?></span>
        <span class="fn"><strong>First name</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Last name</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Email address</strong> : <a href="mailto:<?php echo $author_info->user_email; ?>"><?php echo $author_info->user_email; ?></a></span><br />
        <span class="we"><strong>Website</strong> : <a href="<?php echo $author_info->user_url; ?>"><?php echo $author_info->user_url; ?></a></span><br />

        <span class="de"><strong>Bio</strong> :<br /><?php echo $author_info->description ; ?></span>
        <div class="clear">&nbsp;</div>

    <?php 
    }
    echo '</div>';
} else {
    echo 'No authors found';
}
?>

<?php /* WHAT DO I PUT HERE TO CREATE THE PAGINATION LINKS? */ ?>

당신이 아약스를 찾고 있다면 여기에 방문 wordpress.stackexchange.com/questions/113379/...
사비 압둘 Gafoor 샤이 크

답변:


17

이것은 당신을 정말로 가깝게해야합니다. 테스트하지는 않았지만 몇 번 사용한 설정과 거의 동일합니다.

/*
 * We start by doing a query to retrieve all users
 * We need a total user count so that we can calculate how many pages there are
 */

$count_args  = array(
    'role'      => 'Subscriber',
    'fields'    => 'all_with_meta',
    'number'    => 999999      
);
$user_count_query = new WP_User_Query($count_args);
$user_count = $user_count_query->get_results();

// count the number of users found in the query
$total_users = $user_count ? count($user_count) : 1;

// grab the current page number and set to 1 if no page number is set
$page = isset($_GET['p']) ? $_GET['p'] : 1;

// how many users to show per page
$users_per_page = 5;

// calculate the total number of pages.
$total_pages = 1;
$offset = $users_per_page * ($page - 1);
$total_pages = ceil($total_users / $users_per_page);


// main user query
$args  = array(
    // search only for Authors role
    'role'      => 'Subscriber',
    // order results by display_name
    'orderby'   => 'display_name',
    // return all fields
    'fields'    => 'all_with_meta',
    'number'    => $users_per_page,
    'offset'    => $offset // skip the number of users that we have per page  
);

// Create the WP_User_Query object
$wp_user_query = new WP_User_Query($args);

// Get the results
$authors = $wp_user_query->get_results();

// check to see if we have users
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // loop trough each author
    foreach ($authors as $author)
    {
        $author_info = get_userdata($author->ID); ?>

        <span style="float:left;padding:0 5px 0 0;"><?php echo get_avatar( $author->ID, 50 ); /* http://codex.wordpress.org/Function_Reference/get_avatar */ ?></span>
        <span class="fn"><strong>First name</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Last name</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Email address</strong> : <a href="mailto:<?php echo $author_info->user_email; ?>"><?php echo $author_info->user_email; ?></a></span><br />
        <span class="we"><strong>Website</strong> : <a href="<?php echo $author_info->user_url; ?>"><?php echo $author_info->user_url; ?></a></span><br />

        <span class="de"><strong>Bio</strong> :<br /><?php echo $author_info->description ; ?></span>
        <div class="clear">&nbsp;</div>

    <?php 
    }
    echo '</div>';
} else {
    echo 'No authors found';
}

// grab the current query parameters
$query_string = $_SERVER['QUERY_STRING'];

// The $base variable stores the complete URL to our page, including the current page arg

// if in the admin, your base should be the admin URL + your page
$base = admin_url('your-page-path') . '?' . remove_query_arg('p', $query_string) . '%_%';

// if on the front end, your base is the current page
//$base = get_permalink( get_the_ID() ) . '?' . remove_query_arg('p', $query_string) . '%_%';

echo paginate_links( array(
    'base' => $base, // the base URL, including query arg
    'format' => '&p=%#%', // this defines the query parameter that will be used, in this case "p"
    'prev_text' => __('&laquo; Previous'), // text for previous page
    'next_text' => __('Next &raquo;'), // text for next page
    'total' => $total_pages, // the total number of pages we have
    'current' => $page, // the current page
    'end_size' => 1,
    'mid_size' => 5,
));

2
+1 코드가 분리되고 설명된다면 즐거웠을 것이다 :)
kaiser

5
더 나은 의견을 추가하고 버그를 수정했습니다 :)
Pippin

이 @Pippin에 감사드립니다. 스튜디오에 들어가면 시험해 볼 것입니다. 한 가지 질문 : admin_url의 'your-page-path'부분에 무엇을 넣어야합니까? 내 사이트의 루트입니까?
Osu

관리자 또는 프론트 엔드에 사용자를 표시하는 페이지입니까?
Pippin

1
재미있는 접근법. 여기에 두 가지 쿼리를 실행하는 것으로 나타났습니다. 첫 번째는 모든 사용자를 가져오고 두 번째는 해당 페이지의 사용자 만 가져옵니다. 하나의 쿼리 만 사용한 다음 array_slice를 사용하여 결과를 페이지로 분할하면 성능이 좋지 않습니까? 동일한 데이터에 대해 2 개의 서로 다른 쿼리를 수행하므로 하나의 성능을 떨어 뜨릴 수 있습니다.
codescribblr

11

Pippin의 답변을 실제로 사용해서는 안됩니다. 쿼리는 매우 비효율적입니다. $user_count_query이 예에서는 모든 사용자 필드와 함께 데이터베이스에서 스크립트로 최대 999,999 명의 사용자를 스크립트로 반환 할 수 있습니다. 사이트가 충분히 커지면 PHP에 대한 메모리 및 / 또는 시간 제한에 반드시 도달합니다.

그러나 그것은 2012 년에 유일한 해결책이었을 것입니다.

여기에 더 좋은 방법이 있습니다. 이 예제에서는 다음 페이지와 이전 페이지 만 얻었 지만 번호 매김이 필요한 경우 변수를 작성합니다. WordPress에는 WP_User_Query와 호환되는 페이지 매김 기능이 없습니다 (내 지식으로는).

<?php

// Pagination vars
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 2; // RAISE THIS AFTER TESTING ;)

$args = array(
    'number' => $users_per_page, // How many per page
    'paged' => $current_page // What page to get, starting from 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // How many users we have in total (beyond the current page)
$num_pages = ceil($total_users / $users_per_page); // How many pages of users we will need

?>
    <h3>Page <?php echo $current_page; ?> of <?php echo $num_pages; ?></h3>
    <p>Displaying <?php echo $users_per_page; ?> of <?php echo $total_users; ?> users</p>

    <table>
        <thead>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Email</th>
            </tr>
        </thead>

        <tbody>
            <?php
            if ( $users->get_results() ) foreach( $users->get_results() as $user )  {
                $firstname = $user->first_name;
                $lastname = $user->last_name;
                $email = $user->user_email;
                ?>
                <tr>
                    <td><?php echo esc_html($firstname); ?></td>
                    <td><?php echo esc_html($lastname); ?></td>
                    <td><?php echo esc_html($email); ?></td>
                </tr>
                <?php
            }
            ?>
        </tbody>
    </table>

    <p>
        <?php
        // Previous page
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Previous Page</a>';
        }

        // Next page
        if ( $current_page < $num_pages ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page+1)) .'">Next Page</a>';
        }
        ?>
    </p>

2 페이지를 보여주는 예 :

2 페이지에서 시작하는 사용자 테이블


2018 년 6 월 8 일 업데이트 : 다음 / 이전 대신 페이지 번호를 추가하는 방법

다음 / 이전 페이지 링크 대신 페이지 번호 를 가지려면 다음을 설정하십시오. 당신은 그들이이 예에서는 클릭 할 수 없습니다 페이지의 링크 수를 교체해야합니다 것을 참고 (에 따라 https://stackoverflow.com/a/11274294/470480 추가 중간 숫자의 일관된 금액을 표시하지 수정, 페이지를 실제로 건너 뛰지 않는 한 "...").

이 목적을 위해 재사용 가능한 기능을 포함하는 내 요지 파일 도 볼 수 있습니다 .

$current_page = 5; // Example
$num_pages = 10; // Example

$edge_number_count = 2; // Change this, optional

$start_number = $current_page - $edge_number_count;
$end_number = $current_page + $edge_number_count;

// Minus one so that we don't split the start number unnecessarily, eg: "1 ... 2 3" should start as "1 2 3"
if ( ($start_number - 1) < 1 ) {
    $start_number = 1;
    $end_number = min($num_pages, $start_number + ($edge_number_count*2));
}

// Add one so that we don't split the end number unnecessarily, eg: "8 9 ... 10" should stay as "8 9 10"
if ( ($end_number + 1) > $num_pages ) {
    $end_number = $num_pages;
    $start_number = max(1, $num_pages - ($edge_number_count*2));
}

if ($start_number > 1) echo " 1 ... ";

for($i=$start_number; $i<=$end_number; $i++) {
    if ( $i === $current_page ) echo " [{$i}] ";
    else echo " {$i} ";
}

if ($end_number < $num_pages) echo " ... {$num_pages} ";

출력 (1 ~ 10 페이지) :

[1]  2  3  4  5  ... 10 
1  [2]  3  4  5  ... 10 
1  2  [3]  4  5  ... 10 
1  2  3  [4]  5  ... 10 

1 ...  3  4  [5]  6  7  ... 10 
1 ...  4  5  [6]  7  8  ... 10 

1 ...  6  [7]  8  9  10
1 ...  6  7  [8]  9  10
1 ...  6  7  8  [9]  10
1 ...  6  7  8  9  [10]

동의한다. Pippin의 답변은 db에서 두 번의 히트가 필요하며 가능한 경우 피해야합니다.
스모

1
안녕하세요 @ radley-sustaire, 이것은 훌륭한 솔루션이지만 "6 명의 사용자 표시 2"부분을 페이지 당 실제 사용자 범위로 변경하는 방법이 있는지 궁금합니다. 따라서 1 페이지의 "1/2/6 표시", 2 페이지의 "3-4 / 6"및 3 페이지의 "5-6 / 6"과 같이 표시됩니다. 현재 "2/6"만 표시됩니다. 모든 페이지에.
damienoneill2001

1
@ damienoneill2001 좋은 생각 입니다. 다음 $start_user_num = (($current_page-1) * $users_per_page) + 1;과 같이 시작할 수 있습니다 $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire

@RadleySustaire 훌륭합니다. 감사합니다. 처음에, 나는 다음과 같은 오류가 발생 : Call to a member function get_results() on a non-objectI 개정 그래서 $end_user_number$start_user_num + ($users_per_page-1);그 문제를 해결했다. 다시 감사합니다!
damienoneill2001

내가 곧 말했어. 전체 사용자 목록이 포함되어 있지 않은 최종 페이지에 도착하면 $end_user_number솔루션에 대한 잘못된 그림이 표시 됩니다. 드로잉 보드로 돌아와, 하!
damienoneill2001

1

그의 답변에 대한 전체 크레딧은 @ radley-sustaire에게 가야하지만 작은 결함을 발견하여 여기에 답변의 버전을 공유하고 있습니다.

내 버전에서는 위치, 키워드 등으로 결과를 필터링하여 일부 페이지가 '$ users_per_page'var보다 결과가 적었습니다. 예를 들어 페이지 당 사용자 수가 10으로 표시되었지만 필터 결과에 3 명의 사용자 만 반환 된 경우 페이지 상단에 '3 명의 사용자 10 명 표시'가 표시됩니다. 분명히 이것은 의미가 없었으므로 결과 개수가 '$ users_per_page'변수보다 높은지 확인하기 위해 간단한 "if"문을 추가했습니다.

Radley, 업데이트로 답변을 편집하면 Pippin의 솔루션보다 낫다고 생각하는 정답으로 기꺼이 투표합니다.

이 코드는 원하는 사람을위한 최종 코드입니다.

<?php

// Pagination vars
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 10;

$args = array(
    'number' => $users_per_page, // How many per page
    'paged' => $current_page // What page to get, starting from 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // How many users we have in total (beyond the current page)
$num_pages = ceil($total_users / $users_per_page); // How many pages of users we will need

if ($total_users < $users_per_page) {$users_per_page = $total_users;}

?>
    <h3>Page <?php echo $current_page; ?> of <?php echo $num_pages; ?></h3>
    <p>Displaying <?php echo $users_per_page; ?> of <?php echo $total_users; ?> users</p>

    <table>
        <thead>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Email</th>
            </tr>
        </thead>

        <tbody>
            <?php
            if ( $users->get_results() ) foreach( $users->get_results() as $user )  {
                $firstname = $user->first_name;
                $lastname = $user->last_name;
                $email = $user->user_email;
                ?>
                <tr>
                    <td><?php echo esc_html($firstname); ?></td>
                    <td><?php echo esc_html($lastname); ?></td>
                    <td><?php echo esc_html($email); ?></td>
                </tr>
                <?php
            }
            ?>
        </tbody>
    </table>

    <p>
        <?php
        // Previous page
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Previous Page</a>';
        }

        // Next page
        if ( $current_page < $num_pages ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page+1)) .'">Next Page</a>';
        }
        ?>
    </p>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.