it-swarm.com.de

Eine Taste, um alle Einstellungen im Theme Customizer zu ändern?

Ich habe versucht, eine Schaltfläche zum Zurücksetzen des Themas für den Theme-Customizer zu erstellen, mit der alle theme_mod-Einstellungen automatisch entfernt werden. Ich habe mehrere Möglichkeiten ausprobiert, um dies zu erreichen, und konnte es nie zum Laufen bringen. Wie hier zu sehen.

Nach mehreren fehlgeschlagenen Versuchen, die Methode remove_theme_mods zu verwenden, frage ich mich, ob dies mein Problem ist, außer dass Ajax und Javascript fehlerhaft sind und die Schaltfläche nicht richtig binden.

Da ich alle Standardeinstellungen in einem großen Array speichere, werden bei der Installation meines Themas automatisch Werte auf der Seite zum Anpassen des Themas angezeigt, und das Thema hat ein bestimmtes Aussehen. Ich dachte, ich könnte einen anderen Ansatz wählen, um das Thema zu entfernen Einstellungen, die ich gerade über sie reite, vielleicht mit einem benutzerdefinierten Steuerelement? Möglicherweise, indem Sie diese Standardwerte irgendwie allen Einstellungen zuweisen? Ich hoffe wirklich, dass mir jemand dabei helfen kann. Wenn Sie irgendwelche Ideen haben, würde ich es sehr sehr schätzen.

Hier ist ein Beispiel, wie ich die Standardwerte für das Thema zuweisen:

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;

}
3
user1632018

Das Problem bei der Verwendung von remove_theme_mods zum Anzeigen von Standardeinstellungen im Customizer ist

  • der Customizer ist eine Vorschau, die Sie ohne Speichern verlassen können.
  • die einzelnen theme_mods werden gefiltert, aber nicht das gesamte theme_mod-Array.
  • theme_mods enthält Menüs und Widgets.

Ich wollte auch eine Reset-Taste, habe mich aber dafür entschieden, ein Preset-Steuerelement zu erstellen, und eine der Voreinstellungen ist "Defaults". Auf diese Weise wird eine select verwendet, sodass es kein Problem mit der nicht funktionierenden Schaltfläche gibt (da bind für Wertänderungen und Schaltflächen deren Werte nicht ändern).

Der Trick besteht darin, mit Ajax die ausgewählte Voreinstellung abzurufen und dann die Werte in Javascript zu durchlaufen und sie den Einstellungen zuzuweisen, damit diese Änderungen die Aktualisierung der Vorschau auslösen. Mein Code enthält Filter, mit denen untergeordnete Themen weitere Optionen und Voreinstellungen hinzufügen können. Die Voreinstellungen können Teilmengen der verfügbaren Optionen sein.

Hier ist PHP für das Preset-Steuerelement (nur eine normale select, aber ein einstellungsloses Steuerelement):

$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(),
) );

Hier ist der Rest der PHP Funktionen .

/**
 * 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' );

Und dann nur ein bisschen Javascript , um die Ajax-Anfrage zu stellen. Dies wird für die Aktion 'customize_controls_enqueue_scripts' in die Warteschlange gestellt. (Ich habe die Anzeige der Fehlermeldung weggelassen.)

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 );
                }
            } );
        } );
    } );
} );
1
Joy Reynolds

Es gibt eine Funktion namens remove_theme_mods , die alle Theme-Mods tötet. Beachten Sie jedoch, dass dadurch nicht nur die Mods entfernt werden, die Sie in Ihrem Design mit der Customizer-API definiert haben. Es wird auch auf andere Mods abzielen, wie zum Beispiel die Menüpositionen. Widget-Positionen sind derzeit als Optionen definiert, nicht als Mods. Dies kann sich jedoch in Zukunft ändern. WordPress wird wahrscheinlich mehr Dinge von Optionen auf Mods verschieben, was die Verwendung von remove_theme_mods umso gefährlicher macht.

Am besten ordnen Sie alle Mods, die zum eigentlichen Thema gehören, in einem Array an. Sie können dieses Array dann durchlaufen und die einzelnen Mods mit remove_theme_mod entfernen.

1
cjbj

Gehen Sie auf Ihrer Seite für die Themeneinstellung folgendermaßen vor:

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

dadurch werden alle theme_mod-Einstellungen entfernt

function reset_newtheme_options() { 
    remove_theme_mods();
}
0
Kokil