web-dev-qa-db-fra.com

Erreur de l'API de paramètres Wordpress

Bonjour, j'essaie de créer des options personnalisées pour un modèle que je développe mais il semble que je reçois une erreur:

Warning: Illegal string offset 'show_header' in C:\xampp\htdocs\wordpress\wp-content\themes\01MyWork\includes\theme-options.php on line 62

C'est la ligne qui semble jeter l'erreur:

 $html = '<input type="checkbox" id="show_header" name="thanathos_theme_display_options[show_header]" value="1" ' . checked(1, $options['show_header'], false) . '/>';  

Et voici le code complet:

    <?php 
    function thanatos_theme_menu(){
        add_theme_page(
                       "Thanathos Theme Options", 
                       "Thanathos Theme", 
                       "administrator", 
                       "thanathos_theme_options",
                       "thanathos_theme_display_callback"
                      );
    }
    add_action('admin_menu' , 'thanatos_theme_menu');
    function thanathos_theme_display_callback(){
?>
         <div class="wrap">  
                <div id="icon-themes" class="icon32"></div>  
                <h2>Sandbox Theme Options</h2>  

                <?php settings_errors(); ?>
                <!--Create the form that will be used to render our options-->
                <form method="post" action="options.php">
                    <?php settings_fields('thanathos_theme_display_options'); ?>
                    <?php do_settings_sections( 'thanathos_theme_display_options' ); ?>             
                    <?php submit_button(); ?>
                </form>
        </div>
<?php
    }

    add_action('admin_init' , 'thanatos_initializa_theme_options');
    function thanatos_initializa_theme_options(){
        if( false == get_option( 'thanathos_theme_display_options' ) ) {    
            add_option( 'thanathos_theme_display_options' );  
        } 
        add_settings_section(
                'general_settings_section', 
                'Thanatos Options', 
                'thanatos_general_options_callback', 
                'thanathos_theme_display_options'
        );
        add_settings_field(
                'show_header',
                'Header',
                'thanathos_field_header_callback',
                'thanathos_theme_display_options',
                'general_settings_section',
                 array(                              // The array of arguments to pass to the callback. In this case, just a description.  
                    'Activate this setting to display the header.'
                 ) 
        );
        register_setting('thanathos_theme_display_options', 'thanathos_theme_display_options');
    }

    function thanatos_general_options_callback(){
        echo 'mergem la mare';
    }
    function thanathos_field_header_callback($args){
         // First, we read the options collection  
        $options = get_option('thanathos_theme_display_options');
        // Next, we update the name attribute to access this element's ID in the context of the display options array  
        // We also access the show_header element of the options collection in the call to the checked() helper function 
        $html = '<input type="checkbox" id="show_header" name="thanathos_theme_display_options[show_header]" value="1" ' . checked(1, $options['show_header'], false) . '/>';  
         // Here, we'll take the first argument of the array and add it to a label next to the checkbox  
        $html .= '<label for="show_header"> '  . $args[0] . '</label>';   
        echo $html;
    }
?>
6
Nistor Alexandru

Je crois que le problème sous-jacent est que les clés du tableau d’options n’existent pas encore . Commençons ici, dans votre fonction d'initialisation:

if( false == get_option( 'thanathos_theme_display_options' ) ) {    
    add_option( 'thanathos_theme_display_options' );  
} 

D'abord, ceci:

false == get_option( 'thanathos_theme_display_options' )

... devrait être ceci:

false === get_option( 'thanathos_theme_display_options' )

... parce que vous attendez qu'un tableau soit retourné.

Deuxièmement, ceci:

add_option( 'thanathos_theme_display_options' );

... devrait être ceci:

add_option( 'thanathos_theme_display_options', $defaults );

... où $defaults est un tableau défini de valeurs par défaut. Dans l'état actuel des choses, vous ajoutez simplement une ligne vide à la table de base de données wp_options, car vous ne dites pas à add_action() quellesvaleurs ajouter à votre option.

Pendant que nous abordons le sujet, je mentionnerai qu’il existe une approche bien meilleure que l’ajout de valeurs par défaut à la base de données. Au lieu de faire cela, faites quelque chose comme ceci lorsque vous devez référencer les options de thème:

function thanathos_get_options() {
    $defaults = array(); // define this somewhere; reference it here
    return array_merge( $defaults, get_option( 'thanathos_theme_display_options', array() ) );
}

Cette fonction renvoie toutes les options définies par l'utilisateur , tout en revenant à la valeur par défaut Défini par le thème si l'utilisateur n'a défini aucune option.

Ainsi, par exemple, dans le champ de votre formulaire de page de paramètres:

// Get Theme Options
$options = thanathos_get_options();
// Define form-field markup
 $html = '<input type="checkbox" id="show_header" name="thanathos_theme_display_options[show_header]" value="1" ' . checked(1, $options['show_header'], false) . '/>';

Maintenant, même si l'utilisateur n'a pas défini de valeur pour 'show_header', $options['show_header'] renverra la valeur par défaut définie par le thème, plutôt que de générer une erreur pour la clé de tableau non définie.

6
Chip Bennett

Votre erreur n'est pas une erreur du tout

Warning : Décalage de chaîne illégal 'show_header' dans C:\xampp\htdocs\wordpress\wp-content\themes\01MyWork\includes\theme-options.php à la ligne 62

Un avertissement n'est pas une erreur, une erreur arrêterait l'exécution de PHP, pas un avertissement (bien que cela puisse parfois arriver s'il est affiché avant les en-têtes).

Cette erreur est due à l'accès à la clé show_header d'un tableau sans vérifier au préalable qu'il existe réellement.

par exemple.

$test = array();
$test['foo'] = 'bar';
echo $test['khjbefoc4gt8t']; // something I made up by smushing the keyboard

Ici, 'khjbefoc4gt8t' n'est pas défini, je ne lui ai jamais donné de valeur, et cela n'a jamais été rencontré auparavant, donc PHP ne sait pas ce qu'il faut imprimer, donc cela provient d'un avertissement.

Ce serait plus raisonnable:

if(isset($test['khjbefoc4gt8t']){
    echo $test'khjbefoc4gt8t'];
}

Vous pouvez également fournir des valeurs par défaut:

$test = array();

// setup defaults
$test = array_merge( array( 'khjbefoc4gt8t' => 'hello world'), $test );

// do some work
$test['foo'] = 'bar';
echo $test['khjbefoc4gt8t']; // something I made up by smushing the keyboard

Alors:

  • N'accédez pas à des variables qui pourraient ne pas exister sans les vérifier
  • N'imprimez pas le journal des erreurs à l'écran, c'est à cela que servent les journaux des erreurs et les éditeurs de texte.
  • Fournir des valeurs saines par défaut plutôt que aucune
4
Tom J Nowell