WordPress : Impossible d’enregistrer les options

Publié par Jean-Michel le

J’ai créé une page d’options de thème à l’aide de l’API Settings, tout fonctionne bien mais je ne peux pas enregistrer les options. J’ai essayé de comprendre où j’avais raté quelque chose mais j’ai échoué. Une idée de ce qui peut causer ce problème?

Voici le code de ma page d’options

<?php
/**
 * This functions registers default options values for Evolutionary theme
 * settings
 */
function ev_theme_settings_defaults() {
    $options = array(
        'color_scheme' => 'blue',
        'copyright' => '',
        'nav_hide_home' => false,
        'nav_hide_sec' => false,
        'nav_show_lvl' => false,
        'featured_show' => false,
        'featured_pause' => false,
        'featured_speed' => 5,
        'ad1_link' => '',
        'ad1_image' => '',
        'ad2_link' => '',
        'ad2_image' => '',
        'ad3_link' => '',
        'ad3_image' => '',
        'ad4_link' => '',
        'ad4_image' => ''
    );

    return $options;
    // Change to apply_filters( 'ev_theme_settings_defaults', $options );
}

/**
 * Create helper function for theme colors
 */
function ev_get_valid_color_schemes(){
    $color_schemes = array(
        'blue' => __( 'Blue', 'evolutionary' ),
        'green' => __( 'Green', 'evolutionary' ),
        'red' => __( 'Red', 'evolutionary' ),
        'black' => __( 'Black', 'evolutionary')
    );

    return $color_schemes;
}

/**
 * Setup initial theme options
 */
function ev_options_init() {
    // Set options equal to defaults
    global $ev_options;
    $ev_options = ev_theme_settings_defaults();
    if ( false === $ev_options ) {
        $ev_options = ev_theme_settings_defaults();
    }
    update_option( 'theme_evolutionary_options', $ev_options );
}

add_action( 'after_setup_theme', 'ev_options_init', 9 );

/**
 * Add theme options page to admin menu
 */
function ev_menu_options() {
    add_theme_page( __( 'Theme Options', 'evolutionary' ), __( 'Theme Options', 'evolutionary' ), 'edit_theme_options', 'evolutionary-settings', 'ev_admin_options_page' );
}

add_action( 'admin_menu', 'ev_menu_options' );

/**
 * Register theme options
 */
function ev_register_options() {
    register_setting( 'theme_evolutionary_options', 'theme_evolutionary_options', 'ev_options_validate' );

/**
 * Defining settings sections and fields
 * fist setting creates sections for general options
 */
add_settings_section( 'ev_settings_general_options', __( 'General Options', 'evolutionary' ), 'ev_settings_general_options', 'evolutionary' );

// Creates section for navigation options
add_settings_section( 'ev_settings_nav_options', __( 'Navigation', 'evolutionary' ), 'ev_settings_nav_options', 'evolutionary' );

// Section for featured post options
add_settings_section( 'ev_settings_featured_options', __( 'Featured Posts', 'evolutionary' ), 'ev_settings_featured_options', 'evolutionary' );

// Section for Advertising options
add_settings_section( 'ev_settings_ad_options', __( 'Advertising', 'evolutionary' ), 'ev_settings_ad_options', 'evolutionary' );

/**
 * Created empty callbacks for setions
 */
function ev_settings_general_options() {
    // Put callback code here
}
function ev_settings_nav_options() {
    // callback
}
function ev_settings_featured_options() {
    // callback
}
function ev_settings_ad_options() {
    // callback
}

/**
 * Registered fields
 */
add_settings_field( 'ev_settings_copyright_field', __( 'Copyright Name', 'evolutionary' ), 'ev_settings_copyright_field', 'evolutionary', 'ev_settings_general_options' );

add_settings_field( 'ev_settings_colors_field', __( 'Theme Color', 'evolutionary' ), 'ev_settings_colors_field', 'evolutionary', 'ev_settings_general_options' );

/**
 * Fields Callbacks
 */
function ev_settings_copyright_field() {
    $ev_options = get_option( 'theme_evolutionary_options' );
    //var_dump( $ev_options );
    ?>
    <input name="theme_evolutionary_options[copyright]" type="text" class="regular-text" value="<?php esc_attr_e( $ev_options['copyright'] ); ?>"  />
<?php }
// Callback for colorscheme
function ev_settings_colors_field() {
    $ev_options = get_option( 'theme_evolutionary_options' );
    $color_schemes = ev_get_valid_color_schemes();

    echo '<select name="theme_evolutionary_options[color_scheme]">';

    foreach( $color_schemes as $value => $caption ) :
?>
        <option value="<?php echo $value; ?>" <?php selected( $value, $ev_options['color_scheme'] ); ?>><?php echo $caption; ?></option>

<?php
    endforeach;

    echo '</select>';
}

} // ev_register_options
add_action( 'admin_init', 'ev_register_options' );

