Ajouter plusieurs champs personnalisés à la page des paramètres généraux

22

Ce que je voudrais faire, c'est ajouter quelques champs personnalisés aux paramètres généraux. Ceci est le code que j'utilise. Cela fonctionne bien, mais je n'arrive pas à comprendre comment ajouter plus de champs.

Je voudrais créer deux champs pour l'instant, un pour le numéro de téléphone et le second pour l'adresse:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('My Field' , 'my_first_field' ).'</label>' , 'print_custom_field', 'general');
}

function print_custom_field()
{
    $value = get_option( 'my_first_field', '' );
    echo '<input type="text" id="my_first_field" name="my_first_field" value="' . $value . '" />';
}

add_filter('admin_init', 'register_fields');

La seule façon dont j'ai réussi à le faire fonctionner pour plusieurs champs était de tout dupliquer.

Alors, cela ressemblerait à ceci:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('My Field' , 'my_first_field' ).'</label>' , 'print_first_field', 'general');

    register_setting('general', 'my_second_field', 'esc_attr');
    add_settings_field('my_second_field', '<label for="my_second_field">'.__('My Field' , 'my_second_field' ).'</label>' , 'print_second_field', 'general');
}

function print_first_field()
{
    $value = get_option( 'my_first_field', '' );
    echo '<input type="text" id="my_first_field" name="my_first_field" value="' . $value . '" />';
}

function print_second_field()
{
    $value = get_option( 'my_second_field', '' );
    echo '<input type="text" id="my_second_field" name="my_second_field" value="' . $value . '" />';
}

add_filter('admin_init', 'register_fields');

Mais ce n'est probablement pas la meilleure façon de le faire, j'ai essayé de créer un settings_sectionmais ça n'a tout simplement pas fonctionné ou n'a pas enregistré etc. C'est juste très déroutant.

Richard Mišenčík
la source

Réponses:

26

Eh bien, le deuxième morceau de code est techniquement la bonne façon de le faire. Cependant, à la fin de la, add_settings_field()vous pouvez transmettre des arguments.

Veuillez consulter la référence de la fonction WordPress Add_Settings_Field . Cela vous aidera à mieux comprendre le add_settings_field()fonctionnement réel de la fonction.

Maintenant, cela dit, vous pouvez utiliser une fonction «partagée» pour votre rappel. Comme je le fais dans ma page d'options lorsque je développe des thèmes.

Voici un exemple de la façon dont je le fais.

// My Example Fields
add_settings_field(  
    'tutorial_display_count',                      
    'Tutorial Display Count',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'tutorial_display_count' // $args for callback
    ) 
);
add_settings_field(  
    'blog_display_count',                      
    'Blog Display Count',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'blog_display_count'  // $args for callback
    ) 
);

// My Shared Callback
function ch_essentials_textbox_callback($args) { 

$options = get_option('ch_essentials_front_page_option'); 

echo '<input type="text" id="'  . $args[0] . '" name="ch_essentials_front_page_option['  . $args[0] . ']" value="' . $options[''  . $args[0] . ''] . '"></input>';

}

Il faudra un peu de personnalisation pour répondre à vos besoins, mais faire une fonction partagée pour vos rappels vous fera économiser beaucoup d'espace en termes de code. À part cela, vous le faites correctement tel quel.

--Éditer--

Ok, voici à quoi cela devrait ressembler pour vous .. modifiez simplement le code selon vos besoins, j'ai écrit ceci à la volée .. Je l'ai testé pour vérifier, et cela a fonctionné. Vous avez juste besoin de modifier le add_settings_field(s) selon vos besoins. Si vous devez en ajouter, copiez-collez-en un et modifiez-le. Assurez-vous que register_settingcela ne fonctionnera pas.

add_action('admin_init', 'my_general_section');  
function my_general_section() {  
    add_settings_section(  
        'my_settings_section', // Section ID 
        'My Options Title', // Section Title
        'my_section_options_callback', // Callback
        'general' // What Page?  This makes the section show up on the General Settings Page
    );

    add_settings_field( // Option 1
        'option_1', // Option ID
        'Option 1', // Label
        'my_textbox_callback', // !important - This is where the args go!
        'general', // Page it will be displayed (General Settings)
        'my_settings_section', // Name of our section
        array( // The $args
            'option_1' // Should match Option ID
        )  
    ); 

    add_settings_field( // Option 2
        'option_2', // Option ID
        'Option 2', // Label
        'my_textbox_callback', // !important - This is where the args go!
        'general', // Page it will be displayed
        'my_settings_section', // Name of our section (General Settings)
        array( // The $args
            'option_2' // Should match Option ID
        )  
    ); 

    register_setting('general','option_1', 'esc_attr');
    register_setting('general','option_2', 'esc_attr');
}

function my_section_options_callback() { // Section Callback
    echo '<p>A little message on editing info</p>';  
}

function my_textbox_callback($args) {  // Textbox Callback
    $option = get_option($args[0]);
    echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}
MrJustin
la source
Donc, ce que je ne comprends pas, c'est le 4ème et le 5ème paramètre dans add_settings_field (). Je sais que le premier est l'ID, le deuxième est le nom, le troisième est le rappel pour l'afficher, mais à quoi servent les prochains? Vous avez ch_essentials_front_page_option pour les deux, j'ai juste "général" au même endroit, le suivant est vide et le dernier est maintenant le tableau args. Alors maintenant, dans le rappel, vous avez get_option avec cette valeur, mais je ne sais pas quoi y mettre dans mon cas.
Richard Mišenčík
2
Le montage a été fait, cela devrait vous permettre de démarrer à 100%. Faites-moi savoir si vous avez des problèmes ou des questions. Je l'ai fortement commenté.
MrJustin
@MrJusting Merci beaucoup. Je l'ai fait fonctionner en regardant votre profil et en vérifiant une question à laquelle vous avez répondu, "Implémentation d'onglets sur une page de menu personnalisée". Il a été très bien commenté, alors j'ai comparé mon code et j'ai finalement compris comment cela fonctionne. Pour moi, les paramètres de page et de section étaient déroutants, je pensais que c'était comme une section de la page et non la section des paramètres. Alors maintenant, j'ai combiné les deux ensemble et ajouté une autre valeur à $ args, donc d'abord l'ID de champ et le second est la description, puis j'ai ajouté une autre ligne à la fonction de rappel pour faire écho à la description avec args [1] :)
Richard Mišenčík
Super, je suis content que vous ayez compris, si vous avez des questions, faites-le moi savoir.
MrJustin
Je pense que j'essaierai maintenant de créer une page de menu distincte et d'y ajouter les options, car en général et en bas son genre de perdu. Je vous ferai savoir comment cela s'est passé
Richard Mišenčík
0

La meilleure façon est d'utiliser des plugins d'options wordpress. L'un des meilleurs est les champs personnalisés avancés.

http://www.advancedcustomfields.com/

Si vous achetez un module complémentaire de page d'options, vous pouvez créer une page d'options illimitée avec de nombreuses fonctionnalités. S'il vous plaît quoi sur une vidéo.

http://www.advancedcustomfields.com/add-ons/options-page/

Plugin et addon très utiles.

Foxsk8
la source
3
Je veux juste ajouter quelques champs, donc le plugin juste pour cela serait une exagération pour moi mais merci.
Richard Mišenčík
8
Sans oublier que cela ne résout pas ce que l'OP voulait, qui était d'ajouter des champs aux paramètres généraux. AFAIK, ACF ne vous permet pas d'ajouter des champs aux paramètres généraux.
NW Tech