How to create a custom wp_list_table and bulk action in wordpress

Below is a example of how to create a  custom wp_list_table and bulk actions.. Change below code according to your requirements.

<?php
global $wpdb;
$table = $wpdb->prefix.'pp_buyer_package';

if($_REQUEST['action']=='delete' || $_REQUEST['action2']=='delete')
{
   
    if(isset($_REQUEST['pak_ids']) && $_REQUEST['_wpnonce']!='')
    {
        foreach($_REQUEST['pak_ids'] as $item)
        {   
            $end_time = strtotime('now');
            $cr_select = 'select * from '.$wpdb->prefix.'pp_package_buyer_relation where package_id = "'.$item.'" and end_time >= "'.$end_time.'"';
            $cr_result =  $wpdb->get_row($cr_select);
            if(count($cr_result) > 0){
                $_GET['msg'] = 'user_booked';
            }
            else{
                $wpdb->delete($table, array('package_id'=>$item));
                $_GET['msg']="delete";
            }
        }
    }
    else if($_REQUEST['pak_id'])
    {   
        $end_time = strtotime('now');
        $cr_select = 'select * from '.$wpdb->prefix.'pp_package_buyer_relation where package_id = "'.$_REQUEST['pak_id'].'" and end_time >= "'.$end_time.'"';
        $cr_result =  $wpdb->get_row($cr_select);
        if(count($cr_result) > 0){
            $_GET['msg'] = 'user_booked';
        }
        else{
            $wpdb->delete($table, array('package_id'=>$_REQUEST['pak_id']));
            $_GET['msg']="delete";
        }
    }
}
if($_REQUEST['action']=='add' || $_REQUEST['action']=='edit')
{
    $headline = 'Add New Package ';
    $pac_name = '';
    $pac_price = '';
    $pac_duration = '';
    $pac_duration_type = '';
    $pac_discount = '';
    $pac_credit_balance = '';
    if($_REQUEST['action']=='edit')
    {   
        $id = $_REQUEST['package_id'];
        $row_pp = $wpdb->get_row("SELECT * FROM ".$table." where package_id='".$id."'" );
        if(count($row_pp) > 0)
        {
            $pac_name = $row_pp->package_name;
            $pac_price = $row_pp->package_price;
            $pac_duration = $row_pp->package_duration;
            $pac_duration_type = $row_pp->package_duration_type;
            $pac_discount = $row_pp->package_discount;
            $pac_credit_balance = $row_pp->package_credit_balance;
            $pac_status = $row_pp->package_status;
        }
        $headline = 'Edit Package ';
    }
    if(isset($_POST['add_new_field']) && $_REQUEST['add_new_field']=='true')
    {
        $package_name = $_REQUEST['package_name'];
        $package_price = $_REQUEST['package_price'];
        $package_duration = $_REQUEST['package_duration'];
        $package_duration_type = $_REQUEST['package_duration_type'];
        $package_discount = $_REQUEST['package_discount'];
        $package_credit_balance = $_REQUEST['package_credit_balance'];
        if($_REQUEST['package_id']!='')
        {
            $id = $_REQUEST['package_id'];
            $ms = $wpdb->update($table,array('package_name'=>$package_name,'package_price'=>$package_price,'package_duration'=>$package_duration,'package_duration_type'=>$package_duration_type,'package_discount'=>$package_discount,'package_discount_type'=>'percentage','package_credit_balance'=>$package_credit_balance,'package_user_id'=>get_current_user_id(),'package_status'=>$pac_status,'date_added'=>date("Y-m-d")),array('package_id'=>$id));
            $msg = 'updated';
        }
        else
        {
            $ms = $wpdb->insert($table,array('package_name'=>$package_name,'package_price'=>$package_price,'package_duration'=>$package_duration,'package_duration_type'=>$package_duration_type,'package_discount'=>$package_discount,'package_discount_type'=>'percentage','package_credit_balance'=>$package_credit_balance,'package_user_id'=>get_current_user_id(),'package_status'=>'1','date_added'=>date("Y-m-d")));
            if($ms!=false)
            {
                $msg = 'inserted';
            }   
           
        }
        if($msg){ ?>
            <script>
                var admin_url ='<?php echo 'admin.php?page='.$_REQUEST['page'].'&msg='.$msg; ?>';
                window.location = admin_url;
            </script><?php   
        }
    }
?>
     <div class="wrap">
        <h2><?php  _e($headline,'package'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $_GET['page']; ?>">Back</a></h2>
        <div class="form">
            <form method="post" action="" onSubmit="return package_validate();">
                <table class="form-table" >
                    <tr valign="top">
                        <th scope="row"><label><?php _e('Package Name:','package'); ?></label></th>
                        <td><input type="text" name="package_name" id="package_name" value="<?php echo $pac_name; ?>" placeholder="<?php _e('Package Name','package'); ?>" />
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label><?php _e('Price:','package'); ?></label></th>
                        <td>
                        <input type="text" name="package_price" id="package_price" placeholder="<?php _e('Price','package'); ?>" value="<?php echo $pac_price; ?>" />
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label><?php _e('Duration:','package'); ?></label></th>
                        <td>
                        <select name="package_duration" id="package_duration">
                            <option value="">-Select Duration-</option>
                            <?php
                            for($i=1;$i<13;$i++){?>
                            <option value="<?php echo $i;?>" <?php if($i == $pac_duration){echo 'selected=selected';}?>><?php echo $i;?></option><?php
                            }
                            ?>
                        </select>
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label><?php _e('Duration Type:','package'); ?></label></th>
                        <td>
                        <select name="package_duration_type" id="package_duration_type">
                            <option value="">-Select Duration Type-</option>
                            <option value="month" <?php if('month' == $pac_duration_type){echo 'selected=selected';}?>>Monthly</option>
                            <option value="year" <?php if('year' == $pac_duration_type){echo 'selected=selected';}?>>Yearly</option>
                        </select>
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label><?php _e('Discount:','package'); ?></label></th>
                        <td>
                        <input type="text" name="package_discount" id="package_discount" placeholder="<?php _e('Discount','package'); ?>" value="<?php echo $pac_discount; ?>" />
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label><?php _e('Credit Balance:','package'); ?></label></th>
                        <td>
                        <input type="hidden" name="add_new_field" value="true">
                        <input type="text" name="package_credit_balance" id="package_credit_balance" placeholder="<?php _e('Credit Balance','package'); ?>" value="<?php echo $pac_credit_balance; ?>" />
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"></th>
                        <td>
                        <input type="submit" name="submit" value="<?php _e('Submit','package'); ?>" class="button-primary" />
                        </td>
                    </tr>
                </table>
            </form>
        </div>
    </div><?php
}
else
{
    if( ! class_exists( 'WP_List_Table' ) ) {
        require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
    }
    class Package_List_Table extends WP_List_Table {
       
        function __construct(){
            global $status, $page;
                parent::__construct( array(
                    'singular'  => "Package Panel List",     //singular name of the listed records
                    'plural'    => "Package Panel Lists",   //plural name of the listed records
                    'ajax'      => false        //does this table support ajax?
       
            ) );   
        }
       
        function get_columns(){
            $columns = array(
            'cb' => '<input type="checkbox" />',
            'package_id' => 'Package Id',
            'package_name' => 'Pacakge Name',
            'package_price' => 'Price (&pound;)',
            'package_duration'  =>'Duration',
            //'duration_type' => 'Duration Type',
            'package_discount' => 'Discount',
            'package_credit_balance' => 'Credit Balance',
            //'date_added' => 'Date Added',
            //'user_id' => 'User',
            'package_status' =>'Status',
            'package_prime' => 'Prime Package'
            //'action' =>'Action'
            );
            return $columns;
        }
        function get_sortable_columns() {
            $sortable_columns = array(
                'package_id'  => array('package_id',true),
                'package_name'  => array('package_name',false),
                'package_price'  => array('package_price',false),
                'package_duration'  => array('package_duration',false),
                'package_discount'  => array('package_discount',false),
                'package_credit_balance'  => array('package_credit_balance',false),
            );
            return $sortable_columns;
        }
        function get_bulk_actions() {
              $actions = array(
                'delete' => 'Delete'
              );
              return $actions;
        }
        function column_cb($item) {
            return sprintf(
                '<input type="checkbox" name="pak_ids[]" value="%s" />', $item->package_id
            );   
        }
       
        function column_package_id($item){
           
            $class = '<span class="add_ui_class"></span>';
            //Build row actions
            $actions = array(
                'edit'      => sprintf('<a href="?page=%s&action=%s&package_id=%s">Edit</a>',$_REQUEST['page'],'edit',$item->package_id),
                'delete'    => sprintf('<a href="?page=%s&action=%s&pak_id=%s">Delete</a>',$_REQUEST['page'],'delete',$item->package_id),
            );
           
            //Return the title contents
            return sprintf('%1$s %2$s %3$s',
                /*$2%s*/ $item->package_id,
                /*$3%s*/ $this->row_actions($actions),
                $class               
            );
        }
        function prepare_items() {
            global $wpdb,$_wp_column_headers;
            $prefix=$wpdb->prefix;
            $screen = get_current_screen();
           
            $search_text=!empty($_POST['s'])?$_POST['s']:"";
           
            $where="";
           
            if(!empty($search_text))
                $where="where package_name LIKE '%".$search_text."%' ";
           
            /* -- Preparing your query -- */
                $query = "SELECT * FROM ".$prefix."pp_buyer_package ".$where;
               
            /* -- Ordering parameters -- */
                //Parameters that are going to be used to order the result
                $orderby = !empty($_GET["orderby"]) ? ($_GET["orderby"]) : 'sort_order';
                $order = !empty($_GET["order"]) ? ($_GET["order"]) : 'ASC';
                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"]) ? ($_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)){
                    $offset=($paged-1)*$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 = $this->get_sortable_columns();
               
                $this->_column_headers = array($columns, $hidden, $sortable);
               
                $_wp_column_headers[$screen->id]=$columns;
               
               
            /* -- Fetch the items -- */
                $this->items = $wpdb->get_results($query);
               
            }

        function column_default( $item, $column_name ) {
            global $wpdb;
            switch( $column_name ) {
                case 'package_id':
                case 'package_name':
                case 'package_price':
                    return _e($item->$column_name,'package');   
                case 'package_duration':                   
                    return $item->$column_name.' '.$item->package_duration_type;
                case 'package_discount':
                case 'package_credit_balance':
                case 'date_added':
                    return _e($item->$column_name,'package');   
                case 'package_status':
                    if($item->package_status == 1){
                        $status = '<a href="javascript:;" id="'.$item->package_id.'" onclick="pp_status_off('.$item->package_id.')" title="Click to deactive"><img src="'.PP_PLUGIN_URL.'/assets/img/active.png" class="status_image" /></a>';    
                    }
                    else{
                        $status = '<a href="javascript:;" id="'.$item->package_id.'" onclick="pp_status_on('.$item->package_id.')" title="Click to active"><img src="'.PP_PLUGIN_URL.'/assets/img/deactive.png" class="status_image" /></a>';
                    }
                    //$status .= '<img src="'.PP_PLUGIN_URL.'/assets/img/ajax-loader.gif" class="status_image" style="display:none;" />';
                    return $status;
                /*case 'action':
                    $data = '<a href="admin.php?page='.$_REQUEST['page'].'&package_id='.$item->package_id.'&action=edit" title="Edit Package">Edit</a>';
                    return    $data;*/
                case 'package_prime':
                    if($item->package_prime == 1){
                        return '<input type="radio" id="prime_'.$item->package_id.'" value="1" name="package_prime" checked="checked" onclick="make_package_prime('.$item->package_id.')">';
                    }
                    else{
                        return '<input type="radio" id="prime_'.$item->package_id.'" value="1" name="package_prime" onclick="make_package_prime('.$item->package_id.')">';
                    }
                default:
                    return print_r( $item, true ) ; //Show the whole array for troubleshooting purposes
            }
         }
    }
    $wp_list_table = new Package_List_Table();
    $wp_list_table->prepare_items();
    ?>
   
    <div class="wrap">
    <h2><?php _e('Package Panel List  ','package'); ?><a href="?page=<?php echo $_REQUEST['page']; ?>&action=add" class="add-new-h2"> <?php _e('Add New Package','package'); ?></a></h2>
      <div id="response-message">
       <?php if($_GET['msg']){ ?>
       <div class="notice notice-success">
       <?php if($_GET['msg'] == 'inserted'){ ?>
            <p>Package successfully added.</p><?php
        }?>
        <?php if($_GET['msg'] == 'updated'){ ?>
            <p>Package successfully updated.</p><?php
        }?>
        <?php if($_GET['msg'] == 'delete'){ ?>
            <p>Package successfully deleted.</p><?php
        }?>
        <?php if($_GET['msg'] == 'user_booked'){ ?>
            <p>You can't delete this package.</p><?php
        }?>
        </div>
        <?php }?>
       </div>
      <form method="post">
        <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
        <?php $wp_list_table->search_box( 'search', 'search_id' );?>
        <?php $wp_list_table->display() ?>
      </form>
    </div><?php
}?>
<script type="text/javascript">
var home_url = '<?php echo PP_PLUGIN_URL;?>';
</script>

Comments

Popular posts from this blog

How to add a custom sorting or order by option on category archive or product archive page in woocommerce wordpress

How to add image option in nav menu in wordpress