I am trying to create a custom post type with custom metabox array. How can I create this kind a automatic populating post type? I think I have to use two dimension array. But how can I automatically populate my data array? And how can I save this kind array.
Could some one point me to right direction?
Please take a look at the images.
Second img
My code so far :
<?php
//add custom field - price
add_action("admin_init", "price");
function object_init(){
add_meta_box("price_meta", "Price fields :", "object", "price_meta", "normal", "low");
}
function price_meta(){
global $post;
$custom = get_post_custom($post->ID);
$price = $custom["price"][0];
?>
<p style="float:left;"><label>Nr :</label><br />
<input type="text" name="priceNr" size="10" value="<?php echo $price; ?>"/>
</p>
<p style="float:left;"><label>Description :</label><br />
<input type="text" name="priceD" size="50" value="<?php echo $price; ?>"/>
</p>
<p style="float:left;"><label>Price :</label><br />
<input type="text" name="price" size="20" value="<?php echo $price; ?>"/>
</p>
<?php
}
//Save product price
add_action('save_post', 'save_detailss');
function save_detailss(){
global $post;
$post_id = $post->ID;
// to prevent metadata or custom fields from disappearing...
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
update_post_meta($post_id, "price", $_POST["price"]);
}
?>
1 Answer
Your code make no sense, anyway here is a nice way to do it and you get:
function Print_price_fileds($cnt, $p = null) {
if ($p === null){
$a = $b = $c="";
}else{
$a = $p['n'];
$b = $p['d'];
$c = $p['p'];
}
return <<<HTML
<li>
<label>Nr :</label>
<input type="text" name="price_data[$cnt][n]" size="10" value="$a"/>
<label>Description :</label>
<input type="text" name="price_data[$cnt][d]" size="50" value="$b"/>
<label>Price :</label>
<input type="text" name="price_data[$cnt][p]" size="20" value="$c"/>
<span class="remove">Remove</span>
</li>
HTML
;
}
//add custom field - price
add_action("add_meta_boxes", "object_init");
function object_init(){
add_meta_box("price_meta_id", "Price fields :","price_meta", "post", "normal", "low");
}
function price_meta(){
global $post;
$data = get_post_meta($post->ID,"price_data",true);
echo '<div>';
echo '<ul id="price_items">';
$c = 0;
if (count($data) > 0){
foreach((array)$data as $p ){
if (isset($p['p']) || isset($p['d'])|| isset($p['n'])){
echo Print_price_fileds($c,$p);
$c = $c +1;
}
}
}
echo '</ul>';
?>
<span id="here"></span>
<span class="add"><?php echo __('Add Price Data'); ?></span>
<script>
var $ =jQuery.noConflict();
$(document).ready(function() {
var count = <?php echo $c - 1; ?>; // substract 1 from $c
$(".add").click(function() {
count = count + 1;
//$('#price_items').append('<li><label>Nr :</label><input type="text" name="price_data[' + count + '][n]" size="10" value=""/><label>Description :</label><input type="text" name="price_data[' + count + '][d]" size="50" value=""/><label>Price :</label><input type="text" name="price_data[' + count + '][p]" size="20" value=""/><span class="remove">Remove</span></li>');
$('#price_items').append('<? echo implode('',explode("\n",Print_price_fileds('count'))); ?>'.replace(/count/g, count));
return false;
});
$(".remove").live('click', function() {
$(this).parent().remove();
});
});
</script>
<style>#price_items {list-style: none;}</style>
<?php
echo '</div>';
}
//Save product price
add_action('save_post', 'save_detailss');
function save_detailss($post_id){
global $post;
// to prevent metadata or custom fields from disappearing...
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// OK, we're authenticated: we need to find and save the data
if (isset($_POST['price_data'])){
$data = $_POST['price_data'];
update_post_meta($post_id,'price_data',$data);
}else{
delete_post_meta($post_id,'price_data');
}
}
I keep getting people asking me how to get the data to print in the fronend so:
$data = get_post_meta($post->ID,"price_data",true);
echo '<ul>';
if (count($data) > 0){
foreach((array)$data as $p ){
if (isset($p['p']) || isset($p['d'])|| isset($p['n'])){
echo '<li>Number: '.$p['n'].' Description: '.$p['d'].' Price: '.$p['p'].'</li>';
}
}
}
echo '</ul>';