Как я могу показать/добавить/сохранить пользовательские метабоксы в виде массива значений?


Что я пытаюсь сделать, так это создать пользовательский тип записи, пользовательское мета-поле, которое вставляет его значения в массив "цветов" или "p_clrs".

У меня есть скрипт jQuery, который работает, позволяя вам щелкнуть ссылку "Добавить другой цвет", которая добавляет другое поле ввода ниже того, которое всегда отображается по умолчанию (должно отображаться не менее 1 метабокса цветов). Добавленные поля ввода jQuery должны хранить значения каждого добавляемого поля в виде другого "цвета" в массиве из "цветов", которые я пытаюсь создать.

Когда на странице "Новый пост" или странице редактирования существующих сообщений, метабокс "цвета" должен выполнить цикл "для каждого", чтобы создать метабокс "для каждого "цвета", который существует в переменной "p_clrs".

Я совсем не разбираюсь в массивах и мульти-массивах, и особенно в циклах foreach. Я ненавижу циклы foreach, лол.

Я так близко подошел к работе, что не хочу делать это снова и снова, используя таксономии, и как только я получу это для каждого цикла цвет массива, который я пытаюсь создать здесь, я смогу справиться с чем-либо еще, что мне нужно с этим материалом. Я просто не могу преодолеть горб массива/каждого, на котором я застрял здесь.

Это мой класс продукта для моего пользовательского типа публикации.

Вот что у меня есть все значения для информации о сообщениях (включая мои другие метабоксы, коды которых здесь не указаны).

class TypeProducts {

    public $prod_meta_fields = array( 
    'title', 'description', 'product_type', 'post_tag',
    'p_sku', 'p_price', 'p_discnt_price', 
    'p_weight', 'p_size_w', 'p_size_h', 
    'p_clrs'
);

Вот метод, который также имеет мои коды register_post_type() и register_taxonomy(), но это на самом деле не нужно для этого, поэтому я оставил это без внимания. После вызова функций register_ptype и _tax() я добавляю действия для вещей, которые необходимо добавить в инициализацию и материалы.

public function TypeProducts() {
    add_action( 'admin_init', array( &$this, 'product_meta_boxes' ));
    add_action( 'wp_insert_post', array( &$this, 'wp_insert_post' ), 10, 2 );
}

Этот метод выполняет всю вставку информации для каждого из полей формы post. Это работает и для всех моих пользовательских метабоксов, *За исключением дополнительных полей ввода, которые добавляет jQuery, когда вы нажимаете ссылку/кнопку "Добавить другой цвет".

public function wp_insert_post($post_id, $post = null) {
    if ($post->post_type == 'product') { // my custom post type is 'product'
        foreach ($this->prod_meta_fields as $key) { // loops over the $prod_meta_fields
            $value = @$_POST[$key];
            if (empty($value)) {
                delete_post_meta($post_id, $key);
                continue;
            }
            if (!is_array($value)) {
                if (!update_post_meta($post_id, $key, $value)) {
                    add_post_meta($post_id, $key, $value);
                }
            } else {
                delete_post_meta($post_id, $key);
                foreach ($value as $entry) add_post_meta($post_id, $key, $entry);
            }
        }
    }
}

Вот способ добавления моего метабокс(ы). Не уверен, могу ли я/должен ли я выполнить foreach в этом, зацикливаясь на массиве значений $p_clrs, чтобы добавить существующий цвет metabox foreach, если их несколько. В противном случае должен отображаться только один метабокс (всегда должно быть не менее 1).

