| 1 |
<?php |
| 2 |
/** |
| 3 |
* Bootstrapping the Gutenberg experiments page. |
| 4 |
* |
| 5 |
* @package gutenberg |
| 6 |
*/ |
| 7 |
|
| 8 |
if ( ! function_exists( 'the_gutenberg_experiments' ) ) { |
| 9 |
/** |
| 10 |
* The main entry point for the Gutenberg experiments page. |
| 11 |
* |
| 12 |
* @since 6.3.0 |
| 13 |
*/ |
| 14 |
function the_gutenberg_experiments() { |
| 15 |
?> |
| 16 |
<div |
| 17 |
id="experiments-editor" |
| 18 |
class="wrap" |
| 19 |
> |
| 20 |
<h1><?php echo __( 'Experimental settings', 'gutenberg' ); ?></h1> |
| 21 |
<?php settings_errors(); ?> |
| 22 |
<form method="post" action="options.php"> |
| 23 |
<?php settings_fields( 'gutenberg-experiments' ); ?> |
| 24 |
<?php do_settings_sections( 'gutenberg-experiments' ); ?> |
| 25 |
<!-- We use a separate table for the template activation experiment because the option is managed separately. --> |
| 26 |
<table class="form-table"> |
| 27 |
<tr> |
| 28 |
<th scope="row"> |
| 29 |
<label for="active_templates"><?php echo __( 'Template Activation', 'gutenberg' ); ?></label> |
| 30 |
<br><a href="https://github.com/WordPress/gutenberg/issues/66950" target="_blank"><?php echo __( 'Learn more', 'gutenberg' ); ?></a> |
| 31 |
</th> |
| 32 |
<td> |
| 33 |
<label for="active_templates"> |
| 34 |
<input |
| 35 |
type="checkbox" |
| 36 |
name="active_templates" |
| 37 |
id="active_templates" |
| 38 |
value="1" |
| 39 |
<?php checked( 1, gutenberg_is_experiment_enabled( 'active_templates' ) ); ?> |
| 40 |
/> |
| 41 |
<?php echo __( 'Allows multiple templates of the same type to be created, of which one can be active at a time.', 'gutenberg' ); ?> |
| 42 |
<p class="description"><?php echo __( 'Warning: when you deactivate this experiment, it is best to delete all created templates except for the active ones.', 'gutenberg' ); ?></p> |
| 43 |
</label> |
| 44 |
</td> |
| 45 |
</tr> |
| 46 |
</table> |
| 47 |
<?php submit_button(); ?> |
| 48 |
</form> |
| 49 |
</div> |
| 50 |
<?php |
| 51 |
} |
| 52 |
} |
| 53 |
|
| 54 |
/** |
| 55 |
* Set up the experiments settings. |
| 56 |
* |
| 57 |
* @since 6.3.0 |
| 58 |
*/ |
| 59 |
function gutenberg_initialize_experiments_settings() { |
| 60 |
add_settings_section( |
| 61 |
'gutenberg_experiments_section', |
| 62 |
// The empty string ensures the render function won't output a h2. |
| 63 |
'', |
| 64 |
'gutenberg_display_experiment_section', |
| 65 |
'gutenberg-experiments' |
| 66 |
); |
| 67 |
|
| 68 |
add_settings_field( |
| 69 |
'gutenberg-block-experiments', |
| 70 |
__( 'Blocks: add experimental blocks', 'gutenberg' ), |
| 71 |
'gutenberg_display_experiment_field', |
| 72 |
'gutenberg-experiments', |
| 73 |
'gutenberg_experiments_section', |
| 74 |
array( |
| 75 |
'label' => __( 'Enables experimental blocks on a rolling basis as they are developed.<p class="description">(Warning: these blocks may have significant changes during development that cause validation errors and display issues.)</p>', 'gutenberg' ), |
| 76 |
'id' => 'gutenberg-block-experiments', |
| 77 |
) |
| 78 |
); |
| 79 |
|
| 80 |
add_settings_field( |
| 81 |
'gutenberg-form-blocks', |
| 82 |
__( 'Blocks: add Form and input blocks', 'gutenberg' ), |
| 83 |
'gutenberg_display_experiment_field', |
| 84 |
'gutenberg-experiments', |
| 85 |
'gutenberg_experiments_section', |
| 86 |
array( |
| 87 |
'label' => __( 'Enables new blocks to allow building forms. You are likely to experience UX issues that are being addressed.', 'gutenberg' ), |
| 88 |
'id' => 'gutenberg-form-blocks', |
| 89 |
) |
| 90 |
); |
| 91 |
|
| 92 |
add_settings_field( |
| 93 |
'gutenberg-grid-interactivity', |
| 94 |
__( 'Blocks: add Grid interactivity', 'gutenberg' ), |
| 95 |
'gutenberg_display_experiment_field', |
| 96 |
'gutenberg-experiments', |
| 97 |
'gutenberg_experiments_section', |
| 98 |
array( |
| 99 |
'label' => __( 'Enables enhancements to the Grid block that let you move and resize items in the editor canvas.', 'gutenberg' ), |
| 100 |
'id' => 'gutenberg-grid-interactivity', |
| 101 |
) |
| 102 |
); |
| 103 |
|
| 104 |
add_settings_field( |
| 105 |
'gutenberg-no-tinymce', |
| 106 |
__( 'Blocks: disable TinyMCE and Classic block', 'gutenberg' ), |
| 107 |
'gutenberg_display_experiment_field', |
| 108 |
'gutenberg-experiments', |
| 109 |
'gutenberg_experiments_section', |
| 110 |
array( |
| 111 |
'label' => __( 'Disables the TinyMCE and Classic block.', 'gutenberg' ), |
| 112 |
'id' => 'gutenberg-no-tinymce', |
| 113 |
) |
| 114 |
); |
| 115 |
|
| 116 |
add_settings_field( |
| 117 |
'gutenberg-media-processing', |
| 118 |
__( 'Client-side media processing', 'gutenberg' ), |
| 119 |
'gutenberg_display_experiment_field', |
| 120 |
'gutenberg-experiments', |
| 121 |
'gutenberg_experiments_section', |
| 122 |
array( |
| 123 |
'label' => __( 'Enables client-side media processing to leverage the browser\'s capabilities to handle tasks like image resizing and compression.', 'gutenberg' ), |
| 124 |
'id' => 'gutenberg-media-processing', |
| 125 |
) |
| 126 |
); |
| 127 |
|
| 128 |
add_settings_field( |
| 129 |
'gutenberg-sync-collaboration', |
| 130 |
__( 'Collaboration: add real time editing', 'gutenberg' ), |
| 131 |
'gutenberg_display_experiment_field', |
| 132 |
'gutenberg-experiments', |
| 133 |
'gutenberg_experiments_section', |
| 134 |
array( |
| 135 |
'label' => __( 'Enables live collaboration and offline persistence between peers.', 'gutenberg' ), |
| 136 |
'id' => 'gutenberg-sync-collaboration', |
| 137 |
) |
| 138 |
); |
| 139 |
|
| 140 |
add_settings_field( |
| 141 |
'gutenberg-color-randomizer', |
| 142 |
__( 'Color randomizer', 'gutenberg' ), |
| 143 |
'gutenberg_display_experiment_field', |
| 144 |
'gutenberg-experiments', |
| 145 |
'gutenberg_experiments_section', |
| 146 |
array( |
| 147 |
'label' => __( 'Enables the Global Styles color randomizer in the Site Editor; a utility that lets you mix the current color palette pseudo-randomly.', 'gutenberg' ), |
| 148 |
'id' => 'gutenberg-color-randomizer', |
| 149 |
) |
| 150 |
); |
| 151 |
|
| 152 |
add_settings_field( |
| 153 |
'gutenberg-new-posts-dashboard', |
| 154 |
__( 'Data Views: enable for Posts', 'gutenberg' ), |
| 155 |
'gutenberg_display_experiment_field', |
| 156 |
'gutenberg-experiments', |
| 157 |
'gutenberg_experiments_section', |
| 158 |
array( |
| 159 |
'label' => __( 'Enables a redesigned posts dashboard accessible through a submenu item in the Gutenberg plugin.', 'gutenberg' ), |
| 160 |
'id' => 'gutenberg-new-posts-dashboard', |
| 161 |
) |
| 162 |
); |
| 163 |
|
| 164 |
add_settings_field( |
| 165 |
'gutenberg-quick-edit-dataviews', |
| 166 |
__( 'Data Views: add Quick Edit', 'gutenberg' ), |
| 167 |
'gutenberg_display_experiment_field', |
| 168 |
'gutenberg-experiments', |
| 169 |
'gutenberg_experiments_section', |
| 170 |
array( |
| 171 |
'label' => __( 'Enables access to a Quick Edit panel in the Site Editor Pages experience.', 'gutenberg' ), |
| 172 |
'id' => 'gutenberg-quick-edit-dataviews', |
| 173 |
) |
| 174 |
); |
| 175 |
|
| 176 |
add_settings_field( |
| 177 |
'gutenberg-dataviews-media-modal', |
| 178 |
__( 'Data Views: new media modal', 'gutenberg' ), |
| 179 |
'gutenberg_display_experiment_field', |
| 180 |
'gutenberg-experiments', |
| 181 |
'gutenberg_experiments_section', |
| 182 |
array( |
| 183 |
'label' => __( 'Enables a new media modal experience powered by Data Views for improved media library management.', 'gutenberg' ), |
| 184 |
'id' => 'gutenberg-dataviews-media-modal', |
| 185 |
) |
| 186 |
); |
| 187 |
|
| 188 |
add_settings_field( |
| 189 |
'gutenberg-full-page-client-side-navigation', |
| 190 |
__( 'Interactivity API: Full-page client-side navigation', 'gutenberg' ), |
| 191 |
'gutenberg_display_experiment_field', |
| 192 |
'gutenberg-experiments', |
| 193 |
'gutenberg_experiments_section', |
| 194 |
array( |
| 195 |
'label' => __( 'Enables full-page client-side navigation, powered by the Interactivity API.', 'gutenberg' ), |
| 196 |
'id' => 'gutenberg-full-page-client-side-navigation', |
| 197 |
) |
| 198 |
); |
| 199 |
|
| 200 |
add_settings_field( |
| 201 |
'gutenberg-content-only-pattern-insertion', |
| 202 |
__( 'contentOnly: Make patterns contentOnly by default upon insertion', 'gutenberg' ), |
| 203 |
'gutenberg_display_experiment_field', |
| 204 |
'gutenberg-experiments', |
| 205 |
'gutenberg_experiments_section', |
| 206 |
array( |
| 207 |
'label' => __( 'When patterns are inserted, default to a simplified content only mode for editing pattern content.', 'gutenberg' ), |
| 208 |
'id' => 'gutenberg-content-only-pattern-insertion', |
| 209 |
) |
| 210 |
); |
| 211 |
|
| 212 |
add_settings_field( |
| 213 |
'gutenberg-content-only-inspector-fields', |
| 214 |
__( 'contentOnly: Enable editable inspector fields', 'gutenberg' ), |
| 215 |
'gutenberg_display_experiment_field', |
| 216 |
'gutenberg-experiments', |
| 217 |
'gutenberg_experiments_section', |
| 218 |
array( |
| 219 |
'label' => __( 'Enables editable inspector fields (media, links, alt text, etc.) in the content-only pattern editing interface. Requires "contentOnly: Make patterns contentOnly by default upon insertion" to be enabled.', 'gutenberg' ), |
| 220 |
'id' => 'gutenberg-content-only-inspector-fields', |
| 221 |
'requires' => 'gutenberg-content-only-pattern-insertion', |
| 222 |
) |
| 223 |
); |
| 224 |
|
| 225 |
add_settings_field( |
| 226 |
'gutenberg-workflow-palette', |
| 227 |
__( 'Workflow Palette', 'gutenberg' ), |
| 228 |
'gutenberg_display_experiment_field', |
| 229 |
'gutenberg-experiments', |
| 230 |
'gutenberg_experiments_section', |
| 231 |
array( |
| 232 |
'label' => __( 'Enables the Workflow Palette for running workflows composed of abilities, from a unified interface.', 'gutenberg' ), |
| 233 |
'id' => 'gutenberg-workflow-palette', |
| 234 |
) |
| 235 |
); |
| 236 |
|
| 237 |
add_settings_field( |
| 238 |
'gutenberg-customizable-navigation-overlays', |
| 239 |
__( 'Customizable Navigation Overlays', 'gutenberg' ), |
| 240 |
'gutenberg_display_experiment_field', |
| 241 |
'gutenberg-experiments', |
| 242 |
'gutenberg_experiments_section', |
| 243 |
array( |
| 244 |
'label' => __( 'Enables custom mobile overlay design and content control for Navigation blocks, allowing you to create flexible, professional menu experiences.', 'gutenberg' ), |
| 245 |
'id' => 'gutenberg-customizable-navigation-overlays', |
| 246 |
) |
| 247 |
); |
| 248 |
|
| 249 |
register_setting( |
| 250 |
'gutenberg-experiments', |
| 251 |
'gutenberg-experiments' |
| 252 |
); |
| 253 |
} |
| 254 |
|
| 255 |
add_action( 'admin_init', 'gutenberg_initialize_experiments_settings' ); |
| 256 |
|
| 257 |
/** |
| 258 |
* Display a checkbox field for a Gutenberg experiment. |
| 259 |
* |
| 260 |
* @since 6.3.0 |
| 261 |
* |
| 262 |
* @param array $args ( $label, $id ). |
| 263 |
*/ |
| 264 |
function gutenberg_display_experiment_field( $args ) { |
| 265 |
$options = get_option( 'gutenberg-experiments' ); |
| 266 |
$value = isset( $options[ $args['id'] ] ) ? 1 : 0; |
| 267 |
?> |
| 268 |
<label for="<?php echo $args['id']; ?>"> |
| 269 |
<input type="checkbox" name="<?php echo 'gutenberg-experiments[' . $args['id'] . ']'; ?>" id="<?php echo $args['id']; ?>" value="1" <?php checked( 1, $value ); ?> /> |
| 270 |
<?php echo $args['label']; ?> |
| 271 |
</label> |
| 272 |
<?php |
| 273 |
} |
| 274 |
|
| 275 |
/** |
| 276 |
* Display the experiments section. |
| 277 |
* |
| 278 |
* @since 6.3.0 |
| 279 |
*/ |
| 280 |
function gutenberg_display_experiment_section() { |
| 281 |
?> |
| 282 |
<p><?php echo __( "The block editor includes experimental features that are usable while they're in development. Select the ones you'd like to enable. These features are likely to change, so avoid using them in production.", 'gutenberg' ); ?></p> |
| 283 |
|
| 284 |
<?php |
| 285 |
} |
| 286 |
|
| 287 |
add_action( 'admin_init', 'gutenberg_handle_template_activate_setting_submission' ); |
| 288 |
function gutenberg_handle_template_activate_setting_submission() { |
| 289 |
if ( ! isset( $_POST['option_page'] ) || 'gutenberg-experiments' !== $_POST['option_page'] ) { |
| 290 |
return; |
| 291 |
} |
| 292 |
|
| 293 |
if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'gutenberg-experiments-options' ) ) { |
| 294 |
return; |
| 295 |
} |
| 296 |
|
| 297 |
if ( ! current_user_can( 'manage_options' ) ) { |
| 298 |
return; |
| 299 |
} |
| 300 |
|
| 301 |
if ( isset( $_POST['active_templates'] ) && '1' === $_POST['active_templates'] ) { |
| 302 |
update_option( 'active_templates', gutenberg_get_migrated_active_templates() ); |
| 303 |
} else { |
| 304 |
delete_option( 'active_templates' ); |
| 305 |
} |
| 306 |
} |
| 307 |
|