web-dev-qa-db-ja.com

投稿/ページメタボックスのマルチチェックの作り方

メタボックスのマルチチェックタイプを作成する方法を理解してください。すべてのインターネットで何も検索しません。ありがとう。


更新

私はこの機能から頭痛がします。私はあなたの方法を試しているのですが何もしていませんが、私はget_postsを試していますが、この方法ではあまりにも多くの問題があります。あなたの方法で私は内容の前にこのエラーが出ます:

Warning: urldecode() expects parameter 1 to be string, array given in Z:\home\mysite.net\www\wp-includes\query.php on line 1878

これが私のコードです:

<?php
        $catids = get_post_meta($post->ID,'_mtb_multicheck',false);
        $limit = 10;
        query_posts( array('posts_per_page' => $limit, 'cat' => $catids, 'paged' => get_query_var('paged') ) );
    ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>

        <!-- Content-->

<?php endwhile; ?>  
            <?php pagination(); ?>
<?php else : ?>
            <!--Error message here-->

<?php endif; ?>

私の価値が何を返すのか知りたいのですが。これ作って:

query_posts( array('posts_per_page' => $limit, 'cat' => print_r($catids), 'paged' => get_query_var('paged') ) );

そして私のページでこれを入手してください:

Array ( [0] => 5 [1] => 5 [2] => 3 )

$ catidsではなく、私のquery_postが印刷されたと思います。それは大きな、大きな問題です。私は自分がオタクのように感じています。私を助けてください。

2
Denis Belousov

Postメタデータは、postmetaテーブルの個別のエントリとして、または値をシリアル化されたPHP配列として持つ1つのエントリとして、複数の値を格納できます。シリアライゼーションはより少ないコードを必要とするかもしれませんが、別々のエントリは後でより速い問い合わせを可能にします( "マルチチェックの少なくとも選択肢Aがチェックされている全ての投稿を私に与えてください").

私はあなたがリンクしたコード を取って 、 "マルチチェック"を可能にするために以下の変更を加えました:

// in show():
// Line 254: replace it by:
$meta = get_post_meta($post->ID, $field['id'], 'multicheck' != $field['type'] /* If multicheck this can be multiple values */);
// Add the following to the switch:
case 'multicheck':
    foreach ( $field['options'] as $value => $name ) {
        // Append `[]` to the name to get multiple values
        // Use in_array() to check whether the current option should be checked
        echo '<input type="checkbox" name="', $field['id'], '[]" id="', $field['id'], '" value="', $value, '"', in_array( $value, $meta ) ? ' checked="checked"' : '', ' /> ', $name, '<br/>';
    }
    break;

// In save():
// Line 358: replace it by:
$old = get_post_meta($post_id, $name, 'multicheck' != $field['type'] /* If multicheck this can be multiple values */);
// Lines 409-413: Wrap them in an else-clause, and prepend them by:
if ( 'multicheck' == $field['type'] ) {
    // Do the saving in two steps: first get everything we don't have yet
    // Then get everything we should not have anymore
    if ( empty( $new ) ) {
        $new = array();
    }
    $aNewToAdd = array_diff( $new, $old );
    $aOldToDelete = array_diff( $old, $new );
    foreach ( $aNewToAdd as $newToAdd ) {
        add_post_meta( $post_id, $name, $newToAdd, false );
    }
    foreach ( $aOldToDelete as $oldToDelete ) {
        delete_post_meta( $post_id, $name, $oldToDelete );
    }
} else {
    // The original lines 409-413
}

WP_DEBUGが有効になっているときにPHP警告を回避するための2つの追加変更

// Line 337:
if ( ! isset( $_POST['wp_meta_box_nonce'] ) || !wp_verify_nonce($_POST['wp_meta_box_nonce'], basename(__FILE__))) {
// Line 359:
$new = isset( $_POST[$field['id']] ) ? $_POST[$field['id']] : null;

これらの変更により、次のように定義して「マルチチェック」を使用できます。

array(
    'name' => 'Multicheck',
    'id' => $prefix . 'multicheck',
    'type' => 'multicheck',
    'options' => array(
        'a' => 'Apple',
        'b' => 'Banana',
        'c' => 'Cherry',
    ),
)
4
Jan Fabry