Question

Je suis en train d'écrire une fonction qui ajoute un numéro d'identification à un tableau et met le tableau dans le usermeta . $_GET['auction'] est le post_id.

Voici 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 l'ajout d'une vente aux enchères:

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

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

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

Et voici la sortie après avoir ajouté trois ventes aux 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 array_push fonctionne très bien. Mais lorsque le tableau est stocké dans le usermeta puis récupéré à nouveau, le dernier élément du tableau a été mis dans un tableau propre, créant un tableau infiniment dimensions. Je préfère garder ce tableau à une dimension.

Est-il possible que je peux courir update_user_meta et get_user_meta sans elle changer la structure de mon tableau?

Était-ce utile?

La solution

n'ont pas utilisé la fonction pendant un certain temps, mais je suppose que votre problème est que vous poussiez un tableau dans un tableau. Alors vérifiez si intval($_GET['auction']) est un tableau:

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

Edit # 1: Vous avez besoin peut-être d'obtenir la valeur de ce tableau et array_push il. Alors peut-être quelque chose comme array_push( $reminders, $_GET['auction'][0]) ); - si vous ne l'ajout d'une valeur unique. Vous pouvez aussi faire quelque chose comme $reminders[] = $_GET['auction'][0]; pour l'ajouter à la fin de votre tableau.

Edit # 2: D'un coup d'oeil au fichier de base: oui. update_user_meta() est juste un alias de update_metadata() qui prend l'ID + la valeur et le met dans la base de données et le réseau.

// 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;
}

Autres conseils

J'ai eu le même problème. Ajout « true » à « get_user_meta » travaillé pour moi. Par exemple:

FROM:

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

À:

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

eu le même problème et résolu avec ce peu, ce qui met toutes les nouvelles valeurs dans un seul tableau enregistré en tant que méta-données 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 d'enregistrer / mise à jour pour la clé méta (de get_user_meta):

Array
(
    [0] => access_9
)

résultant Array (après mise à jour de méta) ajouter de la valeur de 'access_5':

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

Si vous avez besoin de la nouvelle valeur à ajouter à la fin du tableau, faites ceci:

//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;

Ensuite Mise à jour le méta ...

Bryan

Il semble que le problème était avec la sérialisation / désérialisation le tableau, donc je viens récrit la fonction d'être une chaîne sperated virgule:

        $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 correct, mais je me sens plus besoin de clarification. Vous pouvez mettre dans un tableau dans une entrée de méta utilisateur mais quand vous récupériez vous avez encore besoin de les récupérer avec l'ensemble unique argument true ou bien vous obtenir un tableau d'un retour de 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);   
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top