web-dev-qa-db-fra.com

Ajouter une nouvelle case à cocher dans les options de thème

J'essaie d'ajouter une nouvelle option à un panneau d'options de thème pour masquer/afficher les liens de commentaires dans les fichiers de modèle de thème.

J'ai la possibilité d'apparaître dans le panneau, mais il y a un problème en ce que cela ne fonctionne pas et qu'il n'y a pas d'erreurs php. J'ai noté ci-dessous dans Code des options principales où j'ai ajouté l'option en tant que tableau et où elle a été filtrée et validée.

Et en bas est le php qui affiche/masque les liens de commentaires en fonction du paramétrage des options.

Est-ce un problème de logique php? Et des idées?

Code des options principales:

/**
* Describe the available options
**/
$vertigo_options_template = array(
array(
    'name' => __( 'Accent Color', 'vertigo' ),
    'desc' => __( 'Change the accent color by entering a HEX color number. (ie: <code>EE3322</code>)', 'vertigo' ),
    'id' => 'accent_color',
    'std' => 'ee3322',
    'type' => 'colorpicker'
),

array(
    'name' => __( 'Font', 'vertigo' ),
    'desc' => __( 'Enable Hitchcock custom font (Note: this font only supports basic Latin uppercase letters, numerals, and some punctuation.)', 'vertigo' ),
    'id' => 'vertigo_font',
    'std' => ( '1' == get_option( 'lang_id' ) ) ? 'true' : 'false',
    'type' => 'checkbox'
),  


/** My new Option  **/

array(
    'name' => __( 'Comments', 'vertigo' ),
    'desc' => __( 'Disable comment links)', 'vertigo' ),
    'id' => 'disable_comments_link',
    'std' => ( '1' == get_option( 'lang_id' ) ) ? 'true' : 'false',
    'type' => 'checkbox'
),  
);


/**
* Calculate default option values
*
* @return array
**/
function vertigo_get_default_options() {
global $vertigo_options_template;
$default_options = array();

foreach ( $vertigo_options_template as $option )
    $default_options[$option['id']] = $option['std'];

return $default_options;
}

/**
* Create the options form
**/
function vertigo_theme_options_do_page() {
global $vertigo_options_template;

if ( ! isset( $_REQUEST['settings-updated'] ) )
    $_REQUEST['settings-updated'] = false;
?>

<div class="wrap">

    <?php screen_icon(); echo "<h2>" . get_current_theme() . ' ' . __( 'Theme Options', 'vertigo' ) . "</h2>"; ?>

    <?php if ( false !== $_REQUEST['settings-updated'] ) : ?>
    <div class="updated fade"><p><strong><?php _e( 'Options saved.', 'vertigo' ); ?></strong></p></div>
    <?php endif; ?>

    <form method="post" action="options.php">
        <?php settings_fields( 'vertigo_options' ); ?>
        <?php $vertigo_options = vertigo_get_theme_options(); ?>

        <table class="form-table">

        <?php foreach ( $vertigo_options_template as $option ) {
            // Use default value if no option exists
            $value = ( isset ( $vertigo_options[$option['id']] ) && !empty( $vertigo_options[$option['id']] ) ? $vertigo_options[$option['id']] : $option['std'] );
        ?>
            <tr valign="top">
                <th scope="row">
                    <?php echo $option['name']; ?>
                </th>
                <td>
                <?php switch ( $option['type'] ) {
                    case 'colorpicker':
                ?>
                    <input type="text" name="vertigo_theme_options[<?php echo esc_attr( $option['id'] ); ?>]" id="<?php echo esc_attr( $option['id'] ); ?>" value="<?php echo esc_attr( $value ); ?>" class="color { pickerPosition:'right' }" />
                <?php break;

                case 'checkbox':
                ?>
                    <input type="checkbox" name="vertigo_theme_options[<?php echo esc_attr( $option['id'] ); ?>]" id="<?php echo esc_attr( $option['id'] ); ?>" value="true" <?php echo ( 'true' == $value ) ? 'checked="checked"' : ''; ?> />
                <?php break;

                    default:
                        break;
                } // END switch ?>

                    <label class="description" for="<?php echo esc_attr( $option['id'] ); ?>">
                        <?php echo $option['desc']; ?>
                        <?php if ( 'vertigo_font' == $option['id'] ) { ?>
                            <img src="<?php echo get_template_directory_uri(); ?>/inc/images/hitchcock.gif" alt="Hitchcock" id="hitchcock-sample"/>
                        <?php } ?>
                    </label> 

                </td>
            </tr>

        <?php } // END foreach ?>
        </table>

        <p class="submit">
            <?php submit_button( __( 'Save Options', 'vertigo' ), 'primary', 'submit', false ); ?>
            <?php submit_button( __( 'Reset Options', 'vertigo' ), 'secondary', 'vertigo_theme_options[reset]', false, array( 'id' => 'reset' ) ); ?>
        </p>

    </form>

</div><!-- .form-wrap -->

<?php
}

/**
* Sanitize and validate form input
*
* @param array options
* @return array sanitized options
**/
function vertigo_theme_options_validate( $input ) {
global $vertigo_options_template;
$defaults = vertigo_get_default_options();

// Check accent color input format
// Valid = hexadecimal 3 or 6 digits
$accent_color = preg_replace( '/[^0-9a-fA-F]/', '', $input['accent_color'] );
if ( 6 == strlen( $accent_color ) || 3 == strlen( $accent_color ) )
    $input['accent_color'] = $accent_color;
else
    $input['accent_color'] = $defaults['accent_color'];

// Check that Vertigo font checkbox value is either true or false
if ( ! isset( $input['vertigo_font'] ) )
$input['vertigo_font'] = ( $input['vertigo_font'] == 'true' ? 'true' : 'false' );

// My New Option: Check that Disable Comment Links checkbox value is either true or false
if ( ! isset( $input['disable_comments_link'] ) )
$input['disable_comments_link'] = ( $input['disable_comments_link'] == 'true' ? 'true' : 'false' );

// Reset to default options
if ( ! empty( $input['reset'] ) ) {
    $defaults = vertigo_get_default_options();
    foreach ( $input as $field => $value ) {
        if ( isset( $defaults[$field] ) )
            $input[$field] = $defaults[$field];
        else
            unset( $input[$field] );
    }
}

return $input;
}

