Come memorizzare più valori di input con lo stesso meta_key in WordPress

1 mar 2011, 16:34:13
Visualizzazioni: 13.5K
Voti: 2

Esiste un modo per memorizzare il valore di input da più campi di meta box personalizzati con lo stesso meta_key? Utilizzo il seguente codice per memorizzare UN valore per il meta_key 'startdate':

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

<label>Data di inizio</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"]);
}

Se avessi un secondo campo di input, come posso memorizzare il suo valore con un diverso meta_id ma lo stesso meta_key (startdate)? Grazie mille!

(Se uso la funzionalità incorporata dei campi personalizzati posso salvare più valori per la stessa meta key...)

7
Commenti

Sì, crea semplicemente un array dei dati, aggiorna i nomi dei campi a name="startdate[]"

t31os t31os
1 mar 2011 16:43:12

Il mio problema è che ho una soluzione per una query personalizzata che funziona senza array. http://wordpress.stackexchange.com/questions/10328/custom-post-type-event-chronological-list-of-recurring-events/10390#10390 Non so come fare la query con un array.

Christoph Christoph
1 mar 2011 16:55:51

cosa stai cercando di ottenere dalla query?

Bainternet Bainternet
1 mar 2011 17:38:13

Sto cercando di ottenere un elenco cronologico di eventi. Il punto cruciale è che ogni evento (custom post) può avere più date, aggiunte come metadati. @Scribu ha indicato come effettuare una query se i metadati sono archiviati come singoli campi personalizzati con lo stesso 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

C'è qualche motivo per cui non puoi utilizzare la funzionalità nativa dei campi personalizzati per inserire queste date? Dato che le stai comunque memorizzando nei metadati, perché non inserire queste date nel metabox nativo?

t31os t31os
2 mar 2011 00:53:06

@t31os: Se me lo chiedi, l'interfaccia utente dei campi personalizzati è uno degli aspetti più scadenti rimasti in WP. È pensata per gli sviluppatori, non per gli utenti. Quindi non posso biasimare nessuno che voglia implementare un metabox invece.

wyrfel wyrfel
2 mar 2011 02:16:41

Le date sono solo una piccola parte del tipo di post personalizzato. Il progetto è il sito web di un teatro. Questo tipo di post personalizzato è per le produzioni. Una produzione ha immagini, date, orari, cast, regista, location, descrizione e così via... Ho bisogno che l'interfaccia sia molto pulita e intuitiva. In questo momento sono preoccupato di essermi impantanato su questa questione dei "valori multipli / stessa chiave", e forse sarebbe stato meglio cercare una query che funzionasse con un array... Oh mamma!

Christoph Christoph
2 mar 2011 02:21:54
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 2
2

Modifica il tuo modulo come suggerito:

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

Dovrai rimuovere e reimpostare le tue singole voci di 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);
        }
    }
}

Poi, naturalmente, dovrai aggiungere qualche meccanismo di aggiunta/rimozione al tuo modulo metabox, probabilmente tramite JS.

1 mar 2011 21:29:02
Commenti

Wow, ci siamo quasi! Ho due problemi: (1) Quando creo un nuovo post (evento) ricevo un avviso nell'area di modifica: "Warning: Invalid argument supplied for foreach()". Quando inserisco le date nel form e salvo il post, i valori vengono memorizzati correttamente come singole entry postmeta (li vedo nel db) e l'avviso scompare. Ma (2) al ricaricamento i meta_values non vengono impostati come valori degli input, quindi i campi del form appaiono vuoti. Hai qualche idea per risolvere questi problemi? Grazie mille!

Christoph Christoph
2 mar 2011 00:37:50

@Christoph: Scusa, è stata una svista da parte mia. Primo, wp_is_post_revision() richiede l'id del post come parametro, poi non ho impostato correttamente l'attributo value degli input nella parte del form, e infine ho aggiunto alcuni controlli di base alla funzione di aggiornamento. Vedi le modifiche.

wyrfel wyrfel
2 mar 2011 02:03:53
1

Come menzionato da t31os prova a modificare gli input del tuo form per utilizzare name="startdate[]" poi scorri l'array salvando ogni valore:

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

Per chiunque stia ancora leggendo questa pagina, questa risposta è sbagliata. Ogni iterazione sovrascriverà il valore del post_meta invece di aggiungere ulteriori post_meta con lo stesso nome.

brett brett
18 set 2019 13:57:04