Agregar campos de configuración en la página de administración de discusión de opciones

4

Descripción del problema

Estoy buscando una manera de agregar una sección de configuración / campos de configuración a la página ~/wp-admin/options-discussion.php exactamente donde Core llama ...

do_settings_sections('discussion');

Cómo hacer

Cuando registro la configuración y agrego el campo de configuración, no aparece nada:

function register_setting()
{
    register_setting(
         'discussion'
        ,$this->option_name
        ,array( $this, 'sanitize_setting' )
    );
}

public function add_settings_field()
{
    add_settings_field(
         $this->option_name
        ,__( 'Label', 'wpse_textdomain' )
        ,array( $this, 'render_field' )
        ,'discussion'
        ,'discussion'
        ,array()
    );
}

Depurar / inspeccionar

Ahora sentía curiosidad por el motivo por el que no apareció nada y volcó el global que contiene la sección de configuración justo debajo de esa línea en el núcleo:

var_dump( $GLOBALS['wp_settings_sections'] );

La salida fue un simple NULL .

Pregunta

  

¿Cómo se registra un establecimiento allí, sin registrar la sección con add_settings_section( 'discussion', __( 'Title', 'textdomain' ), 'callback', 'discussion' ); primero?

Motivo

La razón por la que solicito "sin registrar la configuración sin la sección" es sencilla: si otro complemento registra la misma sección después, sobrescribirá / anulará la sección agregada.

EDIT para que quede más claro lo que estoy pidiendo. Soy consciente de que hay dos secciones default & avatars ya está presente en la página y puedo conectarlo allí. El punto es que no quiero enlazar con la configuración de la función principal existente, pero a continuación , directamente en las secciones de configuración que el núcleo debería producir con do_settings_sections( 'discussion' ); . El punto también es que la página discussion nunca fue registrada por el núcleo y, por lo tanto, no se puede utilizar como do_settings_section() aborta sin poder recorrer cualquier página (no) registrada. Estoy completamente de acuerdo con una respuesta que confirma eso y dice: No, no funciona. Es un error. o incluso mejor crea o ayuda a crear un parche .

    
pregunta kaiser 25.04.2013 - 16:57

1 respuesta

7

Primero debe llamar a add_settings_section() , pasar una ID única y asignarla a la página (nombre deficiente) discussion :

add_settings_section( 'ads_id', 'Extra Settings', 'ads_description', 'discussion' );

Luego registre una devolución de llamada para guardar su (s) campo (s) ...

// Register a callback
register_setting(
    'discussion',
    'ads',
    'trim'
);

... y luego registre uno o más campos:

// Register the field for the "avatars" section.
add_settings_field(
    'ads',
    'Test field',
    'ads_show_settings',
    'discussion',
    'ads_id',
    array ( 'label_for' => 'ads_id' )
);

Aquí hay un ejemplo muy simple:

add_action( 'admin_init', 'ads_register_setting' );

/**
 * Tell WP we use a setting - and where.
 */
function ads_register_setting()
{
    add_settings_section(
        'ads_id',
        'Extra Settings',
        'ads_description',
        'discussion'
    );

    // Register a callback
    register_setting(
        'discussion',
        'ads',
        'trim'
    );
    // Register the field for the "avatars" section.
    add_settings_field(
        'ads',
        'Test field',
        'ads_show_settings',
        'discussion',
        'ads_id',
        array ( 'label_for' => 'ads_id' )
    );
}

/**
 * Print the text before our field.
 */
function ads_description()
{
    ?><p class="description">This is the description</p><?php
}

/**
 * Show our field.
 *
 * @param array $args
 */
function ads_show_settings( $args )
{
    $data = esc_attr( get_option( 'ads', '' ) );

    printf(
        '<input type="text" name="ads" value="%1$s" id="%2$s" />',
        $data,
        $args['label_for']
    );
}

Note el quinto parámetro para add_settings_field() .

Resultado

    
respondido por el fuxia 25.04.2013 - 17:00

Lea otras preguntas en las etiquetas