45

What is the recommended way of creating a page with a table, in the style of the tables showing posts or users in the admin area?

I am expanding the Cache Images plugin, and it contains a table with domains and a number of images from that domain. So there is no equivalent existing table that I can build upon (in the first version of this question, I asked about a table with posts, but there I could (maybe) expand the existing post table).

Should I just base myself on the post overview page, and start with a <table class="widefat">, or are there better functions that handle this now? Do you know a clean, empty example of a table with paging that I could base my work on?

30

This is what I generally use:

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

Hope that helps.

  • is it also to have automatic pagination inserted like this? (e.g. showing post 1-20) – Michiel Standaert Dec 7 '11 at 14:50
  • @MichielStandaert No. – kaiser Jun 14 '14 at 11:19
  • @MichielStandaert if you want a paginated result you can use paginate_links – tiltdown Sep 26 '14 at 22:09
  • Thanks ! (But I still asking why they didn't use :odd for row instead of let us add a class each two rows ...) – Zachary Dahan Mar 15 '16 at 15:57
  • There are obviously "better" solutions (like the other answers here), but for a quick, basic table, this is exactly what I was after. Thank you! – rinogo Nov 1 at 20:06
26

Use the Core API, not only its CSS

Normally you just use an instance of the WP_List_Table class.

Guides:

Benefits?

YES!

You can add pagination, search boxes, actions and whatever magic you can imagine (and are able to code).

  • 1
    Small hint as link to see markup, classes for the admin interface, without only the goal to create tables: github.com/bueltge/WordPress-Admin-Style – bueltge Nov 4 '13 at 13:33
  • 1
    >This class's access is marked as private. That means it is not intended for use by plugin and theme developers as it is subject to change without warning in any future WordPress release. If you would still like to make use of the class, you should make a copy to use and distribute with your own project, or else use it at your own risk. – Austin Pray May 20 '17 at 1:16
  • @AustinPray A copy ? No, please do not do that. There are betas, RCs and other pre-releases of WP available. Just update your implementation/ extension. If you really have to go sideways, just write something better on your own. The core code isn't that good. – kaiser May 20 '17 at 23:13
  • @kaiser Don't shoot the messenger, those aren't my words. I was quoting from the WP Codex. Although signing yourself up for perpetual regression testing with every beta and RC doesn't sound much better than copying the class. I agree writing your own simple class is a better way forward. – Austin Pray May 22 '17 at 19:15
  • @AustinPray No hard feelings :) Codex is written by people like you and me. In fact, you can go now and revert that statement and people will quote it. – kaiser May 22 '17 at 19:36
13

Use this example (written as a plugin) to create your admin tables:

http://wordpress.org/extend/plugins/custom-list-table-example/

It uses the built-in WP_List_Table class.

4

Also you can use this small plugin for view the possibilities of the backend in WP: https://github.com/bueltge/WordPress-Admin-Style

0

You might want to consider adding a filter to your custom post type list in the admin? The linked answer below shows how to do it with a taxonomy but you could easily use other criteria in your restrict_manage_posts hook:

Let me know if you have more questions.

  • I apologize for the unclear question. In my first example it was a table of posts, and indeed, I could try to use the existing post table for that (even if I only want to show the post titles and then all custom columns?). But now I have edited my question with a concrete example: I have a table of domains, so there is no equivalent existing table that I can expand. – Jan Fabry Sep 7 '10 at 7:50
  • @Jan: Ah. Yes, I think you have found the truth, that there is not good encapsulated way to do this other than writing (duplicated) HTML. I've often had the same issue. Maybe create a ticket on trac asking for this enhancement and link the URL/ticket# here so we can support it. – MikeSchinkel Sep 7 '10 at 23:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.