/**
 * Creating options page HTML output
 */
function ev_admin_options_page() { ?>

    <div class="wrap">
       <?php if ( isset( $_GET['settings-updated'] ) ) {
                echo "<div class='updated'><p>Theme settings updated successfully.</p></div>";
        } ?>
        <?php screen_icon(); ?>
        <h2><?php _e( 'Theme Options', 'evolutionary' ); ?></h2>
        <form action="options.php" method="post">
        <?php
        settings_fields( 'theme_evolutionary_options' );
        do_settings_sections( 'evolutionary' );
        ?>

            <input name="submit" type="submit" class="button-primary" value="<?php _e( 'Save Settings', 'evolutionary' ) ?>" />
            <input name="reset" type="submit" class="button-secondary" value="<?php _e( 'Reset Settings', 'evolutionary' ) ?>" />
        </form>
    </div>
<?php }

function ev_options_validate( $input ) {
    $ev_options = get_option( 'theme_evolutionary_options' );
    $valid_input = $ev_options;

    $ev_options['color_scheme'] = array_key_exists( $ev_options['color_scheme'], ev_get_valid_color_schemes() ) ? $ev_options['color_scheme'] : 'blue';
    $ev_options['copytright'] = wp_kses_data( $ev_options['copyright'] );

    return $valid_input;
}

Solution n°1 trouvée

@Mamaduka :

Voici pourquoi vos paramètres ne sont pas mis à jour. Votre fonction de validation est erronée. En être témoin:

function ev_options_validate( $input ) {
    $ev_options = get_option( 'theme_evolutionary_options' );
    $valid_input = $ev_options;

    $ev_options['color_scheme'] = array_key_exists( $ev_options['color_scheme'], ev_get_valid_color_schemes() ) ? $ev_options['color_scheme'] : 'blue';
    $ev_options['copytright'] = wp_kses_data( $ev_options['copyright'] );

    return $valid_input;
}

Vous mettez à jour $ev_options, mais retournez $valid_input. Vous devez mettre à jour $valid_input, pas $ev_options.

Essayez ceci à la place :

function ev_options_validate( $input ) {
    $ev_options = get_option( 'theme_evolutionary_options' );
    $valid_input = $ev_options;

    $valid_input['color_scheme'] = array_key_exists( $ev_options['color_scheme'], ev_get_valid_color_schemes() ) ? $ev_options['color_scheme'] : 'blue';
    $valid_input['copytright'] = wp_kses_data( $ev_options['copyright'] );

    return $valid_input;
}

Voir si cela résout votre problème?

ÉDITÉ POUR AJOUTER :

Votre problème suivant dans la fonction de validation est que vous comparez $ev_options à/contre lui-même, alors que vous devez évaluer $input par rapport à $valid_input.

Au lieu de cela:

function ev_options_validate( $input ) {
    $ev_options = get_option( 'theme_evolutionary_options' );
    $valid_input = $ev_options;

    $valid_input['color_scheme'] = array_key_exists( $ev_options['color_scheme'], ev_get_valid_color_schemes() ) ? $ev_options['color_scheme'] : 'blue';
    $valid_input['copytright'] = wp_kses_data( $ev_options['copyright'] );

    return $valid_input;
}

Essaye ça:

