Title: set_screen_options
Published: April 25, 2014
Last modified: August 20, 2026

---

# set_screen_options()

## In this article

 * [Source](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#wp--skip-link--target)

Saves option for number of rows when listing posts, pages, comments, etc.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#source)󠁿

    ```php
    function set_screen_options() {
    	if ( ! isset( $_POST['wp_screen_options'] ) || ! is_array( $_POST['wp_screen_options'] ) ) {
    		return;
    	}

    	check_admin_referer( 'screen-options-nonce', 'screenoptionnonce' );

    	$user = wp_get_current_user();

    	if ( ! $user ) {
    		return;
    	}

    	$option = $_POST['wp_screen_options']['option'];
    	$value  = $_POST['wp_screen_options']['value'];

    	if ( sanitize_key( $option ) !== $option ) {
    		return;
    	}

    	$map_option = $option;
    	$type       = str_replace( 'edit_', '', $map_option );
    	$type       = str_replace( '_per_page', '', $type );

    	if ( in_array( $type, get_taxonomies(), true ) ) {
    		$map_option = 'edit_tags_per_page';
    	} elseif ( in_array( $type, get_post_types(), true ) ) {
    		$map_option = 'edit_per_page';
    	} else {
    		$option = str_replace( '-', '_', $option );
    	}

    	switch ( $map_option ) {
    		case 'edit_per_page':
    		case 'users_per_page':
    		case 'edit_comments_per_page':
    		case 'upload_per_page':
    		case 'edit_tags_per_page':
    		case 'plugins_per_page':
    		case 'export_personal_data_requests_per_page':
    		case 'remove_personal_data_requests_per_page':
    			// Network admin.
    		case 'sites_network_per_page':
    		case 'users_network_per_page':
    		case 'site_users_network_per_page':
    		case 'plugins_network_per_page':
    		case 'themes_network_per_page':
    		case 'site_themes_network_per_page':
    			$value = (int) $value;

    			if ( $value < 1 || $value > 999 ) {
    				return;
    			}

    			break;

    		default:
    			$screen_option = false;

    			if ( str_ends_with( $option, '_page' ) || 'layout_columns' === $option ) {
    				/**
    				 * Filters a screen option value before it is set.
    				 *
    				 * The filter can also be used to modify non-standard `[items]_per_page`
    				 * settings. See the parent function for a full list of standard options.
    				 *
    				 * Returning false from the filter will skip saving the current option.
    				 *
    				 * @since 2.8.0
    				 * @since 5.4.2 Only applied to options ending with '_page',
    				 *              or the 'layout_columns' option.
    				 *
    				 * @see set_screen_options()
    				 *
    				 * @param mixed  $screen_option The value to save instead of the option value.
    				 *                              Default false (to skip saving the current option).
    				 * @param string $option        The option name.
    				 * @param int    $value         The option value.
    				 */
    				$screen_option = apply_filters( 'set-screen-option', $screen_option, $option, $value ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
    			}

    			/**
    			 * Filters a screen option value before it is set.
    			 *
    			 * The dynamic portion of the hook name, `$option`, refers to the option name.
    			 *
    			 * Returning false from the filter will skip saving the current option.
    			 *
    			 * @since 5.4.2
    			 *
    			 * @see set_screen_options()
    			 *
    			 * @param mixed   $screen_option The value to save instead of the option value.
    			 *                               Default false (to skip saving the current option).
    			 * @param string  $option        The option name.
    			 * @param int     $value         The option value.
    			 */
    			$value = apply_filters( "set_screen_option_{$option}", $screen_option, $option, $value );

    			if ( false === $value ) {
    				return;
    			}

    			break;
    	}

    	update_user_meta( $user->ID, $option, $value );

    	$url = remove_query_arg( array( 'pagenum', 'apage', 'paged' ), wp_get_referer() );

    	if ( isset( $_POST['mode'] ) ) {
    		$url = add_query_arg( array( 'mode' => $_POST['mode'] ), $url );
    	}

    	wp_safe_redirect( $url );
    	exit;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/misc.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.1/src/wp-admin/includes/misc.php#L699)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.1/src/wp-admin/includes/misc.php#L699-L816)

## 󠀁[Hooks](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#hooks)󠁿

 [apply_filters( ‘set-screen-option’, mixed $screen_option, string $option, int $value )](https://developer.wordpress.org/reference/hooks/set-screen-option/)

Filters a screen option value before it is set.

 [apply_filters( “set_screen_option_{$option}”, mixed $screen_option, string $option, int $value )](https://developer.wordpress.org/reference/hooks/set_screen_option_option/)

Filters a screen option value before it is set.

## 󠀁[Related](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_safe_redirect()](https://developer.wordpress.org/reference/functions/wp_safe_redirect/)`wp-includes/pluggable.php` |

Performs a safe (local) redirect, using [wp_redirect()](https://developer.wordpress.org/reference/functions/wp_redirect/) .

  | 
| [check_admin_referer()](https://developer.wordpress.org/reference/functions/check_admin_referer/)`wp-includes/pluggable.php` |

Ensures intent by verifying that a user was referred from another admin page with the correct security nonce.

  | 
| [wp_get_current_user()](https://developer.wordpress.org/reference/functions/wp_get_current_user/)`wp-includes/pluggable.php` |

Retrieves the current user object.

  | 
| [wp_get_referer()](https://developer.wordpress.org/reference/functions/wp_get_referer/)`wp-includes/functions.php` |

Retrieves referer from ‘_wp_http_referer’ or HTTP referer.

  | 
| [remove_query_arg()](https://developer.wordpress.org/reference/functions/remove_query_arg/)`wp-includes/functions.php` |

Removes an item or items from a query string.

  | 
| [get_taxonomies()](https://developer.wordpress.org/reference/functions/get_taxonomies/)`wp-includes/taxonomy.php` |

Retrieves a list of registered taxonomy names or objects.

  | 
| [update_user_meta()](https://developer.wordpress.org/reference/functions/update_user_meta/)`wp-includes/user.php` |

Updates user meta field based on user ID.

  | 
| [sanitize_key()](https://developer.wordpress.org/reference/functions/sanitize_key/)`wp-includes/formatting.php` |

Sanitizes a string key.

  | 
| [add_query_arg()](https://developer.wordpress.org/reference/functions/add_query_arg/)`wp-includes/functions.php` |

Retrieves a modified URL query string.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  | 
| [get_post_types()](https://developer.wordpress.org/reference/functions/get_post_types/)`wp-includes/post.php` |

Gets a list of all registered post type objects.

  |

[Show 6 more](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/set_screen_options/?output_format=md#changelog)󠁿

| Version | Description | 
| [2.8.0](https://developer.wordpress.org/reference/since/2.8.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fset_screen_options%2F)
before being able to contribute a note or feedback.