web-dev-qa-db-ja.com

設定API - 再利用可能なフォーム要素を作成する?

一連の設定フィールドがあります。

(...)
add_settings_field( 'Option1', 'Option 1', 'textarea', 'page1', 'plugin_options');  
add_settings_field( 'Option2', 'Option 2', 'textarea', 'page1', 'plugin_options'); 
add_settings_field( 'Option3', 'Option 3', 'text_input', 'page1', 'plugin_options');  
add_settings_field( 'Option4', 'Option 4', 'text_input', 'page1', 'plugin_options');
(...)   

すべてのチュートリアルとコーデックスは設定フィールドごとに別々のレンダリング関数を作成しなければならないと述べていますが、チェックボックス、ラジオボタン、テキストエリアなどのすべての入力フィールドに対して基本関数だけを作成して再利用するのはそれほど簡単ではないでしょうか。

これらの関数にフィールドIDを渡すことができるようになれば、スムーズに機能すると思いますが、どうしたのかわかりませんか。

function textarea() {
    $options = get_option('my_settings');
    echo "<textarea id='[how to get ID?]' name='my_settings[[how to get ID?]'>{$options['how to get ID?']}</textarea>";
}
5
Wordpressor

再利用可能なフォームフィールドのマークアップをadd_settings_field()に渡すことができるのは間違いありません。トリックは、各設定に対してデータ型を定義してから、add_settings_field()の各呼び出しに 同じコールバック を渡すことです。そのコールバック内に、各データ型のケースを含むswitchを追加するだけです。

これが Oenologyでのやり方

まず、add_settings_field()へのすべての呼び出しを動的に出力します。

<?php
/**
 * Call add_settings_field() for each Setting Field
 * 
 * Loop through each Theme option, and add a new 
 * setting field to the Theme Settings page for each 
 * setting.
 * 
 * @link    http://codex.wordpress.org/Function_Reference/add_settings_field    Codex Reference: add_settings_field()
 * 
 * @param   string      $settingid  Unique Settings API identifier; passed to the callback function
 * @param   string      $title      Title of the setting field
 * @param   callback    $callback   Name of the callback function in which setting field markup is output
 * @param   string      $pageid     Name of the Settings page to which to add the setting field; passed from add_settings_section()
 * @param   string      $sectionid  ID of the Settings page section to which to add the setting field; passed from add_settings_section()
 * @param   array       $args       Array of arguments to pass to the callback function
 */
foreach ( $option_parameters as $option ) {
    $optionname = $option['name'];
    $optiontitle = $option['title'];
    $optiontab = $option['tab'];
    $optionsection = $option['section'];
    $optiontype = $option['type'];
    if ( 'internal' != $optiontype && 'custom' != $optiontype ) {
        add_settings_field(
            // $settingid
            'oenology_setting_' . $optionname,
            // $title
            $optiontitle,
            // $callback
            'oenology_setting_callback',
            // $pageid
            'oenology_' . $optiontab . '_tab',
            // $sectionid
            'oenology_' . $optionsection . '_section',
            // $args
            $option
        );
    } if ( 'custom' == $optiontype ) {
        add_settings_field(
            // $settingid
            'oenology_setting_' . $optionname,
            // $title
            $optiontitle,
            //$callback
            'oenology_setting_' . $optionname,
            // $pageid
            'oenology_' . $optiontab . '_tab',
            // $sectionid
            'oenology_' . $optionsection . '_section'
        );
    }
}
?>

そしてこれが私がoenology_setting_callback()を定義する方法です:

<?php
/**
 * Callback for get_settings_field()
 */
function oenology_setting_callback( $option ) {
    $oenology_options = oenology_get_options();
    $option_parameters = oenology_get_option_parameters();
    $optionname = $option['name'];
    $optiontitle = $option['title'];
    $optiondescription = $option['description'];
    $fieldtype = $option['type'];
    $fieldname = 'theme_oenology_options[' . $optionname . ']';

    // Output checkbox form field markup
    if ( 'checkbox' == $fieldtype ) {
        ?>
        <input type="checkbox" name="<?php echo $fieldname; ?>" <?php checked( $oenology_options[$optionname] ); ?> />
        <?php
    }
    // Output radio button form field markup
    else if ( 'radio' == $fieldtype ) {
        $valid_options = array();
        $valid_options = $option['valid_options'];
        foreach ( $valid_options as $valid_option ) {
            ?>
            <input type="radio" name="<?php echo $fieldname; ?>" <?php checked( $valid_option['name'] == $oenology_options[$optionname] ); ?> value="<?php echo $valid_option['name']; ?>" />
            <span>
            <?php echo $valid_option['title']; ?>
            <?php if ( $valid_option['description'] ) { ?>
                <span style="padding-left:5px;"><em><?php echo $valid_option['description']; ?></em></span>
            <?php } ?>
            </span>
            <br />
            <?php
        }
    }
    // Output select form field markup
    else if ( 'select' == $fieldtype ) {
        $valid_options = array();
        $valid_options = $option['valid_options'];
        ?>
        <select name="<?php echo $fieldname; ?>">
        <?php 
        foreach ( $valid_options as $valid_option ) {
            ?>
            <option <?php selected( $valid_option['name'] == $oenology_options[$optionname] ); ?> value="<?php echo $valid_option['name']; ?>"><?php echo $valid_option['title']; ?></option>
            <?php
        }
        ?>
        </select>
        <?php
    } 
    // Output text input form field markup
    else if ( 'text' == $fieldtype ) {
        ?>
        <input type="text" name="<?php echo $fieldname; ?>" value="<?php echo wp_filter_nohtml_kses( $oenology_options[$optionname] ); ?>" />
        <?php
    } 
    // Output the setting description
    ?>
    <span class="description"><?php echo $optiondescription; ?></span>
    <?php
}
?>

私は「カスタム」タイプを考慮しているので、それが必要になるかもしれない設定のために一回限りのマークアップを出力することができるように。これらは個々のコールバックを必要とします。

また、このコードではタブ付きの設定ページが使用されていますが、これは必要以上に複雑な場合があります。ただし、そのビットを静的にするのは簡単なはずです。

7
Chip Bennett