Căsuța de căutare wp_list_table nu se afișează

20 dec. 2013, 10:05:08
Vizualizări: 15.7K
Voturi: 4

Folosesc wordpress 3.8 și o clasă personalizată derivată din WP_List_Table. De ce nu apare formularul de căutare?

Pagina de administrare a plugin-ului meu (folosind WP_List_Table)

Codul meu din clasa plugin-ului:

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>Listă Reselleri</h2>';
            ?>
            <form method="post">
                <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
                <?php $list_obj->search_box('caută reseller(i)', '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', 'Setări Generale SWB', 'Setări Generale', 'activate_plugins', 'swb_plugin_root', array( $this, 'swb_admin_settings' ) );
            add_submenu_page( 'swb_plugin_root', 'Listă Reselleri SWB', 'Reselleri', 'activate_plugins', 'swb_resellers', array( $this, 'swb_admin_resellers' ) );
            add_submenu_page( 'swb_plugin_root', 'Listă Licențe SWB', 'Licențe', 'activate_plugins', 'swb_licenses', array( $this, 'swb_admin_licenses' ) );
            add_submenu_page( 'swb_plugin_root', 'Listă Clienți SWB', 'Clienți', 'activate_plugins', 'swb_customers', array( $this, 'swb_admin_customers' ) );
            add_submenu_page( 'swb_plugin_root', 'Teme SWB', 'Gestionare Teme', 'activate_plugins', 'swb_themes', array( $this, 'swb_admin_themes' ) );
            add_submenu_page( 'swb_plugin_root', 'Plugin-uri SWB', 'Gestionare Plugin-uri', 'activate_plugins', 'swb_plugins', array( $this, 'swb_admin_plugins' ) );
        }

Clasa care extinde 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' => __('Nume Real'),
                'col_username' => __('Nume Utilizator'),
                'col_contact_no' => __('Nr. Contact'),
                'col_email' => __('Email'),
                'col_active' => __('Este Activ?'),
                'col_registered_time' => __('Înregistrat'),
                'col_modified_time' => __('Ultima Modificare')
            );
        }

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

            // Înregistrare pagină
            $this->set_pagination_args(
                array(
                    "total_items" => $totalitems,
                    "total_pages" => $totalpages,
                    "per_page" => $perpage
                )
            );

            // Înregistrare coloană 
            $columns               = $this->get_columns();
            $hidden                = array();
            $sortable              = $this->get_sortable_columns();
            $this->_column_headers = array(
                $columns,
                $hidden,
                $sortable
            );
            // var_dump($this);
            // echo $query;

            // Preluare elemente
            $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 ) ? 'Da' : 'Nu';
                            echo '<td ' . $attributes . '>' . $active . '</td>';
                            break;
                        case "col_registered_time":
                            echo '<td ' . $attributes . '>' . date("j F Y g:i a", stripslashes($rec->registered_time)) . '</td>';
                            break;
                        case "col_modified_time":
                            echo '<td ' . $attributes . '>' . date("j F Y g:i a", stripslashes($rec->modified_time)) . '</td>';
                            break;
                    }
                }
                echo '</tr>';
            }
        }
    }
}

Nu știu de ce nu apare căsuța de căutare. Ce lipsește?

1
Comentarii

Aveți o vulnerabilitate de injecție SQL în codul dvs. deoarece nu sanitizați variabila $search care provine de la utilizator.

Magmatic Magmatic
24 oct. 2017 02:52:50
Toate răspunsurile la întrebare 4
0

Trebuie să folosești $list_obj->prepare_items() înainte de funcția $list_obj->search_box('Căutare', 'search')!

Exemplu:

                        <form method="post">
                            <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
                            <?php $this->sales_obj->prepare_items();
                            $this->sales_obj->search_box('Căutare', 'search');
                            $this->sales_obj->display(); ?>
                        </form>
21 feb. 2017 13:36:41
0

Am rezolvat această problemă prin suprascrierea funcției search_box() cu următoarea:

 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 }

Plasați această funcție în clasa voastră personalizată WP_List_Tables și va rezolva problema.

3 oct. 2014 05:38:41
1

Aruncă o privire la '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
}

Partea if(empty($_REQUEST['s']) && !$this->has_items() poate bloca afișarea search_box.

7 feb. 2014 01:56:07
Comentarii

cum pot trece valoarea. ce este input_id?

Renish Khunt Renish Khunt
7 iul. 2014 07:08:54
0
-1

Dacă adaugi niște date în tabelul tău, vei vedea caseta. Dacă scrie "Nu au fost găsite articole" WordPress nu afișează caseta. Adaugă niște date, iar caseta va apărea.

9 mar. 2015 00:16:58