性价比最高的香港ASP、PHP主机提供商
做网站,就上凡科建站

WordPress 为自定义表格/列表添加分页导航功能

Loading
0
Comodo SLL证书促销 - 免费ssl证书申请_ssl证书购买_ev ssl证书_https证书购买 - GDCA_数安时代

在 WordPress 主题或插件开发中,也许你需要制作一些表格或列表来显示一些数据,这样一来,你通常需要对这些数据进行分页。下面倡萌就分享一下制作分页导航的基本流程。最终的效果图:

pagination-for-tables-wpdaxue_com

步骤1:添加页码查询参数

获取 url 查询的页码,如果没有任何结果,就将页码设置为 1

1
$pagenum = isset($_GET['pagenum']) ? intval($_GET['pagenum']) :1;

步骤2:定义每页数据量和偏移量

现在我们需要设置每页显示的数据数量(limit)和 偏移量(offset),我们就是使用这两个参数从 MySQL 查询中获取相应的数据。

1
2
$limit = 10;
$offset = ( $pagenum - 1 ) * $limit;

如果你对 offset 感到困惑,那么你可能会在 PHPMyAdmin 看到过类似这样的查询命令 "SELECT * FROM `table_name` LIMIT 0, 10" ,这里是从数据库获取前 10 个数据,如果你想获取 下来的 10 个数据,那么就应该用 "LIMIT 10, 10" 。也就是说, Limit 后面的第一个数字就是 offset ,它告诉我们从哪里来获取下一批数据。

所以,上面的2行代码就可以动态设置 limit 和 offset。

步骤3:获取数据

现在我们需要通过 limit 和 offset 这两个变量从数据库对应的表中获取我们的数据,然后就可以按照意愿进行输出,比如输出为表格。

1
$entries = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}table_name LIMIT $offset, $limit" );

注:这步非常重要,代码只是基本的结构,在实际运用中,你需要明确指定从哪个数据库表查询哪些数据!

到这里,如果你在地址中修改 url 的 pagenum 参数,你就会发现,可以正常获取所需页码的数据了。

步骤4:输出分页导航

接下来获取页数和输入分页导航,WordPress 提供了一个函数 paginate_links() 用来输出分页导航。现在我们需要获取页面总数($total)和到底需要多少页($num_of_pages)才能显示所有数据。

1
2
$total = $wpdb->get_var( "SELECT COUNT(`id`) FROM {$wpdb->prefix}table_name" );
$num_of_pages = ceil( $total / $limit );

然后使用 paginate_links() 函数输出分页导航:

1
2
3
4
5
6
7
8
9
10
11
12
$page_links = paginate_links( array(
    'base' => add_query_arg( 'pagenum', '%#%' ),
    'format' => '',
    'prev_text' => __( '«', 'aag' ),
    'next_text' => __( '»', 'aag' ),
    'total' => $total,
    'current' => $pagenum
) );
 
if ( $page_links ) {
    echo '<div class="tablenav"><div class="tablenav-pages" style="margin: 1em 0">' . $page_links . '</div></div>';
}

你可以根据自己的实际需要修改输出的代码结构。

到这里,点击分页导航的页码,就会获取到相应的数据了。

样例

最终的代码样例大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
global $wpdb;
 
$pagenum = isset( $_GET['pagenum'] ) ? absint( $_GET['pagenum'] ) : 1;
$limit = 5;
$offset = ( $pagenum - 1 ) * $limit;
$entries = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}posts LIMIT $offset, $limit" );
 
echo '<div class="wrap">';
 
?>
<table class="widefat">
    <thead>
        <tr>
            <th scope="col" class="manage-column column-name" style="">Post Title</th>
            <th scope="col" class="manage-column column-name" style="">Date</th>
        </tr>
    </thead>
 
    <tfoot>
        <tr>
            <th scope="col" class="manage-column column-name" style="">Post Title</th>
            <th scope="col" class="manage-column column-name" style="">Date</th>
        </tr>
    </tfoot>
 
    <tbody>
        <?php if( $entries ) { ?>
 
            <?php
            $count = 1;
            $class = '';
            foreach( $entries as $entry ) {
                $class = ( $count % 2 == 0 ) ? ' class="alternate"' : '';
            ?>
 
            <tr<?php echo $class; ?>>
                <td><?php echo $entry->post_title; ?></td>
                <td><?php echo $entry->post_date; ?></td>
            </tr>
 
            <?php
                $count++;
            }
            ?>
 
        <?php } else { ?>
        <tr>
            <td colspan="2">No posts yet</td>
        </tr>
        <?php } ?>
    </tbody>
</table>
 
<?
 
$total = $wpdb->get_var( "SELECT COUNT(`id`) FROM {$wpdb->prefix}posts" );
$num_of_pages = ceil( $total / $limit );
$page_links = paginate_links( array(
    'base' => add_query_arg( 'pagenum', '%#%' ),
    'format' => '',
    'prev_text' => __( '«', 'aag' ),
    'next_text' => __( '»', 'aag' ),
    'total' => $num_of_pages,
    'current' => $pagenum
) );
 
if ( $page_links ) {
    echo '<div class="tablenav"><div class="tablenav-pages" style="margin: 1em 0">' . $page_links . '</div></div>';
}
 
echo '</div>';

本文所说的方法在网站后台和前台都是可用的,在这里需要提出的一点是,本例中使用页码参数名是 pagenum ,也就是 $_GET['pagenum'] 里用的,如果将其换为 $_GET['p'] ,就可能没办法在前台使用,因为和WordPress用来查询文章ID 的 p 冲突了,这是倡萌在移植某些插件功能到前台用户中心使用时发现的问题。

参考资料:http://tareq.wedevs.com/2011/07/simple-pagination-system-in-your-wordpress-plugins/ (地址已被和谐,请自己想办法访问)

支付宝扫码打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

MetInfo | 最适合企业网站建设的cms系统

关于 倡萌

一个疯狂的 WordPress 爱好者,喜欢折腾 WordPress 主题,分享 WordPress 资源。如果你也喜欢 WordPress,欢迎和我一起交流!

精彩推荐

WordPress函数:get_extended(获取扩展信息)

为WordPress的自定义菜单链接添加栏目图标

为WordPress的自定义菜单链接添加栏目图标

7 条评论

  1. 我要这样输出特定分类下文章标题
    怎么修改啊
    找了好几天了
    我修改这个代码的sql语言也没成功
    求大神回复

  2. 我0基础,不知道你说的这些代码在什么位置。如何更改啊。。你这个博客是WORDPRESS做的吗?首页那个功能,N多个模块是哪篇文章啊

  3. 不是这样子用的,你应该用WP_List_Table

  4. 学习了!!!!沙发哈哈哈

发表评论