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?
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;
}
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);
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
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";
}
}
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);
}