Adicionar campos de configurações na página de admin de discussão de opções

4

Descrição do problema

Estou procurando uma maneira de adicionar campos de configurações / seção de configurações à ~/wp-admin/options-discussion.php página exatamente onde o Core chama

do_settings_sections('discussion');

Como

Quando eu registro a configuração e adiciono o campo de configurações, nada aparece:

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 / inspecionar

Agora eu estava curioso para saber por que nada apareceu e descartei o global que mantém a seção de configurações logo abaixo dessa linha no core:

var_dump( $GLOBALS['wp_settings_sections'] );

A saída foi um simples simples NULL .

Pergunta

  

Como se registra uma definição lá, sem registrando a seção com add_settings_section( 'discussion', __( 'Title', 'textdomain' ), 'callback', 'discussion' ); primeiro?

Razão

A razão pela qual eu peço "sem registrar a configuração sem a seção" é simples: se outro plugin registra a mesma seção depois, ela sobrescreveria / substituiria a seção adicionada.

EDITAR Para deixar mais claro o que estou pedindo. Estou ciente de que há duas seções default & avatars já está presente na página e eu posso entrar lá. O ponto é que eu não quero enganchar nas configurações de recursos centrais existentes, mas abaixo delas, diretamente nas seções de configurações que o núcleo deve produzir com do_settings_sections( 'discussion' ); . O ponto também é que a página discussion nunca foi registrada pelo núcleo e, portanto, não pode ser usada como do_settings_section() anula sem poder percorrer quaisquer páginas (não) registradas. Estou totalmente satisfeito com uma resposta que confirma isso e afirma: Não, não funciona. É um bug. ou ainda melhor cria ou ajuda a criar um patch .

    
por kaiser 25.04.2013 / 16:57

1 resposta

7

Você precisa chamar add_settings_section() primeiro, passar um ID único e atribuí-lo à página (nome incorreto) discussion :

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

Em seguida, registre um retorno de chamada para salvar seu (s) campo (s)…

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

… e, em seguida, registre um ou mais 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' )
);

Aqui está um exemplo muito simples:

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']
    );
}

Observe o quinto parâmetro para add_settings_field() .

Resultado

    
por fuxia 25.04.2013 / 17:00