Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

grupos repetibles de opciones

Estas en el tema de grupos repetibles de opciones en el foro de WordPress en Foros del Web. Hola, estoy intentando crear unos campos personalizados, con grupos de opciones reptibles, utilizo este codigo Código PHP: <? // Add the Meta Box function  add_custom_meta_box () {      add_meta_box ( ...
  #1 (permalink)  
Antiguo 05/09/2012, 19:08
Avatar de raid_  
Fecha de Ingreso: diciembre-2010
Mensajes: 132
Antigüedad: 13 años, 4 meses
Puntos: 12
grupos repetibles de opciones

Hola, estoy intentando crear unos campos personalizados, con grupos de opciones reptibles, utilizo este codigo

Código PHP:
<?

// Add the Meta Box
function add_custom_meta_box() {
    
add_meta_box(
        
'custom_meta_box'// $id
        
'Custom Meta Box'// $title 
        
'show_custom_meta_box'// $callback
        
'post'// $page
        
'normal'// $context
        
'high'); // $priority
}
add_action('add_meta_boxes''add_custom_meta_box');

// Field Array
$prefix 'custom_';
$custom_meta_fields = array(

    array(
        
'label'    => 'Repeatable',
        
'desc'    => 'A description for the field.',
        
'id'    => $prefix.'repeatable',
        
'type'    => 'repeatable'
    
)
);

// enqueue scripts and styles, but only if is_admin
if(is_admin()) {
    
wp_enqueue_script('jquery-ui-datepicker');
    
wp_enqueue_script('jquery-ui-slider');
    
wp_enqueue_script('custom-js'get_template_directory_uri().'/js/custom-js.js');
    
wp_enqueue_style('jquery-ui-custom'get_template_directory_uri().'/css/jquery-ui-custom.css');
}

// add some custom js to the head of the page
add_action('admin_head','add_custom_scripts');
function 
add_custom_scripts() {
    global 
$custom_meta_fields$post;
    
    
$output '<script type="text/javascript">
                jQuery(function() {'
;
    
    foreach (
$custom_meta_fields as $field) { // loop through the fields looking for certain types
        // date
        
if($field['type'] == 'date')
            
$output .= 'jQuery(".datepicker").datepicker();';
        
// slider
        
if ($field['type'] == 'slider') {
            
$value get_post_meta($post->ID$field['id'], true);
            if (
$value == ''$value $field['min'];
            
$output .= '
                    jQuery( "#'
.$field['id'].'-slider" ).slider({
                        value: '
.$value.',
                        min: '
.$field['min'].',
                        max: '
.$field['max'].',
                        step: '
.$field['step'].',
                        slide: function( event, ui ) {
                            jQuery( "#'
.$field['id'].'" ).val( ui.value );
                        }
                    });'
;
        }
    }
    
    
$output .= '});
        </script>'
;
        
    echo 
$output;
}

// The Callback
function show_custom_meta_box() {
    global 
$custom_meta_fields$post;
    
// Use nonce for verification
    
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
    
    
// Begin the field table and loop
    
echo '<table class="form-table">';
    foreach (
$custom_meta_fields as $field) {
        
// get value of this field if it exists for this post
        
$meta get_post_meta($post->ID$field['id'], true);
        
// begin a table row with
        
echo '<tr>
                <th><label for="'
.$field['id'].'">'.$field['label'].'</label></th>
                <td>'
;
                switch(
$field['type']) {
                    
// text
                    // repeatable
                    
case 'repeatable':
                        echo 
'<a class="repeatable-add button" href="#">+</a>
                                <ul id="'
.$field['id'].'-repeatable" class="custom_repeatable">';
                        
$i 0;
                        if (
$meta) {
                            foreach(
$meta as $row) {
                                echo 
'<li><span class="sort hndle">|||</span>
                                            <input type="text" name="'
.$field['id'].'['.$i.']" id="'.$field['id'].'" value="'.$row.'" size="30" />
                                            <a class="repeatable-remove button" href="#">-</a></li>'
;
                                
$i++;
                            }
                        } else {
                            echo 
'<li><span class="sort hndle">|||</span>
                                        <input type="text" name="'
.$field['id'].'['.$i.']" id="'.$field['id'].'" value="" size="30" />
                                        <a class="repeatable-remove button" href="#">-</a></li>'
;
                        }
                        echo 
'</ul>
                            <span class="description">'
.$field['desc'].'</span>';
                    break;
                } 
//end switch
        
echo '</td></tr>';
    } 
// end foreach
    
echo '</table>'// end table
}

function 
remove_taxonomy_boxes() {
    
remove_meta_box('categorydiv''post''side');
}
add_action'admin_menu' 'remove_taxonomy_boxes' );

// Save the Data
function save_custom_meta($post_id) {
    global 
$custom_meta_fields;
    
    
// verify nonce
    
if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) 
        return 
$post_id;
    
// check autosave
    
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return 
$post_id;
    
// check permissions
    
if ('page' == $_POST['post_type']) {
        if (!
current_user_can('edit_page'$post_id))
            return 
$post_id;
        } elseif (!
current_user_can('edit_post'$post_id)) {
            return 
$post_id;
    }
    
    
// loop through fields and save the data
    
foreach ($custom_meta_fields as $field) {
        if(
$field['type'] == 'tax_select') continue;
        
$old get_post_meta($post_id$field['id'], true);
        
$new $_POST[$field['id']];
        if (
$new && $new != $old) {
            
update_post_meta($post_id$field['id'], $new);
        } elseif (
'' == $new && $old) {
            
delete_post_meta($post_id$field['id'], $old);
        }
    } 
// enf foreach
    
    // save taxonomies
    
$post get_post($post_id);
    
$category $_POST['category'];
    
wp_set_object_terms$post_id$category'category' );
}
add_action('save_post''save_custom_meta');