    function product_meta_boxes() {
    add_meta_box( 'products-price', 'Product SKU# & Price', array( &$this, 'prod_price_box' ), 'product', 'side', 'high' );
    add_meta_box( 'products-colors', 'Product Colors', array( &$this, 'prod_colors_box' ), 'product', 'normal', 'high' );
    }

Вот мой метод вывода самого метабокса(ов), а также сценария jQuery, который добавляет и удаляет дополнительные поля ввода, которые "могут" потенциально стать метабоксами при сохранении сообщения, если добавленные поля не пусты.

Вот изображение того, что я имею в виду, чтобы дать вам представление о том, о чем я говорю. metabox

В настоящее время первый ввод отображается при загрузке страницы с любым сохраненным значением, если таковое имеется. При нажатии на ссылку Добавить еще одну ссылку добавляется другой ввод с тем же значением, но при сохранении другого значения в любом поле ввода сохраняется значение последнего ввода, имеющего значение. И показывает только один ввод при перезагрузке страницы, когда вы ее тоже сохраняете. Мне нужно показать входные данные для каждого добавленного значения, которое было там, которое также необходимо вставить в переменную/массив "p_clrs", чтобы сделать это для каждого существующего значения "p_clrs". Еще не потерялся?

    public function prod_colors_box() {
            global $post, $p_clr;
    $p_clr = array();
            $p_clrs = get_post_meta( $post->ID, 'p_clr', true );
    ?>

    <div id="p_colors">
        <p>
            <label for="p_clr_1">
            <strong>Color:</strong> <input id="p_clr_1" name="p_clr" value="<?php echo $p_clrs; ?>" />
            </label>
        </p>
    </div>
        <h4><a href="#" id="addClr">Add Another Color</a></h4>

    <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
    <script type="text/javascript">
    $(function() {

        var clrDiv = $('#p_colors');
        var j = $('#p_colors p').size() + 1;

        $('#addClr').live('click', function() {
            $('<p><label for="p_clr_' + j + '"><strong>Color:</strong> <input id="p_clr_' + j + '" name="p_clr" size="20" value="<?php echo $p_clrs; ?>" /></label> <a href="#" id="remClr">Remove</a></p>').appendTo(clrDiv);
            j++;
            return false;
        });
        $('#remClr').live('click', function() { 
            if( j > 2 ) {
                $(this).parents('p').remove(); 
                j--;
            } return false; 
        });
    });
    </script>

<?php
}

} // end of TypeProducts{} Class

Спасибо за любую помощь, которую кто-либо может мне оказать, и извините, если это немного безумный пост. Мне было трудно вырезать/вставить код в эту текстовую область. Для меня это было странно.

Дайте мне знать, если мое объяснение того, что я пытаюсь/что мне нужно сделать, тоже не совсем понятно. Это своего рода трудно легко описать без какого-либо визуального представления об этом в первую очередь.

Author: jaredwilli, 2010-10-30

1 answers

Вам просто нужно изменить атрибут name сгенерированных полей ввода с p_clr на p_clr[]. $_POST['p_clr'] затем будет массивом со значениями всех полей ввода.

public function prod_colors_box() {
        global $post, $p_clr;
$p_clr = array();
        $p_clrs = get_post_meta( $post->ID, 'p_clr' );
?>

<div id="p_colors">
    <?php foreach( $p_clrs as $key => $p_clr ) { ?>
    <p>
        <label for="p_clr_<?php echo $key; ?>">
        <strong>Color:</strong> <input id="p_clr_<?php echo $key; ?>" name="p_clr[]" value="<?php echo $p_clr; ?>" />
        </label>
    </p>
    <?php } ?>
</div>
    <h4><a href="#" id="addClr">Add Another Color</a></h4>

<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
<script type="text/javascript">
$(function() {

    var clrDiv = $('#p_colors');
    var j = $('#p_colors p').size() + 1;

    $('#addClr').live('click', function() {
        $('<p><label for="p_clr_' + j + '"><strong>Color:</strong> <input id="p_clr_' + j + '" name="p_clr[]" size="20" value="<?php echo $p_clrs; ?>" /></label> <a href="#" id="remClr">Remove</a></p>').appendTo(clrDiv);
        j++;
        return false;
    });
    $('#remClr').live('click', function() { 
        if( j > 2 ) {
            $(this).parents('p').remove(); 
            j--;
        } return false; 
    });
});
</script>

 3
Author: sorich87, 2010-10-30 19:00:23