WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am using the WP_List_Table class and I added the links for the actions like this:

function get_bulk_actions() {
        $actions = array();

        $actions['approv'] ='<a href="#">'.__( 'Approve' ).'</a>';
                $actions['reject'] = '<a href="#">'.__( 'Reject' ).'</a>';
                $actions['delete'] = '<a href="#">'.__( 'Delete' ).'</a>';
                $actions['view'] = '<a href="#">'.__( 'View' ).'</a>';

        return $actions;

Then I display them in the display_row() function like this:

$actions = $this->get_bulk_actions();
echo $this->row_actions( $actions );

Now I am wondering how to add custom actions to those links I created. Is there anyway where I can send the variables to a page? To do the DB handling of these links and repopulate the WP_List_Table that was created before i performed action.


Here is the Full Code for the WP_List_Table Class:

// Our class extends the WP_List_Table class, so we need to make sure that it's there
if( ! class_exists( 'WP_List_Table' ) ) {
    require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
class Link_List_Table extends WP_List_Table {

     * Constructor, we override the parent to pass our own arguments
     * We usually focus on three parameters: singular and plural labels, as well as whether the class supports AJAX.
     function __construct() {
         parent::__construct( array(
        'singular'=> 'wp_list_text_link', //Singular label
        'plural' => 'wp_list_test_links', //plural label, also this well be one of the table css class
        'ajax'  => true //We won't support Ajax for this table
        ) );
 * Define the columns that are going to be used in the table
 * @return array $columns, the array of columns to use with the table
function get_columns() {
    return $columns= array(
        'col_person_name' => 'Name',
                'col_business_name' => 'Bussiness Name' ,
                'col_person_email' => 'Email' , 
                'col_pserson_phone' => 'Contact Number',
                'col_request_status' => 'Status',
                'col_is_deleted' => 'Deleted'

 * Prepare the table with different parameters, pagination, columns and table elements
function prepare_items() {
    global $wpdb, $_wp_column_headers;
    $screen = get_current_screen();

    /* -- Preparing your query -- */
        $query = "SELECT * FROM approval_requests";

    /* -- Ordering parameters -- */
        //Parameters that are going to be used to order the result
        $orderby = !empty($_GET["orderby"]) ? mysql_real_escape_string($_GET["orderby"]) : 'ASC';
        $order = !empty($_GET["order"]) ? mysql_real_escape_string($_GET["order"]) : '';
        if(!empty($orderby) & !empty($order)){ $query.=' ORDER BY '.$orderby.' '.$order; }

    /* -- Pagination parameters -- */
        //Number of elements in your table?
        $totalitems = $wpdb->query($query); //return the total number of affected rows
        //How many to display per page?
        $perpage = 20;
        //Which page is this?
        $paged = !empty($_GET["paged"]) ? mysql_real_escape_string($_GET["paged"]) : '';
        //Page Number
        if(empty($paged) || !is_numeric($paged) || $paged<=0 ){ $paged=1; }
        //How many pages do we have in total?
        $totalpages = ceil($totalitems/$perpage);
        //adjust the query to take pagination into account
        if(!empty($paged) && !empty($perpage)){
            $query.=' LIMIT '.(int)$offset.','.(int)$perpage;

    /* -- Register the pagination -- */
        $this->set_pagination_args( array(
            "total_items" => $totalitems,
            "total_pages" => $totalpages,
            "per_page" => $perpage,
        ) );
        //The pagination links are automatically built according to those parameters

    /* -- Register the Columns -- */
        $columns = $this->get_columns();
                $hidden = array();
                $sortable = array();
                $this->_column_headers = array($columns, $hidden, $sortable);
    /* -- Fetch the items -- */
        $this->items = $wpdb->get_results($query);

 * Display the rows of records in the table
 * @return string, echo the markup of the rows

function display_rows() {

    //Get the records registered in the prepare_items method
    $records = $this->items;
          list( $columns, $hidden ) = $this->get_column_info();

    //Loop for each record
    if(!empty($records)){foreach($records as $rec){

        //Open the line
        echo '<tr id="record_'.$rec->sr_no.'">';
        foreach ( $columns as $column_name => $column_display_name ) {

            //Style attributes for each col
            $class = "class='$column_name column-$column_name'";
            $style = "";
            if ( in_array( $column_name, $hidden ) ) $style = ' style="display:none;"';
            $attributes = $class . $style;

            //edit link

            //Display the cell
            switch ( $column_name ) {
                case "col_person_name": 
                                    echo '<td '.$attributes.'>'.stripslashes($rec->person_name);
                                       $actions = $this->get_bulk_actions();

                    echo $this->row_actions( $actions );
                                     echo '</td>'; 
                case "col_business_name": echo '<td '.$attributes.'>'.stripslashes($rec->business_name).'</td>'; break;
                case "col_person_email": echo '<td '.$attributes.'>'.$rec->person_email.'</td>'; break;
                case "col_pserson_phone": echo '<td '.$attributes.'>'.$rec->pserson_phone.'</td>'; break;
                                case "col_request_status": echo '<td '.$attributes.'>'.$rec->request_status.'</td>'; break;
                case "col_is_deleted": echo '<td '.$attributes.'>'.$rec->is_deleted.'</td>'; break;

        //Close the line

function get_bulk_actions() {
        $actions = array();

        $actions['approv'] ='<a href="#">'.__( 'Approve' ).'</a>';
                $actions['reject'] = '<a href="#">'.__( 'Reject' ).'</a>';
                $actions['delete'] = '<a href="#">'.__( 'Delete' ).'</a>';
                $actions['view'] = '<a href="#">'.__( 'View' ).'</a>';

        return $actions;


function show_table(){

$wp_list_table = new Link_List_Table();

//Table of elements


share|improve this question
Which page are you adding these actions on? – Rutwick Gangurde Aug 2 '12 at 5:13
wait i will put the whole code to make it more understandable – PhpSeeker Aug 2 '12 at 5:14
I need to delete multiple selected in admin page. – user66754 Jan 29 '15 at 11:55

Maybe this tutorial at wpengineer will help:

WP_List_Table – a step by step guide: Bulk actions

share|improve this answer
Hi Latz - welcome to WPSE :) (na endlich!). Link only questions are flagged by the "community user bot". Please add a quote, as suggested here, or - even better - add a short explanation or summary or even some small example. Thanks. – kaiser Aug 2 '12 at 13:22

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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