一个按钮即可更改主题定制器中的所有设置?

时间:2013-05-16 作者:user1632018

我一直在尝试为theme customizer创建一个theme reset按钮,自动删除所有theme\\u mod设置。我尝试了多种方法来做到这一点,但始终未能成功。 As seen here.

在多次尝试使用remove\\u theme\\u mods方法失败后,我开始怀疑这是否是我的问题,除了ajax和javascript出现故障并且没有正确绑定按钮之外。

由于我将所有默认值保存到一个大数组中,因此当安装主题时,它会自动在主题自定义程序页面上填充值,并且主题具有特定的外观。。。我在想,我可以尝试一种不同的方法来删除我刚刚跳过的主题设置,也许可以使用自定义控件?可能通过某种方式将这些默认值分配给所有设置?我真的希望有人能帮我把这件事做好。如果你有任何想法,我将非常感激。

以下是我如何为主题指定默认值的示例:

function newtheme_get_theme_mods() {

$defaults = array(

        \'newtheme_responsive\'                 => true,

        \'newtheme_hero_title\'                 => \'Beautiful and Elegant\',

        \'newtheme_hero_description\'           => \'The best theme in the world\',

                \'newtheme_header_logo\'                => \'/wp-content/themes/newtheme/img/logo.png\',

                \'newtheme_header_background_color\'    => \'rgba(35,35,35, 0.9)\'


    return $defaults;

}

4 个回复
SO网友:cjbj

有一个函数称为remove_theme_mods 这将杀死所有的主题mod。但是,请注意,这不仅会删除您在主题中使用customizer API. 它还将针对其他MOD,例如菜单位置。Widget位置目前定义为选项,而不是mod,但将来可能会发生变化。WordPress可能会将更多内容从选项转移到mods,使remove_theme_mods 使用起来更加危险。

最好的方法是将属于该主题的所有mod都安排在一个数组中。然后,您可以通过该阵列循环并使用remove_theme_mod.

SO网友:Joy Reynolds

使用的问题remove_theme_mods 用于在自定义程序中显示默认值的是

自定义程序是一个预览,您可以不保存就退出,过滤单个theme\\u mod,但不过滤整个theme\\u mod数组,theme\\u mod包括菜单和小部件我还想要一个重置按钮,但我选择了创建一个预设控件,其中一个预设是“默认值”。这种方式使用select, 因此,按钮不工作没有问题(因为bind 用于值更改,按钮不更改其值)。

诀窍是使用ajax检索所选预设,然后循环javascript中的值,将它们分配给设置,以便这些更改将触发预览的刷新。我的代码包括过滤器,以便子主题可以添加更多选项和预设。预设可以是可用选项的子集。

这里是PHP for the Preset control (只是个普通人select, 但无设置控件):

$wp_customize->add_control( \'option_presets\', array(
    \'label\'    => __( \'Use preset theme options\', \'mytheme\' ),
    \'description\' => __( \'Theme options will be set to the preset values.\', \'mytheme\' ),
    \'section\'  => \'mytheme_section\',
    \'settings\' => array(),
    \'type\'     => \'select\',
    \'capability\' => \'edit_theme_options\',
    \'choices\'  => mytheme_option_presets_choices(),
) );
这是rest of the PHP functions.

/**
 * Supply list of choices for option presets.
 */
function mytheme_option_presets_choices() {
    return apply_filters( \'mytheme_option_presets_choices\', array(
        \'none\' => __( \'Select preset\', \'mytheme\' ),
        \'defaults\' => __( \'Defaults\', \'mytheme\' ),
        \'dark\' => __( \'Dark\', \'mytheme\' ),
    ) );
}

/**
 * Sanitize an option preset choice.
 */
function mytheme_sanitize_option_presets_choice( $input ) {
    $valid = mytheme_option_presets_choices();
    return array_key_exists( $input, $valid ) ? $input : \'none\';
}

/**
 * Get the preset values for the chosen option preset.
 */
function mytheme_option_preset( $which ) {
    $values = array();
    if ( \'defaults\' === $which ) {
        $values = mytheme_default_values();
    }
    if ( \'dark\' === $which ) {
        $values = array(
            \'body_textcolor\' => \'#f9f7f7\',
            \'background_color\' => \'#444244\',
            \'header_textcolor\' => \'#bf9a07\',
            \'area_classes\' => array(
                \'sidebar\' => \'semi-black\',
                \'widgets\' => \'box\',
                ),
        );
    }
    return apply_filters( \'mytheme_option_preset\', $values, $which );
}

/**
 * Add a nonce for Customizer for option presets.
 */
function mytheme_refresh_nonces( $nonces ) {
    $nonces[\'mytheme-customize-presets\'] = wp_create_nonce( \'mytheme-customize-presets\' );
    return $nonces;
}
add_filter( \'customize_refresh_nonces\', \'mytheme_refresh_nonces\' );

/**
 * Ajax handler for supplying option preset values.
 */
function mytheme_ajax_option_preset_values() {
    check_ajax_referer( \'mytheme-customize-presets\', \'option_presets_nonce\' );
    if ( ! current_user_can( \'edit_theme_options\' ) ) {
        wp_die( -1 );
    }

    if ( empty( $_POST[\'option_preset\'] ) ) {
        wp_send_json_error( \'mytheme_missing_preset_parameter\' );
    }
    $preset = sanitize_text_field( wp_unslash( $_POST[\'option_preset\'] ) );
    $values = mytheme_option_preset( $preset );
    if ( empty( $values ) ) {
        wp_send_json_error( array( \'message\' => __( \'No preset found.\', \'mytheme\' ) ) );
    }
    else {   // Flatten the array.
        foreach ($values as $key => $avalue) {
            if ( is_array( $avalue ) ) {
                unset( $values[$key] );
                foreach ($avalue as $subkey => $subvalue) {
                    $values[$key . \'[\' . $subkey . \']\'] = $subvalue;
                }
            }
        }
        wp_send_json_success( array( \'values\' => $values ) );
    }
}
add_action( \'wp_ajax_mytheme_option_preset\', \'mytheme_ajax_option_preset_values\' );
然后只是little bit of Javascript 发出ajax请求。这已在上排队\'customize_controls_enqueue_scripts\' 行动(我没有显示错误消息。)

wp.customize.control( \'option_presets\', function( control ) {
    control.element = new wp.customize.Element( control.container.find( \'select\' ) );
    control.element.bind( function( preset ) {
        var request = wp.ajax.post( \'mytheme_option_preset\', {
            option_presets_nonce: wp.customize.settings.nonce[\'mytheme-customize-presets\'],
            wp_customize: \'on\',
            customize_theme: wp.customize.settings.theme.stylesheet,
            option_preset: preset
        } );
        request.done( function( response ) {
            _.each( response.values, function( value, id ) {
                var setting = wp.customize( id );
                if ( setting ) {
                    setting.set( value );
                }
            } );
        } );
    } );
} );

SO网友:Core

因此,在主题设置页面中,请执行以下操作:

if( isset( $_REQUEST[\'resetl_all\'] ) ){
    call_reset_function(); // or newtheme_get_theme_mods function (I guess)                      
}

SO网友:Kokil

这将删除所有theme\\u mod设置

function reset_newtheme_options() { 
    remove_theme_mods();
}

结束