Не отображается поисковая строка в WP_List_Table
20 дек. 2013 г., 10:05:08
Просмотры: 15.7K
Голосов: 4
Я использую WordPress 3.8 и кастомный класс, унаследованный от WP_List_Table
. Почему не отображается форма поиска?
Мой код в классе плагина:
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>Список реселлеров</h2>';
?>
<form method="post">
<input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
<?php $list_obj->search_box('поиск реселлера(ов)', '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 Основные настройки', 'Основные настройки', 'activate_plugins', 'swb_plugin_root', array( $this, 'swb_admin_settings' ) );
add_submenu_page( 'swb_plugin_root', 'SWB Список реселлеров', 'Реселлеры', 'activate_plugins', 'swb_resellers', array( $this, 'swb_admin_resellers' ) );
add_submenu_page( 'swb_plugin_root', 'SWB Список лицензий', 'Лицензии', 'activate_plugins', 'swb_licenses', array( $this, 'swb_admin_licenses' ) );
add_submenu_page( 'swb_plugin_root', 'SWB Список клиентов', 'Клиенты', 'activate_plugins', 'swb_customers', array( $this, 'swb_admin_customers' ) );
add_submenu_page( 'swb_plugin_root', 'SWB Темы', 'Управление темами', 'activate_plugins', 'swb_themes', array( $this, 'swb_admin_themes' ) );
add_submenu_page( 'swb_plugin_root', 'SWB Плагины', 'Управление плагинами', 'activate_plugins', 'swb_plugins', array( $this, 'swb_admin_plugins' ) );
}
Класс, который наследует 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' => __('Настоящее имя'),
'col_username' => __('Логин'),
'col_contact_no' => __('Контактный номер'),
'col_email' => __('Email'),
'col_active' => __('Активен?'),
'col_registered_time' => __('Зарегистрирован'),
'col_modified_time' => __('Последнее изменение')
);
}
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;
}
// Регистрация пагинации
$this->set_pagination_args(
array(
"total_items" => $totalitems,
"total_pages" => $totalpages,
"per_page" => $perpage
)
);
// Регистрация колонок
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array(
$columns,
$hidden,
$sortable
);
// var_dump($this);
// echo $query;
// Получение данных
$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 ) ? 'Да' : 'Нет';
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>';
}
}
}
}
Не могу понять, почему не отображается строка поиска. Чего не хватает?

garydefty
41
Комментарии
Все ответы на вопрос
4
0
Вы должны использовать
$list_obj->prepare_items()
перед функцией $list_obj->search_box('Поиск', 'search')
!
Пример:
<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');
$this->sales_obj->display(); ?>
</form>

axentmedia
91
21 февр. 2017 г. 13:36:41
0
Я решил эту проблему, переопределив функцию search_box() следующим образом:
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 }
Поместите эту функцию в ваш пользовательский класс WP_List_Tables, и это решит проблему.

kevado
11
3 окт. 2014 г. 05:38:41
1
Давайте рассмотрим функцию 'search_box' в 'wp_list_table':
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
}
Часть условия if(empty($_REQUEST['s']) && !$this->has_items()
может блокировать отображение search_box
.

fumigato
1
7 февр. 2014 г. 01:56:07
Похожие вопросы
1
ответов