我正在扩展Cache Images插件,其中包含一个带有域和该域中的许多图像。因此,没有可用于构建的等效现有表(在此问题的第一个版本中,我询问了一个包含帖子的表,但可以(也许)扩展现有的帖子表)。
我应该只是基于帖子概述页面,并以
<table class="widefat">
开头,还是现在有更好的功能来处理此问题?您是否知道我可以根据其工作进行分页的干净,空表示例?#1 楼
这是我通常使用的方法:<table class="widefat fixed" cellspacing="0">
<thead>
<tr>
<th id="cb" class="manage-column column-cb check-column" scope="col"></th> // this column contains checkboxes
<th id="columnname" class="manage-column column-columnname" scope="col"></th>
<th id="columnname" class="manage-column column-columnname num" scope="col"></th> // "num" added because the column contains numbers
</tr>
</thead>
<tfoot>
<tr>
<th class="manage-column column-cb check-column" scope="col"></th>
<th class="manage-column column-columnname" scope="col"></th>
<th class="manage-column column-columnname num" scope="col"></th>
</tr>
</tfoot>
<tbody>
<tr class="alternate">
<th class="check-column" scope="row"></th>
<td class="column-columnname"></td>
<td class="column-columnname"></td>
</tr>
<tr>
<th class="check-column" scope="row"></th>
<td class="column-columnname"></td>
<td class="column-columnname"></td>
</tr>
<tr class="alternate" valign="top"> // this row contains actions
<th class="check-column" scope="row"></th>
<td class="column-columnname">
<div class="row-actions">
<span><a href="#">Action</a> |</span>
<span><a href="#">Action</a></span>
</div>
</td>
<td class="column-columnname"></td>
</tr>
<tr valign="top"> // this row contains actions
<th class="check-column" scope="row"></th>
<td class="column-columnname">
<div class="row-actions">
<span><a href="#">Action</a> |</span>
<span><a href="#">Action</a></span>
</div>
</td>
<td class="column-columnname"></td>
</tr>
</tbody>
</table>
希望有所帮助。
评论
这样也插入自动分页吗? (例如显示1-20后的帖子)
– Michiel Standaert
2011-12-7 14:50
@MichielStandaert号
– kaiser
14年6月14日在11:19
@MichielStandaert如果您想要分页结果,可以使用paginate_links
–倾斜
2014-09-26 22:09
谢谢 ! (但是我仍然问为什么他们不对行使用:odd而不是让我们每两行添加一个类...)
–扎卡里·达汉(Zachary Dahan)
16年3月15日在15:57
显然有“更好”的解决方案(就像这里的其他答案一样),但是对于快速基本的表,这正是我所追求的。谢谢!
– rinogo
19年11月1日在20:06
#2 楼
使用Core API不仅要使用其CSS,通常您只使用
WP_List_Table
类的实例。指南:
这也是WP工程师的指南-太多了,无法复制。
以及在线Smashing Magazine上的另一指南。
好处?
是的!
您可以添加分页,搜索框,动作以及您可以想象的(并能够编码的)任何魔术。
评论
小提示作为查看标记的链接,用于管理界面的类,而不仅仅是创建表的目标:github.com/bueltge/WordPress-Admin-Style
– Bueltge
13年4月4日在13:33
>该课程的访问被标记为私有。这意味着它不适合插件和主题开发人员使用,因为在将来的任何WordPress版本中,如有更改,恕不另行通知。如果您仍想使用该类,则应制作一个副本以供您自己的项目使用和分发,否则,后果自负。
–奥斯汀祈祷
17年5月20日在1:16
@AustinPray副本吗?不,请不要那样做。有可用的beta,RC和其他预发行版。只需更新您的实现/扩展即可。如果您真的必须横着走,那就自己写点更好的东西。核心代码不是那么好。
– kaiser
17年5月20日在23:13
@kaiser不要开枪,那不是我的话。我引用了WP Codex。尽管为每个Beta和RC注册永久性回归测试,听起来并没有比复制类好得多。我同意编写自己的简单课程是更好的方法。
–奥斯汀祈祷
17年5月22日在19:15
不幸的是,从Wordpress 5开始,这两个指南都过时了。我发现它在打乱东西时很困难(另外,《粉碎杂志》还存在明显的语法错误-有人无法熟练地复制和粘贴)。我还没有找到最新的替代方法(custom-list-table-example只是稍微好一点),而Codex遗漏了很多东西。通过查看Wordpress本身,我设法编写了一个简单的实现,尤其是class-wp-users-list-table.php,它几乎功能齐全,但比其他WP类更简单。
–古斯
20年6月7日在15:06
#3 楼
使用以下示例(作为插件编写)创建您的管理表:http://wordpress.org/extend/plugins/custom-list-table-example/
它使用内置的WP_List_Table类。
评论
我认为这应该是公认的答案。另请参见《粉碎杂志》中阐明类似方法的这篇文章:wp.smashingmagazine.com/2011/11/03/…
– julien_c
2012年10月10日13:09
#4 楼
您也可以使用此小插件查看WP中后端的可能性:https://github.com/bueltge/WordPress-Admin-Style#5 楼
对于那些希望实现WP_List_Table
的人,请注意,我发现的所有指南都已过时,并且可能会编写冗余代码或实际上要求您执行不再有效的操作。在某种程度上可行的例子。如果没有“指南”,它应该很容易理解,并且可以帮助您入门。
包括:
快速过滤器(视图)
搜索框
行操作
缺少:
页面大小配置(我实际上没有看到Wordpress页面使用此功能)
批量操作
下拉过滤器
class My_List_Table extends WP_List_Table {
function __construct() {
parent::__construct([
'singular' => 'employee',
'plural' => 'employees',
]);
}
function get_columns() {
return [
'name' => __('Name'),
'employer' => __('Employer'),
'rank' => __('Rank'),
'phone' => __('Telephone'),
'joined' => __('Join Date'),
];
}
/* Optional - without it no column is sortable */
public function get_sortable_columns() {
return [
// keys are "column_name" like above
// values are "order" field names as per what your data model needs
'name' => 'name',
'employer' => 'employer',
'rank' => 'rank',
'joined' => 'joined',
];
}
public function prepare_items() {
// support the search box
$search = @$_REQUEST['s'] ? wp_unslash(trim($_REQUEST['s']))) : '';
// get number of records per page setting from option storage
$per_page = $this->get_items_per_page('my_list_table_per_page');
// fill data array with your model items. In my implementation these
// are StdClass instances with various fields, but it can be anything
// we'll see in a minute how.
$this->items = get_model_items([
'offset' => ($this->get_pagenum()-1)*$per_page,
'count' => $per_page,
'orderby' => @$_GET["orderby"] ?: 'id', // default order field, if not specified
'order' => @$_GET["order"] ?: 'ASC', // default order direction
'search' => $search, // pass search field if set
'status' => @$_REQUEST['status'] // pass view filter, if set [see get_views()]
);
$this->set_pagination_args([
"total_items" => get_model_item_count(),
"per_page" => $per_page,
]);
// `get_model_item_count` should be the total number of records after
// filtering (views and search) but before paging. This may be hard/inefficient
// to do with MySQL. If you want to put the results of `COUNT(*)` here,
// no one will blame you.
}
public function column_default($item, $column_name) {
// default column presentation
// Most of my object fields are printable as is, so we have a generic
// method to handle that.
return $item->$column_name;
}
/* Optional, unless you have data that requires special formatting */
public function column_joined($item) {
// The 'joined' field is a DateTime object and can't be implicitly
// converted to string by the built-in logic, so we'll need to do it
return $item->joined->format("Y-m-d");
}
/* Optional - draw quick filters on top of the table */
public function get_views() {
$makelink = function($filter_val, $name) { // DRYing tool for view makers
$filter_name = 'status';
return '<a href="'
. esc_url(add_query_arg($filter_name, $filter_val)) . '" ' .
(@$_REQUEST[$filter_name]==$filter_val ?
'class="current" aria-current="page"' : ''). ">" .
$name . "</a>";
};
return [
'all' => $makelink(false, __('All')),
'green' => $makelink('green', __('Newbs')),
'pros' => $makelink('pro', __('Experts')),
'bofh' => $makelink('veteran', __('Crusty fellows')),
];
}
/* Optional: row actions */
public function handle_row_actions($item, $column_name, $primary) {
$out = parent::handle_row_actions($item, $column_name, $primary);
if ($column_name === $primary)
$out .= $this->row_actions([
'edit' => sprintf('<a href="%s">%s</a>',
add_query_arg('employee_id', $item->id, admin_url('admin.php?page=edit-employee')),
__("Edit")),
'delete' => sprintf('<a href="%s">%s</a>',
add_query_arg('employee_id', $item->id, admin_url('admin.php?page=delete-employee')),
__("Delete")),
]);
return $out;
}
}
然后管理页面功能(用于
add_menu_page
/ add_submenu_page
)可能如下所示: function drawAdminPage() {
$my_list_table = new My_List_Table();
$my_list_table->prepare_items();
?>
<div class="wrap">
<h1 class="wp-heading-inline"><?php _e('Admin Page Title')?></h1>
<hr class="wp-header-end">
<?php $my_list_table->views() ?>
<form id="employee-filter" method="get">
<input type="hidden" name="page" value="<?php echo $_REQUEST['page']?>">
<?php $my_list_table->search_box(__('Search'), 'employee') ?>
<?php $my_list_table->display(); ?>
</form>
</div>
<?php
}
评论
有您的支持。
– kaiser
20年9月9日在9:21
#6 楼
您可能要考虑在管理员的自定义帖子类型列表中添加过滤器?下面的链接答案显示了如何使用分类法进行操作,但是您可以轻松地在restrict_manage_posts
挂钩中使用其他条件:将分类法过滤器添加到自定义帖子类型的管理员列表中? br />
如果您还有其他问题,请告诉我。
评论
对于不清楚的问题,我深表歉意。在我的第一个示例中,它是一个帖子表,确实,我可以尝试使用现有的帖子表(即使我只想显示帖子标题,然后显示所有自定义列?)。但是现在我用一个具体的例子来编辑我的问题:我有一个域表,所以没有等效的现有表可以扩展。
– Jan Fabry
2010年9月7日于7:50
@Jan:嗯。是的,我认为您已经发现了事实,除了编写(重复的)HTML外,没有其他好的封装方法可以做到这一点。我经常遇到同样的问题。也许在trac上创建一个票证,要求进行此增强,并在此处链接URL /票证#,以便我们提供支持。
– MikeSchinkel
2010-09-07 23:07
评论
WordPress UI样式指南有一个新博客,您可能会发现有帮助。 dotorgstyleguide.wordpress.com/outline自我说明:scribu在WP 3.1中添加了一个新的ajaxified表系统,其基类为WP_List_Table。可以使用有关此问题的信息来更新此问题。