WordPress设置API添加字段

时间:2011-09-02 作者:Lee

我正在尝试向主题添加一些代码,允许用户更改徽标或使用一些文本。我设法找到了奥托发布的一些代码来上传文件。

我添加了我认为是如何添加其他字段的内容,但由于某些原因,这些字段无法保存,我相信这是我错过的非常简单的内容:

add_action(\'admin_init\', \'ld_admin_init\');
function ld_admin_init() {
register_setting( \'ld_options\', \'ld_options\', \'ld_options_validate\' );
add_settings_section(\'ld_main\', \'Upload\', \'ld_section_text\', \'ld\');
add_settings_field(\'ld_setting_checkbox\', \'Use image\', \'ld_setting_checkbox\', \'ld\', \'ld_main\');
add_settings_field(\'ld_setting_string\', \'Logo text\', \'ld_setting_string\', \'ld\', \'ld_main\');
add_settings_field(\'ld_filename\', \'File:\', \'ld_setting_filename\', \'ld\', \'ld_main\');
}

// add the admin options page
add_action(\'admin_menu\', \'ld_admin_add_page\');
function ld_admin_add_page() {
$mypage = add_theme_page(\'Logo\', \'Logo\', \'manage_options\', \'ld\', \'ld_options_page\');
}

// display the admin options page
function ld_options_page() {

?>
<div class="wrap">
<h2>Logo settings</h2>
<p>You can upload a new logo.</p>
<form method="post" enctype="multipart/form-data" action="options.php">
<?php settings_fields(\'ld_options\'); ?>
<?php do_settings_sections(\'ld\'); ?>
<p class="submit">
<input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e(\'Save Changes\') ?>" />
</p>
</form>

</div>

<?php
}

function ld_section_text() {
$options = get_option(\'ld_options\');
echo \'<p>Upload your file here:</p>\';
if ($file = $options[\'file\']) {
    //var_dump($file);
    echo "<img src=\'{$file[\'url\']}\' />";
}
}

function ld_setting_filename() {
echo \'<input type="file" name="ld_filename" size="40" />\';
}

function ld_setting_checkbox() {
$usetext = get_option(\'ld_options\');
if($usetext[\'chkbox1\']) { $checked = \' checked="checked" \'; }
echo "<input ".$checked." id=\'plugin_chk1\' name=\'ld_options[chkbox1]\' type=\'checkbox\' />";
}

function ld_setting_string() {
$logotext = get_option(\'ld_options\');
echo "<input id=\'ld_logo_text\' name=\'ld_options[text_string]\' size=\'40\' type=\'text\' value=\'{$logotext[\'text_string\']}\' />";
}

function ld_options_validate($input) {
$newinput = array();
if ($_FILES[\'ld_filename\']) {
    $overrides = array(\'test_form\' => false); 
    $file = wp_handle_upload($_FILES[\'ld_filename\'], $overrides);
    $newinput[\'file\'] = $file;
}
return $newinput;
}
我想能够设置它,以便他们可以上传图像,如果框被勾选,则图像用于徽标,否则将显示文本。我需要保存信息,以便在输出中使用它。

2 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

您将相同的ID传递给给定类型的每个设置,而不是将$设置传递给回调。看看how I implement this type of callback in Oenology.

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
}

SO网友:sanchothefat

据我从代码中看到的,问题是您没有在ld_options_validate() 作用您只需返回$newinput 只能包含文件名的数组。

尝试以下方法ld_options_validate():

function ld_options_validate( $input ) {
    // set $newinput to the $input that was POSTed
    $newinput = $input;

    // update the file field
    if ($_FILES[\'ld_filename\']) {
        $overrides = array(\'test_form\' => false); 
        $file = wp_handle_upload($_FILES[\'ld_filename\'], $overrides);
        $newinput[\'file\'] = $file;
    } else {
        $newinput[\'file\'] = maybe_unserialize( $input[\'file\'] );
    }

    return $newinput;
}
虽然这表明修复了其他字段的实际问题,但您需要维护file 部分$input 因此,当没有上载图像时,它不会被覆盖。为此,您需要存储file 在表单中的隐藏字段中,尽管由于序列化,事情可能会变得棘手。

显示图像的位置ld_section_text() 添加以下内容:

echo \'<input type="hidden" name="ld_options[file]" value="\' . serialize( $file ) . \'" />\';
我很想分别注册每个字段的设置,以简化验证。

结束

相关推荐