web-dev-qa-db-ja.com

メタチェックボックスがチェックされている場合、何かをしますか?

私がチェックするとき、私はそれがわずかに異なる内容を表示することを望むカスタムチェックボックスを作成しました(特に特別なcssスタイル)。何らかの理由で正常に機能していません。

私の機能では:

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 );
}
?>

私のループでは:

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

いくつかの投稿を保存すると、それらにチェックマークを付けなかったにもかかわらず、それらは特別なスタイルを持ちます。また、チェックボックスをオフにすると、特別なスタイルがなくなりますが、チェックボックスがオフになっているわけではありません。

私はここで何か悪いことをしていると確信しています。前もって感謝します。

1
Jacob

あなたはそれがこの行でチェックされるかどうかにかかわらず値を設定しています:

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

値はonまたはoffのいずれかになります。したがって、if条件は常に値を持つため、常にtrueになります。

チェックした場合にのみ保存するように変更し、チェックしない場合は削除するように変更できます。そうすればあなたの状態はうまくいくでしょう、そしてあなたは単にオフ状態を保存するために余分なメタエントリーを持つことはないでしょう。

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

コードは完全に大丈夫です削除するものは何もありません。

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

Divラッパーに$class変数を配置します。あなたのスタイルは次のようになります。

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