Cum să stochezi mai multe valori de intrare cu același meta_key

1 mar. 2011, 16:34:13
Vizualizări: 13.5K
Voturi: 2

Există vreo modalitate de a stoca valorile de intrare din mai multe câmpuri de meta box-uri personalizate cu același meta_key? Folosesc următorul cod pentru a stoca O singură valoare pentru meta_key 'startdate':

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

<label>Data de început</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"]);
}

Dacă aș avea un al doilea câmp de intrare, cum aș putea stoca valoarea lui cu un meta_id diferit dar același meta_key (startdate)? Mulțumesc mult!

(Dacă folosesc funcționalitatea built-in de câmpuri personalizate, pot salva mai multe valori pentru același meta key...)

7
Comentarii

Da, pur și simplu creează un array cu datele, actualizează numele câmpurilor la, name="startdate[]"

t31os t31os
1 mar. 2011 16:43:12

Problema mea este că am o soluție pentru o interogare personalizată care funcționează fără array-uri. http://wordpress.stackexchange.com/questions/10328/custom-post-type-event-chronological-list-of-recurring-events/10390#10390 Nu știu cum să fac interogarea cu un array.

Christoph Christoph
1 mar. 2011 16:55:51

ce încerci să obții din interogare?

Bainternet Bainternet
1 mar. 2011 17:38:13

Încerc să obțin o listă cronologică de evenimente. Problema principală este că fiecare eveniment (post personalizat) poate avea mai multe date, adăugate ca metadate. @Scribu a evidențiat cum se poate face o interogare dacă metadatele sunt stocate ca câmpuri personalizate individuale cu aceeași 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

Există vreun motiv pentru care nu poți folosi funcționalitatea nativă a câmpurilor personalizate pentru a introduce aceste date? Deoarece le stochezi deja în metadate, de ce nu introduci aceste date în caseta metabox nativă?

t31os t31os
2 mar. 2011 00:53:06

@t31os: Dacă mă întrebi pe mine, interfața câmpurilor personalizate este una dintre cele mai neplăcute părți ale interfeței rămase în WP. Este pentru dezvoltatori, nu pentru utilizatori. De aceea nu pot să condamn pe nimeni care dorește să implementeze un metabox în schimb.

wyrfel wyrfel
2 mar. 2011 02:16:41

Datele sunt doar o mică parte a tipului de post personalizat. Proiectul este un site web al unui teatru. Acest tip de post personalizat este pentru producții. O producție are imagini, date, ore, distribuție, regizor, locație, descriere și așa mai departe... Am nevoie ca interfața să fie foarte curată și intuitivă. Acum sunt îngrijorat că m-am blocat cu această problemă a "valorilor multiple / aceeași cheie", și probabil ar fi trebuit să caut o interogare care funcționează cu un array... Oh, Doamne!

Christoph Christoph
2 mar. 2011 02:21:54
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 2
2

Modificați formularul conform sugestiei:

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

Va trebui să eliminați și să reinstalați intrările individuale 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);
        }
    }
}

Apoi, desigur, va trebui să adăugați un mecanism de adăugare/ștergere în formularul metabox, probabil prin JS.

1 mar. 2011 21:29:02
Comentarii

Uau, aproape am ajuns! Am două probleme: (1) Când creez un articol nou (eveniment), primesc un avertisment în zona de editare: "Warning: Invalid argument supplied for foreach()". Când introduc date în formular și salvez articolul, valorile introduse sunt stocate corect ca intrări individuale de postmeta (le văd în baza de date) și avertismentul dispare. Dar (2) la reîncărcare, meta_valorile nu sunt setate ca valori în formular, așa că câmpurile de introducere par a fi goale. Ai vreo idee cum să rezolv aceste probleme? Mulțumesc mult!

Christoph Christoph
2 mar. 2011 00:37:50

@Christoph: Scuze, prostie de leneș din partea mea. În primul rând, wp_is_post_revision() ia id-ul postului ca parametru, apoi nu am ajustat corect atributul value al câmpurilor în partea de formular și, în final, am adăugat niște verificări de bază în funcția de actualizare. Vezi modificările.

wyrfel wyrfel
2 mar. 2011 02:03:53
1

După cum a menționat t31os, încercați să schimbați input-urile din formular pentru a folosi name="startdate[]", apoi parcurgeți array-ul salvând fiecare valoare:

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

Pentru cei care încă citesc această pagină, acest răspuns este greșit. Fiecare iterație va suprascrie valoarea post_meta în loc să adauge post_meta suplimentare cu același nume.

brett brett
18 sept. 2019 13:57:04