建议使用表的形式创建页面的建议方式是什么,该表的样式在管理区域中显示帖子或用户?

我正在扩展Cache Images插件,其中包含一个带有域和该域中的许多图像。因此,没有可用于构建的等效现有表(在此问题的第一个版本中,我询问了一个包含帖子的表,但可以(也许)扩展现有的帖子表)。

我应该只是基于帖子概述页面,并以<table class="widefat">开头,还是现在有更好的功能来处理此问题?您是否知道我可以根据其工作进行分页的干净,空表示例?

评论

WordPress UI样式指南有一个新博客,您可能会发现有帮助。 dotorgstyleguide.wordpress.com/outline

自我说明:scribu在WP 3.1中添加了一个新的ajaxified表系统,其基类为WP_List_Table。可以使用有关此问题的信息来更新此问题。

#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