?>
He eliminado parte del codigo inecesarias,

El codigo funciona bien, pero solo para 1 campo, se repite todas las veces que sea necesario, sin problemas, pero como consigo meter varios campos en la parte que se repite?

Código PHP:
    // repeatable
                    
case 'repeatable':
                        echo 
'<a class="repeatable-add button" href="#">+</a>
                                <ul id="'
.$field['id'].'-repeatable" class="custom_repeatable">';
                        
$i 0;
                        if (
$meta) {
                            foreach(
$meta as $row) {
                                echo 
'<li><span class="sort hndle">|||</span>
                                            <input type="text" name="'
.$field['id'].'['.$i.']" id="'.$field['id'].'" value="'.$row.'" size="30" />
                                            <a class="repeatable-remove button" href="#">-</a></li>'
;
                                
$i++;
                            }
                        } else {
                            echo 
'<li><span class="sort hndle">|||</span>
                                        <input type="text" name="'
.$field['id'].'['.$i.']" id="'.$field['id'].'" value="" size="30" />
                                        <a class="repeatable-remove button" href="#">-</a></li>'
;
                        }
                        echo 
'</ul>
                            <span class="description">'
.$field['desc'].'</span>';
                    break; 
La idea que tengo es colocar un campo con un select para las categorias de un custom post type, y otro campo para elegir un color,

pero no consigo realizarlo, como añado al foreach otro campo mas y que me lo guarde correctamente?

este es el .js por si alguien se anima a probrar

Código Javascript:
Ver original
  1. jQuery(function(jQuery) {
  2.    
  3.     jQuery('.repeatable-add').click(function() {
  4.         field = jQuery(this).closest('td').find('.custom_repeatable li:last').clone(true);
  5.         fieldLocation = jQuery(this).closest('td').find('.custom_repeatable li:last');
  6.         jQuery('input', field).val('').attr('name', function(index, name) {
  7.             return name.replace(/(\d+)/, function(fullMatch, n) {
  8.                 return Number(n) + 1;
  9.             });
  10.         })
  11.         field.insertAfter(fieldLocation, jQuery(this).closest('td'))
  12.         return false;
  13.     });
  14.    
  15.     jQuery('.repeatable-remove').click(function(){
  16.         jQuery(this).parent().remove();
  17.         return false;
  18.     });
  19.        
  20.     jQuery('.custom_repeatable').sortable({
  21.         opacity: 0.6,
  22.         revert: true,
  23.         cursor: 'move',
  24.         handle: '.sort'
  25.     });
  26.  
  27. });

Etiquetas: grupos, opciones, post
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:27.