J'ai essayé de créer un bouton de réinitialisation de thème pour le personnalisateur de thème qui supprime automatiquement tous les paramètres theme_mod. J'ai essayé plusieurs façons de le faire et je n'ai jamais réussi à le faire fonctionner. Comme vu ici.
Après plusieurs tentatives infructueuses utilisant l'approche remove_theme_mods, je commence à me demander s'il ne s'agit pas de mon problème, à part le fait qu'ajax et javascript soient défectueux et ne lient pas correctement le bouton.
Comme je sauvegarde toutes les valeurs par défaut dans un grand tableau, lorsque mon thème est installé, les valeurs sont automatiquement renseignées sur la page de personnalisation du thème, et le thème a un aspect spécifique ... Je pensais pouvoir essayer une approche différente pour supprimer le thème. paramètres que je viens de surpasser, peut-être avec un contrôle personnalisé? Peut-être en attribuant ces valeurs par défaut à tous les paramètres? J'espère vraiment que quelqu'un pourra m'aider à faire avancer les choses. Si vous avez des idées, je vous en serais très reconnaissant.
Voici un exemple de la façon dont j'attribue les valeurs par défaut pour le thème:
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;
}
Le problème lié à l'utilisation de remove_theme_mods
pour afficher les valeurs par défaut dans le Customizer est
Je voulais aussi un bouton de réinitialisation, mais j'ai plutôt choisi de créer un contrôle de préréglage, et l'un des préréglages est "par défaut". De cette façon, la variable select
est utilisée. Il n'y a donc aucun problème à ce que le bouton ne fonctionne pas (car bind
concerne les modifications de valeur et les boutons ne modifient pas leurs valeurs).
L'astuce consiste à utiliser ajax pour récupérer le préréglage choisi, puis à parcourir les valeurs en javascript, en les affectant aux paramètres de sorte que ces modifications déclenchent l'actualisation de l'aperçu. Mon code inclut des filtres pour que les thèmes enfants puissent ajouter davantage d'options et de paramètres prédéfinis. Et les préréglages peuvent être des sous-ensembles des options disponibles.
Voici PHP pour le contrôle des préréglages (juste une select
normale, mais un contrôle sans paramètre):
$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(),
) );
Voici le reste des fonctions PHP .
/**
* 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' );
Et puis juste un peu de Javascript pour faire la requête ajax. Ceci est mis en file d'attente sur l'action 'customize_controls_enqueue_scripts'
. (j'ai oublié l'affichage du message d'erreur.)
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 );
}
} );
} );
} );
} );
Il existe une fonction appelée remove_theme_mods
qui va tuer tous les mods du thème. Attention, toutefois, cela ne supprimera pas seulement les mods que vous avez définis dans votre thème à l'aide de l'API de personnalisation . Il ciblera également d'autres mods, tels que les emplacements de menu. Les positions de widget sont actuellement définies comme des options, pas comme des mods, mais cela pourrait changer dans le futur. WordPress est susceptible de déplacer plus de choses d'options à mods, rendant remove_theme_mods
d'autant plus dangereux à utiliser.
La meilleure approche consiste à organiser tous les mods appartenant au thème proprement dit dans un tableau. Vous pouvez ensuite parcourir ce tableau et supprimer les mods individuels avec remove_theme_mod
.
Donc, dans votre page de réglage de thème, faites quelque chose comme ça:
if( isset( $_REQUEST['resetl_all'] ) ){
call_reset_function(); // or newtheme_get_theme_mods function (I guess)
}
cela supprimera tous les paramètres theme_mod
function reset_newtheme_options() {
remove_theme_mods();
}