Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm using wordpress 3.8 and a custom class derived from WP_List_Table. Why is there no search form?

My Plugin admin page (using WP_List_Table)

My code in plugin class:

function __construct()
            {
                register_activation_hook( __FILE__, array( $this, 'swb_plugin_install' ) );
                register_deactivation_hook( __FILE__, array( $this, 'swb_plugin_deactivate' ) );
                register_uninstall_hook( __FILE__, array( $this, 'swb_plugin_remove' ) );

                add_action( 'wp_head', array( $this, 'swb_header' ) );
                add_action( 'admin_menu', array( $this, 'swb_admin_page' ) );
                add_action( 'admin_enqueue_scripts', array( $this, 'swb_admin_script' ) );
            }

    function swb_admin_resellers()
        {
            $list_obj = new SWB_Resellers_List_Table();
            if( isset($_POST['s']) ){
                $list_obj->prepare_items($_POST['s']);
            } else {
                $list_obj->prepare_items();
            }
            echo '<div class="wrap"><h2>Resellers List</h2>';
            ?>
            <form method="post">
                <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
                <?php $list_obj->search_box('search reseller(s)', 'search_id'); ?>
                <?php $list_obj->display(); ?>
            </form></div>
            <?php
        }

function swb_admin_page()
        {
            add_menu_page( '', 'Smarts Web Builder', 'activate_plugins', 'swb_plugin_root', array( $this, 'swb_admin_settings' ) );
            add_submenu_page( 'swb_plugin_root', 'SWB General Setting', 'General Settings', 'activate_plugins', 'swb_plugin_root', array( $this, 'swb_admin_settings' ) );
            add_submenu_page( 'swb_plugin_root', 'SWB Resellers List', 'Resellers', 'activate_plugins', 'swb_resellers', array( $this, 'swb_admin_resellers' ) );
            add_submenu_page( 'swb_plugin_root', 'SWB Licenses List', 'Licenses', 'activate_plugins', 'swb_licenses', array( $this, 'swb_admin_licenses' ) );
            add_submenu_page( 'swb_plugin_root', 'SWB Customers List', 'Customers', 'activate_plugins', 'swb_customers', array( $this, 'swb_admin_customers' ) );
            add_submenu_page( 'swb_plugin_root', 'SWB Themes', 'Manage Themes', 'activate_plugins', 'swb_themes', array( $this, 'swb_admin_themes' ) );
            add_submenu_page( 'swb_plugin_root', 'SWB Plugins', 'Manage Plugins', 'activate_plugins', 'swb_plugins', array( $this, 'swb_admin_plugins' ) );
        }

The class which extends WP_List_Table:

if(!class_exists( 'SWB_Resellers_List_Table' ) )
{
    class SWB_Resellers_List_Table extends WP_List_Table
    {
        function __construct()
        {
            parent::__construct(array(
                'singular' => 'wp_list_text_link',
                'plural' => 'wp_list_test_links',
                'ajax' => false
            ));
        }

        function get_columns()
        {
            return $column = array(
                'col_name' => __('Real Name'),
                'col_username' => __('Username'),
                'col_contact_no' => __('Contact No.'),
                'col_email' => __('Email'),
                'col_active' => __('Is Active?'),
                'col_registered_time' => __('Registered'),
                'col_modified_time' => __('Last Modified')
            );
        }

        public function get_sortable_columns()
        {
            return $sortable = array(
                'col_name' => array(
                    'name',
                    false
                ),
                'col_username' => array(
                    'username',
                    false
                ),
                'col_email' => array(
                    'email',
                    false
                ),
                'col_active' => array(
                    'active',
                    false
                ),
                'col_registered_time' => array(
                    'registered_time',
                    false
                ),
                'col_modified_time' => array(
                    'modified_time',
                    false
                )
            );
        }

        function prepare_items($search='')
        {
            global $wpdb;

            $table = $wpdb->prefix . SWB_TABLE_RESELLER;
            $join1 = $wpdb->prefix . "wlm_user_options";
            $join2 = $wpdb->users;

            $short_table = "T1";
            $short_join1 = "T2";
            $short_join2 = "T3";

            $column = "{$short_table}.reseller_id reseller_id,
                {$short_table}.user_id user_id,
                {$short_table}.active active,
                {$short_table}.modified_time modified_time,
                (SELECT {$short_join1}.option_value FROM {$join1} {$short_join1} WHERE {$short_join1}.option_name='custom_real_name' AND {$short_join1}.user_id={$short_table}.user_id) name,
                (SELECT {$short_join1}.option_value FROM {$join1} {$short_join1} WHERE {$short_join1}.option_name='custom_contact_no' AND {$short_join1}.user_id={$short_table}.user_id) contact_no,
                {$short_join2}.user_login username,
                {$short_join2}.user_email email,
                {$short_join2}.user_registered registered_time";
            $on1 = "{$short_join2}.ID={$short_table}.user_id";

            $where = "";
            $where .= !empty($_POST['name']) ? "name=" . trim($_POST['name']) : null;
            $where .= !empty($_POST['username']) ? "username=" . trim($_POST['username']) : null;
            if(!empty($search)){
                if( !empty($where) )    $where .= " AND ";
                $where = "(name LIKE '%{$search}%' OR username LIKE '%{$search}%')";
            }
            if( !empty($where) )    $where = " WHERE " . $where;

            $ordercolumn = !empty($_GET['orderby']) ? trim($_GET['orderby']) : null;
            $orderdirection = !empty($_GET['order']) ? trim($_GET['order']) : null;
            $orderby = "{$ordercolumn} {$orderdirection}";
            if( !empty($orderby) )  $orderby = "ORDER BY " . $orderby;

            $query = "SELECT {$column} FROM {$table} {$short_table} JOIN {$join1} {$short_join1} JOIN {$join2} {$short_join2} ON {$on1}{$where}{$order_by}";

            $totalitems = $wpdb->query($query);

            $perpage = 10;

            $paged = !empty($_GET["paged"]) ? intval($_GET["paged"]) : '';

            if (empty($paged) || !is_numeric($paged) || $paged <= 0) {
            $paged = 1;
            }

            $totalpages = ceil($totalitems / $perpage);

            if (!empty($paged) && !empty($perpage)) {
            $offset = ($paged - 1) * $perpage;
            $query .= ' LIMIT ' . ( int ) $offset . ',' . ( int ) $perpage;
            }

            // Register page
            $this->set_pagination_args(
                array(
                    "total_items" => $totalitems,
                    "total_pages" => $totalpages,
                    "per_page" => $perpage
                )
            );

            // Register column
            $columns               = $this->get_columns();
            $hidden                = array();
            $sortable              = $this->get_sortable_columns();
            $this->_column_headers = array(
                $columns,
                $hidden,
                $sortable
            );
            // var_dump($this);
            // echo $query;

            // Fetch items
            $this->items = $wpdb->get_results($query);

        }
    }

    function display_rows()
    {
        $records = $this->items;
        $columns = null;
        $hidden  = null;
        list($columns, $hidden) = $this->get_column_info();

        if (!empty($records)) {
            foreach ($records as $rec) {
                echo '<tr id="swb-reseller-row-' . $rec->reseller_id . '">';
                foreach ($columns as $column_name => $column_display_name) {
                $class = "class='{$column_name} column-{$column_name}'";
                    $style = "";
                    if (in_array($column_name, $hidden))
                        $style = ' style="display:none;"';
                    $attributes = $class . $style;

                    switch ($column_name) {
                        case "col_name":
                            echo '<td ' . $attributes . '>' . stripslashes($rec->name) . '</td>';
                            break;
                        case "col_username":
                            echo '<td ' . $attributes . '>' . stripslashes($rec->username) . '</td>';
                            break;
                        case "col_contact_no":
                            echo '<td ' . $attributes . '>' . stripslashes($rec->contact_no) . '</td>';
                            break;
                        case "col_email":
                            echo '<td ' . $attributes . '>' . stripslashes($rec->email) . '</td>';
                            break;
                        case "col_active":
                            $active = ( intval($rec->active) == 1 ) ? 'Yes' : 'No';
                            echo '<td ' . $attributes . '>' . $active . '</td>';
                            break;
                        case "col_registered_time":
                            echo '<td ' . $attributes . '>' . date("F j, Y g:i a", stripslashes($rec->registered_time)) . '</td>';
                            break;
                        case "col_modified_time":
                            echo '<td ' . $attributes . '>' . date("F j, Y g:i a", stripslashes($rec->modified_time)) . '</td>';
                            break;
                    }
                }
                echo '</tr>';
            }
        }
    }
}

I don't know why the search box doesn’t show up. What is missing?

share|improve this question

2 Answers 2

Take a look at the 'wp_list_table' search_box:

function search_box( $text, $input_id ) {
    if ( empty( $_REQUEST['s'] ) && !$this->has_items() )
        return;

    $input_id = $input_id . '-search-input';

    if ( ! empty( $_REQUEST['orderby'] ) )
        echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
    if ( ! empty( $_REQUEST['order'] ) )
        echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
    if ( ! empty( $_REQUEST['post_mime_type'] ) )
        echo '<input type="hidden" name="post_mime_type" value="' . esc_attr( $_REQUEST['post_mime_type'] ) . '" />';
    if ( ! empty( $_REQUEST['detached'] ) )
        echo '<input type="hidden" name="detached" value="' . esc_attr( $_REQUEST['detached'] ) . '" />';
?>
<p class="search-box">
<label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
<input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>" />
<?php submit_button( $text, 'button', false, false, array('id' => 'search-submit') ); ?>
</p>
<?php
}

The if(empty($_REQUEST['s']) && !$this->has_items() part may be blocking the search_box appearance.

share|improve this answer
    
how can i passed value. what is input_id? –  renishkhunt Jul 7 at 4:08

I solved this by overrriding the search_box() function with the following:

 public function search_box( $text, $input_id ) { ?>
    <p class="search-box">
      <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
      <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>" />
      <?php submit_button( $text, 'button', false, false, array('id' => 'search-submit') ); ?>
  </p>
<?php }

Place this function inside your custom WP_List_Tables class and it will solve the issue.

share|improve this answer

Your Answer

 
discard

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.