web-dev-qa-db-fra.com

Si la case à cocher Meta est cochée, faire quelque chose?

J'ai créé une case à cocher personnalisée qui, lorsque je coche, je souhaite qu'elle affiche un contenu légèrement différent (style CSS spécial). Pour une raison quelconque, il ne fonctionne pas correctement.

Dans mes fonctions:

add_action( 'add_meta_boxes', 'add_special_checkbox' );
function add_special_checkbox()
{
    add_meta_box( 'special-checkbox', 'Special Box', 'special_checkbox_func', 'post', 'side', 'high' );
}

function special_checkbox_func( $post )
{
    $values = get_post_custom( $post->ID );
    $check = isset( $values['special_box_check'] ) ? esc_attr( $values['special_box_check'][0] ) : '';
    wp_nonce_field( 'my_special_box_nonce', 'special_box_nonce' );
    ?>
    <p>
        <input type="checkbox" name="special_box_check" id="special_box_check" <?php checked( $check, 'on' ); ?> />
        <label for="special_box_check">Is this post 'special?'</label>
    </p>
    <?php   
}


add_action( 'save_post', 'special_checkbox_save' );
function special_checkbox_save( $post_id )
{
    // Bail if we're doing an auto save
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

    // if our nonce isn't there, or we can't verify it, bail
    if( !isset( $_POST['special_box_nonce'] ) || !wp_verify_nonce( $_POST['special_box_nonce'], 'my_special_box_nonce' ) ) return;

    // if our current user can't edit this post, bail
    if( !current_user_can( 'edit_post' ) ) return;

    // now we can actually save the data
    $allowed = array( 
        'a' => array( // on allow a tags
            'href' => array() // and those anchords can only have href attribute
        )
    );

    // This is purely my personal preference for saving checkboxes
    $chk = ( isset( $_POST['special_box_check'] ) && $_POST['special_box_check'] ) ? 'on' : 'off';
    update_post_meta( $post_id, 'special_box_check', $chk );
}
?>

Dans ma boucle:

<?php if (get_post_meta($post->ID, 'special_box_check', true)) { ?>
//add special styling
<? } else { ?>
//dont add special styling
<?php } ?>

Lorsque je sauvegarde des articles, ils ont le style spécial même si je ne les ai pas cochés. Et lorsque je décoche une case, j'aimerais que le style spécial disparaisse, mais ce n'est pas le cas lorsque la case n'est pas cochée.

Je suis sûr que je fais quelque chose de mal ici. Merci d'avance.

1
Jacob

Vous définissez une valeur, qu'elle soit cochée ou non avec cette ligne:

$chk = ( isset( $_POST['special_box_check'] ) && $_POST['special_box_check'] ) ? 'on' : 'off';

La valeur va être soit on ou off; votre condition if est donc toujours vraie, car elle a toujours une valeur.

Vous pouvez le changer pour enregistrer uniquement s'il est coché ou le supprimer si ce n'est pas le cas. Ainsi, votre condition fonctionnera et vous ne disposerez pas de méta-entrées supplémentaires uniquement pour enregistrer l'état désactivé.

if ( isset( $_POST['special_box_check'] ) && $_POST['special_box_check'] ) {
    add_post_meta( $post_id, 'special_box_check', 'on', true );
} else {
    delete_post_meta( $post_id, 'special_box_check' );
}
4
Milo

Le code est parfaitement correct rien à supprimer juste vous devez avoir un conditionnel en place

// check against the custom field has a value
if ( get_post_meta($post->ID, 'special_box_check', true) == 'on' ) ) {
   $class = 'highlight';
} else{
   $class = 'normal';
}

Placez la variable $class dans votre wrapper div. Votre style apparaîtra comme ceci:

.highlight{ color:#FF0000; }
.normal{ color:#000; }
0
S kumar