Как сделать многопроверку для мета-поля поста/страницы


Пожалуйста, помогите мне понять, как сделать многопозиционный тип для метабокса. Ищите весь интернет и ничего. Спасибо.


ОБНОВЛЕНИЕ

@Ян У меня болит голова от этой функции. Я не знаю, что случилось.Я пробую ваш метод, но ничего, затем я пытаюсь 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 )

Я думаю, что это напечатаны мои query_posts, а не $catids. Это большая, большая проблема. Я чувствую себя ботаником. Пожалуйста, помогите мне.

 2
Author: Denis Belousov, 2010-11-30

1 answers

Метаданные post могут хранить несколько значений либо в виде отдельных записей в таблице postmeta, либо в виде одной записи со значением в виде сериализованного массива PHP. Для сериализации может потребоваться меньше кода, но отдельные записи позволяют быстрее запрашивать позже ("дайте мне все сообщения, в которых есть по крайней мере опция 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
}

Два дополнительных изменения для предотвращения PHP предупреждения, когда WP_DEBUG включен:

// 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
Author: Jan Fabry, 2010-12-07 15:44:05