¿Cómo puedo guardar campos repetibles con un valor dentro de una matriz?

3

Presentar Actualmente estoy trabajando en un complemento deslizante para aprender mucho de PHP y WordPress. He creado un campo repetible con javascript.

Algunos detalles funcionales:

  • Cuando el usuario hace clic en un botón, la última fila se clonará y todos los valores se restablecerán.
  • Agregue un aumento al código javascript para crear identificadores únicos para mis nombres de entrada e identificadores.
  • Agregar una ID única para mis filas clonadas.

El problema: Escribí este tema, porque tengo algunos problemas con guardar valores de una variable en una matriz.

Cuando guardo la publicación o la página, el primer campo se sobrescribirá. Esto se debe a que hago un bucle a través de una imagen y un título, no a través de la variable $_POST .

Pregunta: Mi pregunta ahora es ¿cómo puedo resolver este problema? También he consultado el código fuente que @brasofilo ha recomendado en Github - Gist . Brasofilo solo ha usado un meta, pero me gustaría usar una matriz multidimensional para crear mis campos. Y guarde los valores en una fila en la base de datos como una matriz.

Sé que puedo hacer uso de varios otros complementos, pero como dije antes, me gustaría aprender un montón de lenguaje de script de WordPress y PHP.

Script PHP:

  

Aquí puedes ver mi código usado por ahora, como dije antes, solo se guarda   una imagen y un título.

<?php

// Add meta box support
// This registers a function to be called when the WordPress admin interface is visited
add_action("admin_init", "dsslider_manager_add_meta");
function dsslider_manager_add_meta(){

    // Create this cool new meta box for Portfolio Options
    add_meta_box("dsslider-meta", "Brandbox Options", "dsslider_manager_meta_options", "brandbox-slider", "normal", "high");
}

// Create the fields array
$prefix = 'dsmeta_';
$custom_meta_fields = array(
    array(
        'label' => 'Image',
        'desc' => '',
        'id' => $prefix . 'image',
        'type' => 'image',
        'repeatable' => true,
    ),
    array(
        'label' => 'Image caption',
        'desc' => '',
        'id' => $prefix . 'image_caption',
        'type' => 'text',
        'repeatable' => true,
    )
);

// Callback unctions for setting up Brandbox Options
function dsslider_manager_meta_options(){

    global $custom_meta_fields, $post;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        // (integer) (optional) The post ID whose custom fields will be retrieved. 
        // Default: Current post
        return $post_id;

echo '<div class="dsslider_manager_extras">';

    // Markup for table head
    echo '<table class="meta ds-input-table">';
    echo '<tbody class="ui-sortable">';


    // Use nonce for verification
    echo '<input type="hidden" name="dsmeta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';

    // Begin a table row
    echo '<tr class="row" id="repeatable-[0]">';
    echo '<td class="order">1</td>';

    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);
        $type = $field['type'];

        // Each $meta in an table data
        echo '<td>';

        // Check if value repeatable is set
        if ($field['repeatable']) {

            switch ($type) {
                // Image case
                case 'image':

                    $image = get_template_directory_uri() . '/assets/images/default.jpg'; // Default image for the preview
                    echo '<span class="default_image" style="display:none">' . $image . '</span>';

                    // If $meta == (equal to) true
                    if ($meta) {
                        $image = wp_get_attachment_image_src($meta, 'thumbnail');
                        $image = $image[0]; // Get the first key of the array - url
                    } // End if

                    echo '<input type="hidden" name="' . $field['id'] . '" class="upload_image" value="' . $meta . '" />'; // Save the image ID
                    echo '<img src="' . esc_attr( $image ) . '" alt="" class="preview_image" />'; // Preview uploaded image
                    echo '<input type="button" class="button add-image" value="Add image" rel="' . get_the_ID() . '" />'; // Add image
                    echo '<small><a href="#" class="remove-image">Remove image</a></small>'; // Delete image

                break;

                // Text case
                case 'text':
                    echo '<input type="text" name="' . $field['id'] . '[]' . '" id="' . $field['id'] . '" value="' . $meta . '" size="30" /> ';
                break;

            } // End switch statement

        } // End if

        echo '</td>';

    } // End foreach loop

    echo '<td class="remove"><a class="repeatable-remove button" href="#">-</a></td>';
    echo '</tr>'; // End .row


    echo '</tbody>'; // End tbody
    echo '</table>'; // End tbody

    echo '<ul class="hl clearfix ds-repeater-footer"><li class="right">';
    echo '<a href="#" class="repeatable-add ds-button">Add New Slide</a>';
    echo '</li></ul>';