Et j'utilise ceci dans mes fichiers modèles pour afficher/masquer le modèle de commentaires:

<?php if ( 'true' == $vertigo_theme_options['disable_comments_link'] ) { ?> 
<?php comments_template( '', true ); ?>
<?php } ?>

Voici à quoi ressemblent les options dans la base de données appelée vertigo_theme_options:

a:3:{s:12:"accent_color";s:6:"EE3322";s:12:"vertigo_font";s:4:"true";s:21:"disable_comments_link";s:5:"true";}

Edit 25/07/11: Cela fonctionne dans un fichier de modèle; besoin d'appeler d'abord les options:

<?php $vertigo_theme_options = get_option( 'vertigo_theme_options' ); ?>

<?php if ( 'false' == $vertigo_theme_options['disable_comments_link'] ) { ?> 
<?php comments_template( '', true ); ?>
<?php } ?>
6
markratledge

Pour répondre à la première partie de votre question: votre formulaire de configuration contient déjà le cas checkbox; donc, si vous ajoutez une nouvelle entrée de case à cocher, vous n'avez rien besoin d'ajouter au commutateur . Ce code s'appliquera aux entrées {toutes) à cocher que vous ajoutez:

case 'checkbox':
?>
    <input type="checkbox" name="vertigo_theme_options[<?php echo esc_attr( $option['id'] ); ?>]" id="<?php echo esc_attr( $option['id'] ); ?>" value="true" <?php echo ( 'true' == $value ) ? 'checked="checked"' : ''; ?> />
<?php break;

Plus d'informations sur switch dans le manuel PHP.net et depuis w3schools .

Je suis un peu confus par le libellé de votre question:

J'ai la possibilité d'apparaître dans le panneau via le tableau

vs.

J'ai noté ci-dessous ... où il semble que j'ai besoin de l'ajouter dans la section "Créer un formulaire" du php qui construit le formulaire.

Donc: la nouvelle case à cocher apparaît-elle actuellement dans le formulaire de la page Paramètres ou n'apparaît-elle pas ?

EDIT

Étant donné que le champ des paramètres apparaît correctement dans le formulaire des paramètres, je vais essayer de traiter les deux problèmes suivants: l'option ne pas enregistrer correctement et l'option ne pas générer correctement.

Tout d’abord: l’option enregistre-t-elle correctement sa valeur dans la base de données, en fonction de la sélection du champ de formulaire de paramètres?

Si c'est ne pas enregistrer correctement , alors le problème peut être que vous ne le vérifiez pas correctement. Si cette case n'est pas cochée, le paramètre entier est omis des données POST. Dans ce cas, pour enregistrer sa valeur dans la base de données, vous devez vérifier que la valeur de l’option est définie, par exemple:

<?php
$vertigo_options['disable_comments_link'] = ( isset( $_POST['disable_comments_link'] ) ? true : false );
?>

Remarque: vous souhaiterez effectuer des ajustements en fonction de la désinfection des données de formulaire. Si vous utilisiez l'API Settings, cela ressemblerait plus à ceci:

<?php
$output['disable_comments_link'] = ( isset( $input['disable_comments_link'] ) ? true : false );
?>

Est-ce que cela nous rapproche?

EDIT 2

Nous savons donc que l’option permet d’enregistrer correctement dans la base de données. Il ne reste plus qu’à l’afficher correctement dans le modèle.

Question suivante: les options sont-elles stockées dans la base de données de manière discrète ou sous forme de tableau?

Dans le balisage du formulaire de paramètres, il apparaît que les options sont stockées sous la forme d'un tableau , nous devons donc appeler get_option() sur le tableau, puis utiliser les valeurs de ce tableau:

<?php
$vertigo_theme_options = get_option( 'vertigo_options' );
?>

Remarque: pour trouver le nom actuel de l'entrée de base de données, reportez-vous à la fonction vertigo_get_theme_options(). Vous pouvez aussi appeler cette fonction:

<?php
$vertigo_theme_options = vertigo_get_theme_options();
?>

Dans les deux cas, vous devriez maintenant pouvoir référencer votre option dans $vertigo_theme_options; par exemple.:

<?php if ( 'true' == $vertigo_theme_options['disable_comments_link'] ) { ?> 
<?php comments_template( '', true ); ?>
<?php } ?>

Est-ce que cela nous amène là?

EDIT 3

option_name sous wp_options est vertigo_theme_options

Alors essayez ceci:

<?php
$vertigo_theme_options = get_option( 'vertigo_theme_options' );
?>

<?php if ( 'true' == $vertigo_theme_options['disable_comments_link'] ) { ?> 
<?php comments_template( '', true ); ?>
<?php } ?>

Je suis à peu près sûr à 100% que cela devrait le faire.

3
Chip Bennett

ne répond pas vraiment à votre question, mais en guise de tête, il y a plusieurs très bons plugins pour construire des options de thème. pour moi, cela ne vaut presque plus l'effort de le faire moi-même.

http://wordpress.org/extend/plugins/options-framework/

1
helgatheviking