4

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?

  • You have an SQL injection vulnerability in your code because you are not sanitizing the $search variable which comes from the user. – Magmatic Oct 23 '17 at 23:52
5

You must use $list_obj->prepare_items() before $list_obj->search_box('Search', 'search') function!

Example:

                        <form method="post">
                            <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
                            <?php $this->sales_obj->prepare_items();
                            $this->sales_obj->search_box('Search', 'search');
                            $this->sales_obj->display(); ?>
                        </form>
1

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.

0

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.

  • 1
    how can i passed value. what is input_id? – Renish Khunt Jul 7 '14 at 4:08
0

if you add some data on your table you will see the box. If it says "No items found" wordpress doesnt show the box. Add a data, box will appear.

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.