echo '</div>'; // End .dsslider_manager_extras
}

// Save the data
add_action('save_post', 'dsslider_manager_save_extras');
function dsslider_manager_save_extras($post_id) {

    global $custom_meta_fields;

    // Check autosave function
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    } // End if statement

    // Check permissions
    if ('page' == 'post_type') {
        if (!current_user_can('edit_page', $post_id)) {
            return $post_id;
        }
        elseif (!current_user_can('edit_post', $post_id)) {
            return $post_id;
        }
    } // End if statement

    // Loop through fields and save the data  
    foreach ($custom_meta_fields as $field) {
        if (isset($_POST[$field['id']])) {
            $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);
            }
        } // End if statement
    } // End foreach loop
}
    
pregunta Casper 02.02.2013 - 13:15

2 respuestas

1

Estás guardando solo una imagen y un título de imagen. Su bucle en la función dsslider_manager_save_extras recorre los $ custom_meta_fields globales definidos en el archivo php. No a través de la variable $ _POST. Tu bucle debería verse así:

foreach ( $_POST['fields'] as $field ) {
...
}

En HTML, el formulario debería tener este aspecto

<input type="hidden" name="fields[$field[ID]]" value=""/>

Puede leer más sobre este tema aquí: enlace

    
respondido por el david.binda 02.02.2013 - 14:03
1

Si su formulario se ve algo como esto:

<input type="text" name="fields[0]['image']" value="" />
<input type="text" name="fields[0]['caption']" value="" />

Y se repite incrementando el índice:

<input type="text" name="fields[1]['image']" value="" />
<input type="text" name="fields[1]['caption']" value="" />

Entonces, lo que obtendrás más tarde es algo como esto:

$_POST['fields'] = array(
  0 => array(
    'image' => (value here)
    'caption' => (value here)
  ),
  1 => array(
    'image' => (value here)
    'caption' => (value here)
  )
);

Luego, en save_post puede verificar si:

isset($_POST['fields']) && is_array($_POST['fields']) && !empty($_POST['fields'])

Luego puedes recorrer tu $custom_meta_fields en un bucle de tiempo:

$index = 0;
$slides = array();

while(isset($_POST['fields'][$index])) {
  foreach($custom_meta_fields as $custom_meta_field) {
    // check if isset($_POST['fields'][$index][$custom_meta_fields['id']])
    // and anything else you want to validate
    // and then save field in $slides[$index][$custom_meta_fields['id']]
  }
  $index++;
}

Una vez que haya validado todos los lados, puede almacenarlos en un campo de opción:

update_post_meta($post_id, $option_name, $slides);

Por cierto, en términos de $ _POST ['fields'], podría configurar su matriz de esta manera:

$custom_meta_fields = array(
    'slides' => array(
      array(
        'label' => 'Image',
        'desc' => '',
        'id' => $prefix . 'image',
        'type' => 'image',
        'repeatable' => true,
      ),
      array(
        'label' => 'Image caption',
        'desc' => '',
        'id' => $prefix . 'image_caption',
        'type' => 'text',
        'repeatable' => true,
      )
    )
);

Entonces todavía puedes hacer un bucle.

    
respondido por el NightHawk 11.02.2013 - 01:09

Lea otras preguntas en las etiquetas