WP_User_Query için sayfalandırma bağlantıları nasıl görüntülenir?


10

Sanırım bununla neredeyse oradayım, ancak oluşturduğum yazarların bir dizinine göstermek için sayfalandırma bağlantılarını alamıyorum.

Kodum aşağıda, ancak çalışmak için yazarların sayfaları arasında gezinmek için bağlantıları almak nasıl bilmiyorum. Biri bana yardım edebilir mi? Bunun yararlı olabileceği hissine kapıldım, ancak nasıl uygulanacağını bilmiyorum:

paginate_links ()

Teşekkürler

Osu

    <?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? */ ?>

Ajax arıyorsanız o zaman burada ziyaret edin wordpress.stackexchange.com/questions/113379/…
Sabir Abdul Gafoor Shaikh

Yanıtlar:


17

Bu seni gerçekten yaklaştırmalı. Test etmedim, ancak birkaç kez kullandığım bir kurulumla neredeyse aynı.

/*
 * 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 Kod bölünmüş ve açıklanmış olsaydı çok sevinirim :)
kaiser

5
Orada, daha iyi yorumlar ekledik ve bir veya iki hatayı düzelttim :)
Pippin

Bu @Pippin için teşekkürler, stüdyoya geldiğimde deneyeceğim. Bir soru: admin_url'un 'sayfanızın yolu' bölümüne ne koyabilirim? Bu sitemin kökü mü?
Osu

Kullanıcılarınızı yönetici veya kullanıcı arabiriminde gösteren sayfa mı?
Pippin

1
İlginç bir yaklaşım. Burada 2 sorgu çalıştırdığınızı fark ettim: birincisi tüm kullanıcıları, ikincisi sadece uygun sayfada kullanıcıları. Yalnızca 1 sorgu kullandıysanız ve ardından sonuçları sayfalara bölmek için array_slice kullandıysanız daha iyi performans göstermez mi? Görünüşe göre aynı veriler üzerinde 2 farklı sorgu gerçekleştirdiğiniz için bir tanesini bırakarak bir miktar performans kaydedebilirsiniz.
codescribblr

11

Cevabı gerçekten Pippin kullanmamalısınız. Sorgu çok verimsiz. $user_count_queryörnekte tüm kullanıcı alanlarıyla birlikte veritabanınızdan betiğinize en fazla 999,999 kullanıcı dönebilir. Bu, siteniz yeterince büyüdüğünde / büyüdüğünde PHP için bellek ve / veya zaman sınırlarına kesinlikle çarpacaktır.

Ancak bu, 2012'deki tek çözüm olabilir.

İşte bunu yapmanın daha iyi bir yolu. Bu örnekte sadece bir sonraki ve bir önceki sayfaya sahibim ancak numaralandırılmış sayfa numaralandırmaya ihtiyacınız varsa, değişkenler bunu oluşturmak için oradadır. WordPress, WP_User_Query ile uyumlu bir sayfalama işlevine sahip değil (bildiklerime göre).

<?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>

Sayfa 2'yi gösteren örnek:

sayfa 2'den başlayarak kullanıcı tablosu


8/6/2018 Güncellemesi: Sonraki / Önceki yerine sayfa numaraları nasıl eklenir

Sonraki / önceki sayfa bağlantıları yerine sayfa numaralarına sahip olmak istiyorsanız, bunu nasıl ayarlayacağınız aşağıda açıklanmıştır. Sayıları sayfa bağlantılarıyla değiştirmeniz gerekeceğini unutmayın, bu örnekte sayıları tıklanmayacaktır ( https://stackoverflow.com/a/11274294/470480 , tutarlı miktarda orta sayı gösterecek ve eklenmeyecek şekilde değiştirilecek) bir sayfa atlanmadıkça "...").

Bu amaçla yeniden kullanılabilir bir işlev içeren gist dosyamı da görebilirsiniz .

$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} ";

Çıktı (sayfa 1'den 10'a kadar):

[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]

Katılıyorum. Pippin'in cevabı, mümkünse kaçınılması gereken db'de 2 vuruş gerektirir.
Sumo

1
Merhaba @ radley sustaire, bu harika bir çözüm, ancak "6 kullanıcının 2 görüntüleniyor" bölümünü sayfa başına gerçek kullanıcı aralığına değiştirmek için bir yol olup olmadığını merak ediyordum. Yani, sayfa 1 için "6'nın 1-2'sini görüntüleme", sayfa 2 için "3-4 / 6" ve sayfa 3 için "5-6 / 6" gibi bir şey. tüm sayfalar.
damienoneill2001

1
@ damienoneill2001 Bu iyi bir fikir, şöyle bir şeyle başlayabilirsiniz: $start_user_num = (($current_page-1) * $users_per_page) + 1;ve $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire

@RadleySustaire mükemmel, bunun için teşekkürler. İlk başta, aşağıdaki hata aldı: Call to a member function get_results() on a non-objectI değiştirilmiş böylece $end_user_numberetmek $start_user_num + ($users_per_page-1);ve bu sorun çözüldü. Tekrar teşekkürler!
damienoneill2001

Görünüşe göre yakında konuştum. Kullanıcıların tam bir listesini içermeyen son sayfaya geldiğimde, benim çözümümdeki yanlış rakamı açıkça gösteriyor $end_user_number. Çizim tahtasına geri dönelim, ha!
damienoneill2001

1

Tam kredi cevabı için @ radley-sustaire'a gitmeli, ama onunla küçük bir aksaklık tespit ettim, bu yüzden cevabın versiyonunu burada paylaşıyorum.

Sürümümle sonuçları konuma, anahtar kelimeye vb. Göre de filtreliyordum, bu nedenle bazı sayfaların '$ users_per_page' var. Örneğin, sayfa başına kullanıcılarım 10 gösterecek şekilde ayarlandıysa, ancak filtrenin sonuçları yalnızca 3 kullanıcı döndürdüyse, sayfanın üst kısmında '3 kullanıcının 10'unu gösteriliyor' var. Açıkçası bu mantıklı değildi, bu yüzden sonuç sayısının '$ users_per_page' değişkeninden daha yüksek olup olmadığını kontrol etmek için basit bir "if" ifadesi ekledim.

Radley, cevabınızı güncelleme ile düzenlerseniz, Pippin'in çözümünden daha iyi olduğunu düşündüğüm için doğru cevap olarak memnuniyetle oylayacağım.

Yani bu isteyen herkes için son kod.

<?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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.