web-dev-qa-db-fra.com

Problème de stockage des matrices avec update_user_meta

J'écris une fonction qui ajoute un numéro d'identification à un tableau et le met dans le répertoire usermeta . $_GET['auction'] est le post_id.

Ci-dessous la fonction:

$reminders = get_user_meta( $current_user->ID, "reminders" );
print_r( $reminders );
if( in_array( $_GET['auction'], $reminders ) ) {
    echo "Failed: Auction already in list";
} else {
    array_Push( $reminders, intval( $_GET['auction'] ) );
    if ( update_user_meta( $current_user->ID, "reminders", $reminders ) ) {
        echo "Success";
    } else {
        echo "Failed: Could not update user meta";
    }
}
print_r( $reminders );

Voici la sortie après avoir ajouté une enchère:

Array ( ) 
Success
Array ( [0] => 7 ) 

Voici la sortie après avoir ajouté deux enchères:

Array ( [0] => Array ( [0] => 7 ) ) 
Success
Array ( [0] => Array ( [0] => 7 ) [1] => 73 )

Et voici la sortie après avoir ajouté trois enchères:

Array ( [0] => Array ( [0] => Array ( [0] => 7 ) [1] => 73 ) ) 
Success
Array ( [0] => Array ( [0] => Array ( [0] => 7 ) [1] => 73 ) [1] => 0 )

Notez que l'ajout d'un nouvel élément au tableau à l'aide de array_Push fonctionne correctement. Mais lorsque le tableau est stocké dans le répertoire usermeta puis à nouveau récupéré, le dernier élément du tableau a été placé dans un tableau distinct, créant ainsi un tableau de dimensions infinies. Je préférerais garder ce tableau unidimensionnel.

Existe-t-il un moyen d'exécuter update_user_meta et get_user_meta sans modifier la structure de mon tableau?

5
Jarred

Je n'ai pas utilisé la fonction depuis assez longtemps, mais je suppose que votre problème est que vous poussez un tableau dans un tableau. Vérifiez donc si intval($_GET['auction']) est un tableau:

echo '<pre>';
print_r(intval($_GET['auction']));
echo '</pre>';

Edit # 1: Vous devrez peut-être obtenir la valeur de ce tableau, puis array_Push. Alors peut-être que quelque chose comme array_Push( $reminders, $_GET['auction'][0]) ); - si vous ajoutez seulement une valeur unique. Vous pouvez aussi faire quelque chose comme $reminders[] = $_GET['auction'][0]; pour l'ajouter à la fin de votre tableau.

Edit # 2: À partir d'un coup d'oeil au fichier core: oui. update_user_meta() est juste un alias de update_metadata() qui prend l'identifiant + la valeur et le met dans la base de données en tant que et tableau.

// From /wp-includes/meta.php ~ line 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;
}
1
kaiser

J'ai eu le même problème. Ajouter "true" à "get_user_meta" a fonctionné pour moi. Par exemple:

DE:

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

À:

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

Avait le même problème et résolu avec ce petit peu, qui met toutes les nouvelles valeurs dans un tableau unique enregistré en tant que métadonnées de l'utilisateur:

//Where $access_key is the next (added) value

$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');//Clear out the meta data...
update_user_meta( $user_id, 'wsm_capability', $new_access_keys);

Tableau avant sauvegarde/mise à jour pour la clé méta (à partir de get_user_meta):

Array
(
    [0] => access_9
)

Le tableau résultant (après la méta-mise à jour) ajoutant la valeur de 'access_5':

Array
(
    [0] => access_5
    [1] => access_9
)

Si vous souhaitez que la nouvelle valeur soit ajoutée à la fin du tableau, procédez comme suit:

//Where $access_key is the next (added) value    
$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;

Puis mettez à jour la méta ...

Bryan

3
FueledPublishing

Il semblait que le problème était lié à la sérialisation/désérialisation du tableau, alors je viens de réécrire la fonction pour qu'elle soit une chaîne sperée par des virgules:

        $reminders = get_user_meta($current_user->ID,"reminders",TRUE);
        if(is_int(strpos($reminders,$_GET['auction']))) {
            echo "Failed: Auction already in list";
        } else {
            $reminders .= ",".intval($_GET['auction']);
            if(substr($reminders,0,1) == ",") { //Remove leading comma if it exists
                $reminders = substr($reminders,1,strlen($reminders)-1);
            }
            if(update_user_meta($current_user->ID,"reminders",$reminders)) {
                echo "Success";
            } else {
                echo "Failed: Could not update user meta";
            }
        }
1
Jarred

La réponse de Shaun était correcte, mais j’ai besoin de plus de précisions. Vous pouvez insérer un tableau dans une méta-entrée d'utilisateur, mais lorsque vous le récupérez, vous devez le récupérer avec l'argument unique défini sur true, sinon vous obtenez un tableau d'un tableau. Voici mon code:

$past_orders = get_user_meta($order_userID, 'qr-replacement-orders',true);

//see if this new order has already been processed
if(in_array($_GET["oid"],$past_orders))
{
     echo '<p>This order has already been processed.</p>';
    //debug
    //var_dump($past_orders);   
}
else
{
      //add the order number to the array of past orders and store it
     //if list is empty, initialize it to empty array
     if($past_orders == '')
     {
        $past_orders = array();
     }
     //add the new order to the list
    array_Push($past_orders, $_GET["oid"]);

    //add the new list to the DB
    update_user_meta($order_userID, 'qr-replacement-orders',$past_orders);

    echo '<p>Your card has been purchased and will be sent to you in the mail.  Thanks!</p>';                       

    //debug: confirm it worked
    //$past_orders = get_user_meta($order_userID, 'qr-replacement-orders',true);
    //var_dump($past_orders);   
}
1
Yaron