screen.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <?php
  2. /**
  3. * WordPress Administration Screen API.
  4. *
  5. * @package WordPress
  6. * @subpackage Administration
  7. */
  8. /**
  9. * Get the column headers for a screen
  10. *
  11. * @since 2.7.0
  12. *
  13. * @param string|WP_Screen $screen The screen you want the headers for
  14. * @return string[] The column header labels keyed by column ID.
  15. */
  16. function get_column_headers( $screen ) {
  17. static $column_headers = array();
  18. if ( is_string( $screen ) ) {
  19. $screen = convert_to_screen( $screen );
  20. }
  21. if ( ! isset( $column_headers[ $screen->id ] ) ) {
  22. /**
  23. * Filters the column headers for a list table on a specific screen.
  24. *
  25. * The dynamic portion of the hook name, `$screen->id`, refers to the
  26. * ID of a specific screen. For example, the screen ID for the Posts
  27. * list table is edit-post, so the filter for that screen would be
  28. * manage_edit-post_columns.
  29. *
  30. * @since 3.0.0
  31. *
  32. * @param string[] $columns The column header labels keyed by column ID.
  33. */
  34. $column_headers[ $screen->id ] = apply_filters( "manage_{$screen->id}_columns", array() );
  35. }
  36. return $column_headers[ $screen->id ];
  37. }
  38. /**
  39. * Get a list of hidden columns.
  40. *
  41. * @since 2.7.0
  42. *
  43. * @param string|WP_Screen $screen The screen you want the hidden columns for
  44. * @return string[] Array of IDs of hidden columns.
  45. */
  46. function get_hidden_columns( $screen ) {
  47. if ( is_string( $screen ) ) {
  48. $screen = convert_to_screen( $screen );
  49. }
  50. $hidden = get_user_option( 'manage' . $screen->id . 'columnshidden' );
  51. $use_defaults = ! is_array( $hidden );
  52. if ( $use_defaults ) {
  53. $hidden = array();
  54. /**
  55. * Filters the default list of hidden columns.
  56. *
  57. * @since 4.4.0
  58. *
  59. * @param string[] $hidden Array of IDs of columns hidden by default.
  60. * @param WP_Screen $screen WP_Screen object of the current screen.
  61. */
  62. $hidden = apply_filters( 'default_hidden_columns', $hidden, $screen );
  63. }
  64. /**
  65. * Filters the list of hidden columns.
  66. *
  67. * @since 4.4.0
  68. * @since 4.4.1 Added the `use_defaults` parameter.
  69. *
  70. * @param string[] $hidden Array of IDs of hidden columns.
  71. * @param WP_Screen $screen WP_Screen object of the current screen.
  72. * @param bool $use_defaults Whether to show the default columns.
  73. */
  74. return apply_filters( 'hidden_columns', $hidden, $screen, $use_defaults );
  75. }
  76. /**
  77. * Prints the meta box preferences for screen meta.
  78. *
  79. * @since 2.7.0
  80. *
  81. * @global array $wp_meta_boxes
  82. *
  83. * @param WP_Screen $screen
  84. */
  85. function meta_box_prefs( $screen ) {
  86. global $wp_meta_boxes;
  87. if ( is_string( $screen ) ) {
  88. $screen = convert_to_screen( $screen );
  89. }
  90. if ( empty( $wp_meta_boxes[ $screen->id ] ) ) {
  91. return;
  92. }
  93. $hidden = get_hidden_meta_boxes( $screen );
  94. foreach ( array_keys( $wp_meta_boxes[ $screen->id ] ) as $context ) {
  95. foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {
  96. if ( ! isset( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] ) ) {
  97. continue;
  98. }
  99. foreach ( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] as $box ) {
  100. if ( false === $box || ! $box['title'] ) {
  101. continue;
  102. }
  103. // Submit box cannot be hidden.
  104. if ( 'submitdiv' === $box['id'] || 'linksubmitdiv' === $box['id'] ) {
  105. continue;
  106. }
  107. $widget_title = $box['title'];
  108. if ( is_array( $box['args'] ) && isset( $box['args']['__widget_basename'] ) ) {
  109. $widget_title = $box['args']['__widget_basename'];
  110. }
  111. $is_hidden = in_array( $box['id'], $hidden, true );
  112. printf(
  113. '<label for="%1$s-hide"><input class="hide-postbox-tog" name="%1$s-hide" type="checkbox" id="%1$s-hide" value="%1$s" %2$s />%3$s</label>',
  114. esc_attr( $box['id'] ),
  115. checked( $is_hidden, false, false ),
  116. $widget_title
  117. );
  118. }
  119. }
  120. }
  121. }
  122. /**
  123. * Gets an array of IDs of hidden meta boxes.
  124. *
  125. * @since 2.7.0
  126. *
  127. * @param string|WP_Screen $screen Screen identifier
  128. * @return string[] IDs of hidden meta boxes.
  129. */
  130. function get_hidden_meta_boxes( $screen ) {
  131. if ( is_string( $screen ) ) {
  132. $screen = convert_to_screen( $screen );
  133. }
  134. $hidden = get_user_option( "metaboxhidden_{$screen->id}" );
  135. $use_defaults = ! is_array( $hidden );
  136. // Hide slug boxes by default.
  137. if ( $use_defaults ) {
  138. $hidden = array();
  139. if ( 'post' === $screen->base ) {
  140. if ( in_array( $screen->post_type, array( 'post', 'page', 'attachment' ), true ) ) {
  141. $hidden = array( 'slugdiv', 'trackbacksdiv', 'postcustom', 'postexcerpt', 'commentstatusdiv', 'commentsdiv', 'authordiv', 'revisionsdiv' );
  142. } else {
  143. $hidden = array( 'slugdiv' );
  144. }
  145. }
  146. /**
  147. * Filters the default list of hidden meta boxes.
  148. *
  149. * @since 3.1.0
  150. *
  151. * @param string[] $hidden An array of IDs of meta boxes hidden by default.
  152. * @param WP_Screen $screen WP_Screen object of the current screen.
  153. */
  154. $hidden = apply_filters( 'default_hidden_meta_boxes', $hidden, $screen );
  155. }
  156. /**
  157. * Filters the list of hidden meta boxes.
  158. *
  159. * @since 3.3.0
  160. *
  161. * @param string[] $hidden An array of IDs of hidden meta boxes.
  162. * @param WP_Screen $screen WP_Screen object of the current screen.
  163. * @param bool $use_defaults Whether to show the default meta boxes.
  164. * Default true.
  165. */
  166. return apply_filters( 'hidden_meta_boxes', $hidden, $screen, $use_defaults );
  167. }
  168. /**
  169. * Register and configure an admin screen option
  170. *
  171. * @since 3.1.0
  172. *
  173. * @param string $option An option name.
  174. * @param mixed $args Option-dependent arguments.
  175. */
  176. function add_screen_option( $option, $args = array() ) {
  177. $current_screen = get_current_screen();
  178. if ( ! $current_screen ) {
  179. return;
  180. }
  181. $current_screen->add_option( $option, $args );
  182. }
  183. /**
  184. * Get the current screen object
  185. *
  186. * @since 3.1.0
  187. *
  188. * @global WP_Screen $current_screen WordPress current screen object.
  189. *
  190. * @return WP_Screen|null Current screen object or null when screen not defined.
  191. */
  192. function get_current_screen() {
  193. global $current_screen;
  194. if ( ! isset( $current_screen ) ) {
  195. return null;
  196. }
  197. return $current_screen;
  198. }
  199. /**
  200. * Set the current screen object
  201. *
  202. * @since 3.0.0
  203. *
  204. * @param string|WP_Screen $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen,
  205. * or an existing screen object.
  206. */
  207. function set_current_screen( $hook_name = '' ) {
  208. WP_Screen::get( $hook_name )->set_current_screen();
  209. }