function ev_options_validate( $input ) {
    $ev_options = get_option( 'theme_evolutionary_options' );
    $valid_input = $ev_options;

    $valid_input['color_scheme'] = array_key_exists( $input['color_scheme'], ev_get_valid_color_schemes() ) ? $input['color_scheme'] : 'blue';
    $valid_input['copytright'] = wp_kses_data( $input['copyright'] );

    return $valid_input;
}

Plus précisément, changez ceci :

$valid_input['color_scheme'] = array_key_exists( $ev_options['color_scheme'], ev_get_valid_color_schemes() ) ? $ev_options['color_scheme'] : 'blue';
$valid_input['copytright'] = wp_kses_data( $ev_options['copyright'] );

Pour ça:

$valid_input['color_scheme'] = array_key_exists( $input['color_scheme'], ev_get_valid_color_schemes() ) ? $input['color_scheme'] : 'blue';
$valid_input['copytright'] = wp_kses_data( $input['copyright'] );

Et puis , je pense que vos options devraient fonctionner.

@TheDeadMedic :

L’API Settings gère la recherche de toutes les données $POST. Ce n’est pas le problème.

En ce qui concerne la mise à jour des paramètres par défaut sur init, voici mon exemple de code original :

function oenology_options_init() {
     // set options equal to defaults
     global $oenology_options;
     $oenology_options = get_option( 'theme_oenology_options' );
     if ( false === $oenology_options ) {
          $oenology_options = oenology_get_default_options();
     }
     update_option( 'theme_oenology_options', $oenology_options );
}
// Initialize Theme options
add_action('after_setup_theme','oenology_options_init', 9 );

Et voici le code de Mamaduka :

function ev_options_init() {
    // Set options equal to defaults
    global $ev_options;
    $ev_options = ev_theme_settings_defaults();
    if ( false === $ev_options ) {
        $ev_options = ev_theme_settings_defaults();
    }
    update_option( 'theme_evolutionary_options', $ev_options );
}

add_action( 'after_setup_theme', 'ev_options_init', 9 );

Voyez-vous la différence? Il y a un changement critique de oenology_options_init() à ev_options_init(), à savoir :

Cette:

global $oenology_options;
$oenology_options = get_option( 'theme_oenology_options' );

Contre ceci :

global $ev_options;
$ev_options = ev_theme_settings_defaults();

Ainsi, dans ev_options_init(), la fonction ne fait jamais rien, à cause du changement.

Solution n°2 trouvée

Le problème est qu’ils sont enregistrés… c’est juste que vous enregistrez toujours les valeurs par défaut !

$ev_options = ev_theme_settings_defaults();
if ( false === $ev_options ) {
    $ev_options = ev_theme_settings_defaults();
}
update_option( 'theme_evolutionary_options', $ev_options );

Et cela s’exécute à chaque chargement de page (il est lié à l’ action after_theme_setup).

Sans oublier que la ifdéclaration ne sert à rien ( $ev_optionsne le sera jamais false).

Il semble que vous n’ayez pas bien compris l’API Settings. Le tout est que vous n’ayez pas besoin de sauvegarder les options vous-même, WordPress le fait pour vous !

Je suis sûr que vous avez déjà vérifié l’API Settings, bien qu’elle manque un peu. Ce qui suit va un peu plus en détail et explique également comment utiliser l’API pour stocker les options sous forme de tableau.

  • Codeurs de presse : explication de l’API des paramètres
  • Otto : Tutoriel de l’API des paramètres

Solution n°3 trouvée

Je pense voir le problème, Mamakuka.

Vous devriez appeler get_option(), pas votre fonction par défaut, ici :

    /**
 * Setup initial theme options
 */
function ev_options_init() {
    // Set options equal to defaults
    global $ev_options;
    $ev_options = ev_theme_settings_defaults();
    if ( false === $ev_options ) {
        $ev_options = ev_theme_settings_defaults();
    }
    update_option( 'theme_evolutionary_options', $ev_options );
}

add_action( 'after_setup_theme', 'ev_options_init', 9 );

Cette:

global $ev_options;
$ev_options = ev_theme_settings_defaults();

Ça devrait plutôt être ça :

global $ev_options;
$ev_options = get_option( 'theme_evolutionary_options' );

Sinon, vous faites ce que TheDeadMedic a indiqué : sauvegardez les options par défaut à chaque init.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *