This issue arrises because of a couple of problems:
WP_List_Table::search_box() inserts the default
_wp_http_referer fields by using
wp_nonce_field() without giving you the ability to override and say "I've already go a nonce field thanks".
2) You need to use
GET as your method of form submission when subclassing
WP_List_Table::print_column_headers() only checks
$_GET for the current
order parameters and uses
$_SERVER['REQUEST_URI'] for constructing its header links. If you don't use
GET as the form method you'll loose the search parameter when sorting a column.
There are a couple of ways to stop the
Request-URI Too Large The requested URL's length exceeds the capacity limit for this server error:
A) Because all the nonce checking functions are able to use either a
_wp_http_referer request field or fallback to the appropriate header for the referrer you can remove the
_wp_http_referer query arg early on in the processing.
Therefore a simple way to resolve this issue is by adding the following very early on in the
prepare_items() function of your
$_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );
B) The arguably better and more secure way would be to switch to the
POST form submission method and update
prepare_items() with all the parameters you care about once you've compiled them so that
WP_List_Table::print_column_headers() functions as expected.
$options = array(
'blog_id' => $blog_id,
's' => $search,
'record_type' => $record_type,
'orderby' => $orderby,
'order' => $order,
// Update the current URI with the new options.
$_SERVER['REQUEST_URI'] = add_query_arg( $options, $_SERVER['REQUEST_URI'] );