Problemă la stocarea array-urilor cu update_user_meta

29 mar. 2011, 07:50:39
Vizualizări: 15K
Voturi: 5

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?

0
Toate răspunsurile la întrebare 5
0

Am avut aceeași problemă. Adăugarea valorii "true" la "get_user_meta" a funcționat pentru mine. De exemplu:

DE LA:

$reminders = get_user_meta($current_user->ID,"reminders");

CĂTRE:

$reminders = get_user_meta($current_user->ID,"reminders",true);
30 oct. 2011 03:15:44
0

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

25 feb. 2012 02:38:03
2

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;
}
29 mar. 2011 16:13:30
Comentarii

var_dump($_GET['auction']) afișează: string(1) "7". Se pare că update_user_meta serializează datele automat. Ar putea acesta fi cauza unei probleme?

Jarred Jarred
29 mar. 2011 19:40:46

Vezi Edit #2 ... :)

kaiser kaiser
29 mar. 2011 19:46:08
1

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";
            }
        }
29 mar. 2011 20:13:51
Comentarii

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.

user1893 user1893
21 oct. 2011 19:17:34
0

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);   
}
8 mar. 2012 22:35:57