I recently tried to use screen options for a wordpress backend plugin. I wanted to use a per page variable to be able to easily manage a number of users to request.
I first init the screen options :
add_action('my_plugin_slug', array( $this, 'screen_set_option'));
function screen_set_option() {
add_screen_option('per_page', array(
'default'=>10,
'label'=>__('Users per page', 'my_domain'),
'option'=>'users_per_page'));
}
But then I couldn’t find a way to make the filter set-screen-option to work. This filter is used to filter a screen option value before it is set (https://developer.wordpress.org/reference/hooks/set-screen-option/).
I tried this code with no success :
add_filter('set-screen-option', array($this, 'set_screen_option'), 10, 3);
function set_screen_option($status, $option, $value) {
if ( 'search_member_per_page' == $option ) {
$user = get_current_user_id();
update_user_meta($user, 'users_per_page', $value);
return $value;
}
return $value;
}
So I choose to save the screen option value after it was posted :
// when rendering the page :
$user=get_current_user_id();
$screen=get_current_screen();
if ( isset( $_POST['wp_screen_options'] ) &&is_array( $_POST['wp_screen_options'] ) ) {
$option=$_POST['wp_screen_options']['option'];
if ($option=='users_per_page') {
$users_per_page=$_POST['wp_screen_options']['value'];
update_user_meta($user, users_per_page', $users_per_page);
apply_filters( 'set-screen-option', false, $option, $users_per_page );
}
} else {
$users_per_page=get_user_meta($user, 'users_per_page', true);
if ( empty ( $users_per_page) ||$users_per_page<1 ) {
$users_per_page=$screen->get_option( 'per_page', 'default' );
} else {
apply_filters( 'set-screen-option', false, 'users_per_page', $users_per_page);
}
}
Notice that I store the screen option value in the user meta table to be able to easily retrieved it.
1 Comment
I spent 3 to 4 hours, regarding this.
But update_user_meta function was missing in my code.
Thanks a lot for this post.