In WordPress, adding screen options during plugin development is not one of those things with a lot of documentation. There’s a great tutorial on this by Chris Marslender. There’s one here too by someone I’m a fan of, Pippin Williamson. Both went a long way to get me started. I differ from these approaches in 2 things:
- I use OO
- I use a less expensive approach in retrieving the screen option
Now, on to the good stuff….
First, pick the hook that’s returned when your options page is created:
$my_plugin_hook = add_menu_page( $page_title, $menu_title, $capability, $slug, $function );
Add an action based on that hook:
add_action( "load-$my_plugin_hook", array ( $this, 'add_option' ) );
My assumption here is that add_screen_option is in the same class that the action above is defined.
Then, onto our add_screen_option function:
class My_Plugin_Class { private $tickets_per_page_options_key = "myplugin_tickets_per_page"; private $default_tickets_per_page = 20; public function __construct() { $this->add_menu_pages(); add_filter('set-screen-option', array ( $this, 'set_screen_option' ), 10, 3); } public add_menu_pages(){ //Add your page(s), use the hook(s) returned to add screen options as explained above } //The other cool stuff your plugin does public function add_option() { $option = 'per_page'; $args = array( 'label' => __('Tickets', 'my-plugin'),//The second parameter is your text domain. It is used in 'Internalization', the fancy word to mean 'Translate your plugin into other languages' 'default' => $this->default_tickets_per_page, 'option' => $this->tickets_per_page_options_key ); add_screen_option( $option, $args ); } //Now we set the screen option. This is called by the filter we defined in our constructor public function set_screen_option($status, $option, $value) { if ( $this->tickets_per_page_options_key == $option ) return $value; return $status; } }
Now, on to that less expensive approach for retrieving your saved screen option that I spoke of earlier. The other tutorials require that you first get_current_screen() and use it in your retrieval. I believe all you need is this:
$per_page = get_user_meta(get_current_user_id(), $this->tickets_per_page_options_key, true); //To have a fall-back in case the option isn't defined, all you need is this: if ( empty ( $per_page) || $per_page < 1 ) { $per_page = $this->$default_tickets_per_page; } //NB: All this is in your class My_Plugin_Class
From my tests, screen options are stored in the WP usermeta table; all you need to retrieve them is the key and the user’s ID. Then, to fallback to a default value, use your default variable; there’s no need to go back to the Db for that