WordPress.org

Make WordPress Core

Ticket #39441: 39441.diff

File 39441.diff, 9.4 KB (added by flixos90, 3 years ago)
  • src/wp-admin/includes/template.php

     
    12351235 *
    12361236 * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections
    12371237 *
    1238  * @param string   $id       Slug-name to identify the field. Used in the 'id' attribute of tags.
    1239  * @param string   $title    Formatted title of the field. Shown as the label for the field
    1240  *                           during output.
    1241  * @param callable $callback Function that fills the field with the desired form inputs. The
    1242  *                           function should echo its output.
    1243  * @param string   $page     The slug-name of the settings page on which to show the section
    1244  *                           (general, reading, writing, ...).
    1245  * @param string   $section  Optional. The slug-name of the section of the settings page
    1246  *                           in which to show the box. Default 'default'.
    1247  * @param array    $args {
     1238 * @param string          $id       Slug-name to identify the field. Used in the 'id' attribute of tags.
     1239 * @param string          $title    Formatted title of the field. Shown as the label for the field
     1240 *                                  during output.
     1241 * @param callable|string $callback Function that fills the field with the desired form inputs. The
     1242 *                                  function should echo its output. May instead be one out of 'text',
     1243 *                                  'number', 'email', 'url', 'tel', 'textarea', 'select', 'checkbox'
     1244 *                                  or 'radio' to use a default function to render the form input.
     1245 * @param string          $page     The slug-name of the settings page on which to show the section
     1246 *                                  (general, reading, writing, ...).
     1247 * @param string          $section  Optional. The slug-name of the section of the settings page
     1248 *                                  in which to show the box. Default 'default'.
     1249 * @param array           $args {
    12481250 *     Optional. Extra arguments used when outputting the field.
    12491251 *
    1250  *     @type string $label_for When supplied, the setting title will be wrapped
    1251  *                             in a `<label>` element, its `for` attribute populated
    1252  *                             with this value.
    1253  *     @type string $class     CSS Class to be added to the `<tr>` element when the
    1254  *                             field is output.
     1252 *     @type string   $input_id       The 'id' attribute of the input field. Default is the
     1253 *                                    value of $id.
     1254 *     @type string   $input_name     The `name` attribute of the input field. Default is the
     1255 *                                    value of $id.
     1256 *     @type string   $label_for      When supplied, the setting title will be wrapped
     1257 *                                    in a `<label>` element, its `for` attribute populated
     1258 *                                    with this value. Default is the value of $id.
     1259 *     @type string   $class          CSS Class to be added to the `<tr>` element when the
     1260 *                                    field is output. Default empty.
     1261 *     @type string   $description    When supplied, this description will be shown below the
     1262 *                                    input field when using a default callback function.
     1263 *     @type callable $value_callback Callback to retrieve the value. Default is
     1264 *                                    'get_settings_field_option', which calls get_option()
     1265 *                                    based on the $input_name argument.
    12551266 * }
    12561267 */
    12571268function add_settings_field($id, $title, $callback, $page, $section = 'default', $args = array()) {
     
    12671278                $page = 'reading';
    12681279        }
    12691280
     1281        $args = wp_parse_args( $args, array(
     1282                'input_id'       => $id,
     1283                'input_name'     => $id,
     1284                'label_for'      => $id,
     1285                'class'          => '',
     1286                'description'    => '',
     1287                'value_callback' => 'get_settings_field_option',
     1288        ) );
     1289
    12701290        $wp_settings_fields[$page][$section][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $args);
    12711291}
    12721292
     
    13401360                }
    13411361
    13421362                echo '<td>';
    1343                 call_user_func($field['callback'], $field['args']);
     1363
     1364                // Duplicate arguments to not modify globals permanently.
     1365                $field_args = $field['args'];
     1366
     1367                if ( ! empty( $field_args['value_callback'] ) ) {
     1368                        $field_args['value'] = call_user_func( $field_args['value_callback'], $field_args );
     1369                }
     1370
     1371                switch ( $field['callback'] ) {
     1372                        case 'text':
     1373                        case 'number':
     1374                        case 'email':
     1375                        case 'url':
     1376                        case 'tel':
     1377                                $field_args['type'] = $field['callback'];
     1378                                $field['callback'] = 'render_settings_field_text';
     1379                                break;
     1380                        case 'textarea':
     1381                        case 'select':
     1382                        case 'checkbox':
     1383                        case 'radio':
     1384                                $field['callback'] = 'render_settings_field_' . $field['callback'];
     1385                                break;
     1386                }
     1387
     1388                call_user_func( $field['callback'], $field_args );
     1389
    13441390                echo '</td>';
    13451391                echo '</tr>';
    13461392        }
    13471393}
    13481394
    13491395/**
     1396 * Renders a text input for a settings field.
     1397 *
     1398 * This function is used as a default callback when specifying 'text',
     1399 * 'number', 'email', 'url' or 'tel' for the $callback parameter in
     1400 * `add_settings_field()`.
     1401 *
     1402 * @since 4.8.0
     1403 *
     1404 * @param array $field_args Field arguments. See the documentation for the
     1405 *                          $args parameter of `add_settings_field()` for a
     1406 *                          list of default arguments.
     1407 */
     1408function render_settings_field_text( $field_args ) {
     1409        $type = ! empty( $field_args['type'] ) ? $field_args['type'] : 'text';
     1410
     1411        $id    = ! empty( $field_args['input_id'] ) ? ' id="' . esc_attr( $field_args['input_id'] ) . '"' : '';
     1412        $name  = ! empty( $field_args['input_name'] ) ? ' name="' . esc_attr( $field_args['input_name'] ) . '"' : '';
     1413        $value = ! empty( $field_args['value'] ) ? ' value="' . esc_attr( $field_args['value'] ) . '"' : '';
     1414
     1415        echo '<input type="' . esc_attr( $type ) . '"' . $id . $name . $value . '>';
     1416
     1417        if ( ! empty( $field_args['description'] ) ) {
     1418                echo '<p class="description">' . $field_args['description'] . '</p>';
     1419        }
     1420}
     1421
     1422/**
     1423 * Renders a textarea input for a settings field.
     1424 *
     1425 * This function is used as a default callback when specifying 'textarea'
     1426 * for the $callback parameter in `add_settings_field()`.
     1427 *
     1428 * @since 4.8.0
     1429 *
     1430 * @param array $field_args Field arguments. See the documentation for the
     1431 *                          $args parameter of `add_settings_field()` for a
     1432 *                          list of default arguments.
     1433 */
     1434function render_settings_field_textarea( $field_args ) {
     1435        //TODO: Implement this.
     1436}
     1437
     1438/**
     1439 * Renders a dropdown input for a settings field.
     1440 *
     1441 * This function is used as a default callback when specifying 'select'
     1442 * for the $callback parameter in `add_settings_field()`.
     1443 *
     1444 * @since 4.8.0
     1445 *
     1446 * @param array $field_args Field arguments. See the documentation for the
     1447 *                          $args parameter of `add_settings_field()` for a
     1448 *                          list of default arguments.
     1449 */
     1450function render_settings_field_select( $field_args ) {
     1451        //TODO: Implement this.
     1452}
     1453
     1454/**
     1455 * Renders a checkbox input for a settings field.
     1456 *
     1457 * This function is used as a default callback when specifying 'checkbox'
     1458 * for the $callback parameter in `add_settings_field()`.
     1459 *
     1460 * @since 4.8.0
     1461 *
     1462 * @param array $field_args Field arguments. See the documentation for the
     1463 *                          $args parameter of `add_settings_field()` for a
     1464 *                          list of default arguments.
     1465 */
     1466function render_settings_field_checkbox( $field_args ) {
     1467        //TODO: Implement this.
     1468}
     1469
     1470/**
     1471 * Renders a radio input for a settings field.
     1472 *
     1473 * This function is used as a default callback when specifying 'radio'
     1474 * for the $callback parameter in `add_settings_field()`.
     1475 *
     1476 * @since 4.8.0
     1477 *
     1478 * @param array $field_args Field arguments. See the documentation for the
     1479 *                          $args parameter of `add_settings_field()` for a
     1480 *                          list of default arguments.
     1481 */
     1482function render_settings_field_radio( $field_args ) {
     1483        //TODO: Implement this.
     1484}
     1485
     1486/**
     1487 * Retrieves the value for a settings field, based on the field arguments.
     1488 *
     1489 * The function will call `get_option()` based on the 'input_name' argument
     1490 * passed. It will automatically look for the correct key if an array option
     1491 * is used for the field.
     1492 *
     1493 * This is the default callback function used when registering a field with
     1494 * `add_settings_field()`.
     1495 *
     1496 * @since 4.8.0
     1497 *
     1498 * @param array $field_args Field arguments. See the documentation for the
     1499 *                          $args parameter of `add_settings_field()` for a
     1500 *                          list of default arguments.
     1501 * @return mixed The value for the settings field, or null if no value set.
     1502 */
     1503function get_settings_field_option( $field_args ) {
     1504        if ( empty( $field_args['input_name'] ) ) {
     1505                return null;
     1506        }
     1507
     1508        $keys = preg_split( '/\[/', str_replace( ']', '', $field_args['input_name'] ) );
     1509        $base = array_shift( $keys );
     1510
     1511        $value = get_option( $base, null );
     1512        while ( ! empty( $keys ) ) {
     1513                $current_key = array_shift( $keys );
     1514                if ( ! isset( $value[ $current_key ] ) ) {
     1515                        return null;
     1516                }
     1517
     1518                $value = $value[ $current_key ];
     1519        }
     1520
     1521        return $value;
     1522}
     1523
     1524/**
    13501525 * Register a settings error to be displayed to the user
    13511526 *
    13521527 * Part of the Settings API. Use this to show messages to users about settings validation