web-dev-qa-db-fra.com

Ajouter des champs de paramètres sur la page d'administration de discussion des options

Description du problème

Je cherche un moyen d'ajouter une section de paramètres/des champs de paramètres à la page ~/wp-admin/options-discussion.php exactement où Core appelle

do_settings_sections('discussion');

Comment

Lorsque j'enregistre le paramètre et ajoute le champ de paramètres, rien ne s'affiche:

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()
    );
}

Déboguer/inspecter

Maintenant, je suis curieux de savoir pourquoi rien n’est apparu et jeté le fichier global contenant la section des paramètres juste en dessous de cette ligne:

var_dump( $GLOBALS['wp_settings_sections'] );

La sortie était une simple simple NULL.

Question

Comment enregistrer une installation ici,sansen enregistrant la section avec add_settings_section( 'discussion', __( 'Title', 'textdomain' ), 'callback', 'discussion' ); en premier?

Raison

La raison pour laquelle je demande "sans enregistrer le paramètre sans la section" est simple: si un autre plugin enregistre la même section par la suite, il écrasera/remplacera la section ajoutée.

EDITPour préciser ce que je demande. Je sais que deux sections default & avatars sont déjà présentes sur la page et que je peux y accéder. Le point est que je ne veux pas me connecter aux paramètres de fonctionnalités de base existants, mais ci-dessous eux, juste dans les sections de paramètres que le noyau devrait afficher avec do_settings_sections( 'discussion' );. Il est également intéressant de noter que la page discussion n'a jamais été enregistrée par le noyau et ne peut donc pas être utilisée en tant qu'abandon de do_settings_section() sans pouvoir parcourir les pages (non) enregistrées. Je suis tout à fait d'accord avec une réponse confirmant cela et indiquant: Non, cela ne fonctionne pas. Est-ce un bug. ouvoire mieuxcrée ou aide à créer un patch .

4
kaiser

Vous devez d'abord appeler add_settings_section(), passer un ID unique et l'assigner à la page (nom pauvre) discussion:

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

Enregistrez ensuite un rappel pour enregistrer votre (vos) champ (s)…

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

… Puis enregistrez un ou plusieurs champs:

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

Voici un exemple très 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']
    );
}

Notez le cinquième paramètre pour add_settings_field().

Résultat

enter image description here

7
fuxia