Problemă la stocarea array-urilor cu update_user_meta
Scriu o funcție care adaugă un număr de ID într-un array și pune array-ul în usermeta. $_GET['auction']
reprezintă post_id
.
Mai jos este funcția:
$reminders = get_user_meta( $current_user->ID, "reminders" );
print_r( $reminders );
if( in_array( $_GET['auction'], $reminders ) ) {
echo "Eșuat: Licitația există deja în listă";
} else {
array_push( $reminders, intval( $_GET['auction'] ) );
if ( update_user_meta( $current_user->ID, "reminders", $reminders ) ) {
echo "Succes";
} else {
echo "Eșuat: Nu s-a putut actualiza usermeta";
}
}
print_r( $reminders );
Iată rezultatul după adăugarea unei licitații:
Array ( )
Succes
Array ( [0] => 7 )
Iată rezultatul după adăugarea a două licitații:
Array ( [0] => Array ( [0] => 7 ) )
Succes
Array ( [0] => Array ( [0] => 7 ) [1] => 73 )
Și iată rezultatul după adăugarea a trei licitații:
Array ( [0] => Array ( [0] => Array ( [0] => 7 ) [1] => 73 ) )
Succes
Array ( [0] => Array ( [0] => Array ( [0] => 7 ) [1] => 73 ) [1] => 0 )
Observați că adăugarea unui element nou în array folosind array_push
funcționează corect. Dar când array-ul este stocat în usermeta și apoi preluat din nou, ultimul element din array este plasat într-un array separat, creând un array cu dimensiuni infinite. Aș prefera să păstrez acest array unidimensional.
Există vreo modalitate de a folosi update_user_meta
și get_user_meta
fără ca acestea să modifice structura array-ului meu?

Am avut aceeași problemă și am rezolvat-o cu acest mic fragment de cod, care pune toate noile valori într-un singur array salvat ca meta date ale utilizatorului:
//Unde $access_key este următoarea valoare (adaugată)
$get_access_keys_from_wp = get_user_meta($user_id,'wsm_capability');
$current_access_keys = $get_access_keys_from_wp[0];
$new_access_keys = array();
$new_access_keys[]=$access_key;
foreach($current_access_keys as $key => $value){
$new_access_keys[]=$value;
}
delete_user_meta( $user_id, 'wsm_capability');//Ștergem meta datele vechi...
update_user_meta( $user_id, 'wsm_capability', $new_access_keys);
Array înainte de salvare/actualizare pentru cheia meta (din get_user_meta):
Array
(
[0] => access_9
)
Array rezultat (după actualizarea meta) adăugând valoarea 'access_5':
Array
(
[0] => access_5
[1] => access_9
)
Dacă aveți nevoie ca noua valoare să fie adăugată la sfârșitul array-ului, faceți asta în schimb:
//Unde $access_key este următoarea valoare (adaugată)
$get_access_keys_from_wp = get_user_meta($user_id,'wsm_capability');
$current_access_keys = $get_access_keys_from_wp[0];
$new_access_keys = array();
foreach($current_access_keys as $key => $value){
$new_access_keys[]=$value;
}
$new_access_keys[]=$access_key;
Apoi actualizați meta datele...
Bryan

Nu am folosit funcția de ceva timp, dar cred că problema ta este că încerci să adaugi un array într-un alt array. Așa că verifică dacă intval($_GET['auction'])
este un array:
echo '<pre>';
print_r(intval($_GET['auction']));
echo '</pre>';
Edit #1: Poate ai nevoie să obții valoarea din acel array și apoi să o adaugi cu array_push. Deci poate ceva de genul array_push( $reminders, $_GET['auction'][0]) );
- dacă adaugi doar o singură valoare. Ai putea face și ceva de genul $reminders[] = $_GET['auction'][0];
pentru a o adăuga la sfârșitul array-ului tău.
Edit #2: Privind în fișierul core: da. update_user_meta()
este doar un alias pentru update_metadata()
care ia ID-ul + valoarea și le pune în baza de date ca un array.
// Din /wp-includes/meta.php ~ linia 135
$where = array( $column => $object_id, 'meta_key' => $meta_key );
if ( !empty( $prev_value ) ) {
$prev_value = maybe_serialize($prev_value);
$where['meta_value'] = $prev_value;
}

S-a părut că problema era cu serializarea/deserializarea array-ului, așa că am rescris funcția să folosească un șir de caractere separat prin virgule:
$reminders = get_user_meta($current_user->ID,"reminders",TRUE);
if(is_int(strpos($reminders,$_GET['auction']))) {
echo "Eșuat: Licitația există deja în listă";
} else {
$reminders .= ",".intval($_GET['auction']);
if(substr($reminders,0,1) == ",") { //Elimină virgula de la început dacă există
$reminders = substr($reminders,1,strlen($reminders)-1);
}
if(update_user_meta($current_user->ID,"reminders",$reminders)) {
echo "Succes";
} else {
echo "Eșuat: Nu s-a putut actualiza metadatele utilizatorului";
}
}

Salut @Jarred, a funcționat până la urmă soluția pentru tine? Am o nevoie similară pentru site-ul meu. Am opțiuni de tip checkbox în meta-ul utilizatorilor (un array) pe care trebuie să le actualizez pentru fiecare utilizator (peste 1500 de utilizatori). Am nevoie de o metodă de a actualiza fiecare utilizator, acordându-le selecții diferite, dar la scară mare. Soluția noastră pare că ar putea funcționa, dar nu sunt sigur cum să implementez alegerea de opțiuni diferite pentru fiecare utilizator în parte. Aș dori să lucrez cu exemplul tău, dar am nevoie de ajutor pentru a-l personaliza în funcție de nevoile mele, care ar fi să fac selecții unice pentru fiecare utilizator și apoi să le actualizez.

Răspunsul lui Shaun a fost corect, dar cred că are nevoie de mai multe clarificări. Puteți introduce un array într-o intrare de meta utilizator, dar când îl preluați, trebuie să îl preluați cu argumentul single setat pe true, altfel veți primi un array de array. Iată codul meu:
$past_orders = get_user_meta($order_userID, 'qr-replacement-orders', true);
// verifică dacă această comandă nouă a fost deja procesată
if(in_array($_GET["oid"], $past_orders))
{
echo '<p>Această comandă a fost deja procesată.</p>';
// debug
// var_dump($past_orders);
}
else
{
// adaugă numărul comenzii în array-ul de comenzi anterioare și îl stochează
// dacă lista este goală, o inițializează ca array gol
if($past_orders == '')
{
$past_orders = array();
}
// adaugă noua comandă în listă
array_push($past_orders, $_GET["oid"]);
// adaugă noua listă în baza de date
update_user_meta($order_userID, 'qr-replacement-orders', $past_orders);
echo '<p>Cardul dvs. a fost achiziționat și vă va fi trimis prin poștă. Mulțumim!</p>';
// debug: confirmă că a funcționat
// $past_orders = get_user_meta($order_userID, 'qr-replacement-orders', true);
// var_dump($past_orders);
}
