Cómo almacenar múltiples valores de entrada con el mismo meta_key

1 mar 2011, 16:34:13
Vistas: 13.5K
Votos: 2

¿Existe alguna forma de almacenar el valor de entrada de múltiples campos de metabox personalizados con el mismo meta_key? Utilizo el siguiente código para almacenar UN valor para el meta_key 'startdate':

function startdate() {
  global $post;
  $custom = get_post_custom($post->ID);
  $startdate = $custom["startdate"][0];
  ?>

<label>Fecha de inicio</label><br/>
<input type="text" name="startdate" value="<?php echo $startdate; ?>"/>

<?php }

add_action('save_post', 'save_details');
function save_details(){
  global $post;
  update_post_meta($post->ID, "startdate", $_POST["startdate"]);
}

Si tuviera un segundo campo de entrada, ¿cómo puedo almacenar su valor con un meta_id diferente pero el mismo meta_key (startdate)? ¡Muchas gracias!

(Si uso la funcionalidad incorporada de campos personalizados puedo guardar múltiples valores para la misma meta clave...)

7
Comentarios

Sí, solo crea un array con los datos, actualiza los nombres de los campos a name="startdate[]"

t31os t31os
1 mar 2011 16:43:12

Mi problema es que tengo una solución para una consulta personalizada que funciona sin arrays. http://wordpress.stackexchange.com/questions/10328/custom-post-type-event-chronological-list-of-recurring-events/10390#10390 No sé cómo hacer la consulta con un array.

Christoph Christoph
1 mar 2011 16:55:51

¿qué estás intentando obtener de la consulta?

Bainternet Bainternet
1 mar 2011 17:38:13

Estoy intentando obtener una lista cronológica de eventos. El problema es que cada evento (post personalizado) puede tener múltiples fechas, añadidas como metadatos. @Scribu señaló cómo hacer una consulta si los metadatos se almacenan como campos personalizados individuales con el mismo meta_key http://wordpress.stackexchange.com/questions/10328/custom-post-type-event-chronological-list-of-recurring-events

Christoph Christoph
1 mar 2011 17:59:15

¿Hay alguna razón por la que no puedas usar la funcionalidad nativa de campos personalizados para ingresar estas fechas? Ya que estás almacenándolo en metadatos de todos modos, ¿por qué no ingresar estas fechas en el metabox nativo?

t31os t31os
2 mar 2011 00:53:06

@t31os: Si me preguntas, la interfaz de usuario de campos personalizados es una de las partes más deficientes que quedan en WP. Es para desarrolladores, no para usuarios. Por lo tanto, no puedo culpar a nadie que quiera implementar un metabox en su lugar.

wyrfel wyrfel
2 mar 2011 02:16:41

Las fechas son solo una pequeña parte del tipo de entrada personalizada. El proyecto es el sitio web de un teatro. Este tipo de entrada personalizada es para las producciones. Una producción tiene imágenes, fechas, horarios, elenco, director, ubicación, descripción y más... Necesito que la interfaz sea muy limpia e intuitiva. En este momento me preocupa haberme estancado en esto de "valores múltiples / misma clave", y quizás sería mejor buscar una consulta que funcione con un arreglo... ¡Oh hombre!

Christoph Christoph
2 mar 2011 02:21:54
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 2
2

Cambia tu formulario como se sugiere:

function startdate() {
    global $post;
    $custom = get_post_custom($post->ID);
    echo "<label>Fechas de inicio</label><br/>";
    for ($i=0; $i<count($custom["startdate"]);$i++) {
        echo "<input type=\"text\" name=\"startdate[".$i."]\" value=\"".$custom["startdate"][$i]."\" />";
    }
}

Tendrás que eliminar y restablecer tus entradas individuales de postmeta:

add_action('save_post', 'save_details');

function save_details($post_id) {
    if ($parent_id = wp_is_post_revision($post_id)) $post_id = $parent_id;

    if (!empty($_POST['startdate']) && is_array($_POST['startdate'])) {
        delete_post_meta($post_id, 'startdate');
        foreach ($_POST['startdate'] as $startdate) {
            add_post_meta($post_id, 'startdate', $startdate);
        }
    }
}

Luego, por supuesto, necesitarás agregar algún mecanismo de agregar/eliminar a tu formulario de metabox, probablemente mediante JS.

1 mar 2011 21:29:02
Comentarios

¡Guau, casi llegamos! Tengo dos problemas: (1) Cuando creo una nueva publicación (evento), aparece una advertencia en el área de edición: "Warning: Invalid argument supplied for foreach()". Cuando ingreso fechas en el formulario y guardo la publicación, los valores se almacenan correctamente como entradas individuales de postmeta (los veo en la base de datos) y la advertencia desaparece. Pero (2) al recargar, los meta_values no se establecen como valores en los inputs del formulario, por lo que los campos aparecen vacíos. ¿Alguna idea de cómo resolver estos problemas? ¡Muchas gracias!

Christoph Christoph
2 mar 2011 00:37:50

@Christoph: Lo siento, fue un error tonto de mi parte. Primero, wp_is_post_revision() toma el ID de la publicación como parámetro. Luego, no ajusté correctamente el atributo value de los inputs en la parte del formulario. Finalmente, ahora agregué algunas comprobaciones básicas a la función de actualización. Mira los cambios.

wyrfel wyrfel
2 mar 2011 02:03:53
1

Como mencionó t31os, intenta cambiar los inputs de tu formulario para usar name="startdate[]" y luego recorre el array guardando cada valor:

foreach ($_POST["startdate"] as $datevalue) {
    update_post_meta($post->ID, "startdate", $datevalue);
}
1 mar 2011 19:33:48
Comentarios

Para cualquiera que aún esté leyendo esta página, esta respuesta es incorrecta. Cada iteración sobrescribirá el valor del post_meta en lugar de agregar post_meta adicionales con el mismo nombre.

brett brett
18 sept 2019 13:57:04