Frage

Ich Schreibe eine Funktion, dass fügt eine ID-Nummer ein array und setzt die Reihe in der usermeta. $_GET['auction'] ist die post_id.

Unten ist die Funktion:

$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 );

Hier ist die Ausgabe nach dem hinzufügen einer Auktion:

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

Hier ist die Ausgabe nach dem hinzufügen von zwei Auktionen:

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

Und hier ist die Ausgabe nach dem hinzufügen von drei Auktionen:

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

Beachten Sie, dass das hinzufügen ein neues element in das array mit array_push funktioniert einwandfrei.Aber wenn das array gespeichert ist, in der usermeta dann wieder abgerufen, wird das Letzte element im array in ein array von seine eigenen, erstellen ein unendlich-dimensionales array.Ich würde lieber behalten Sie das array eindimensional.

Gibt es eine Möglichkeit, ich kann laufen update_user_meta und get_user_meta ohne es ändern die Struktur der array?

War es hilfreich?

Lösung

Nicht verwendet wird die Funktion für eine Weile, aber ich denke, Ihr problem ist, dass Sie schieben Sie ein array in ein array.So überprüfen Sie, ob intval($_GET['auction']) ein array ist:

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

Edit #1: Sie vielleicht brauchen, zu erhalten die Wert aus diesem array und dann array_push es.Also vielleicht so etwas wie array_push( $reminders, $_GET['auction'][0]) ); - wenn Sie nur mehr einen einzigen Wert.Sie könnten auch etwas tun wie $reminders[] = $_GET['auction'][0]; fügen Sie an das Ende von array.

Edit #2: Von einem Blick auf die core-Datei:ja. update_user_meta() ist nur ein alias von update_metadata() was bringt das ID + den Wert und legt Sie in die Datenbank-und array.

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

Andere Tipps

Ich hatte das gleiche Problem. Das Hinzufügen von "True" zu "get_user_meta" hat für mich funktioniert. Zum Beispiel:

AUS:

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

ZU:

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

Hatte das gleiche Problem und löste es mit diesem kleinen Bit, was alle neuen Werte in ein einzelnes Array einfügt, das als Benutzer -Meta -Daten gespeichert wurde:

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

Array vor dem Speichern/Update für Meta -Schlüssel (von get_user_meta):

Array
(
    [0] => access_9
)

Resultierende Array (nach Meta -Update) Hinzufügen von Wert von 'Access_5':

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

Wenn Sie den neuen Wert zum Ende des Arrays hinzufügen müssen, tun Sie dies stattdessen:

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

Dann aktualisieren Sie das Meta ...

Bryan

Es schien, dass das Problem bei der Serialisierung/Weiterlebnis des Arrays war. Daher habe ich die Funktion nur als Komma -Sperating -Zeichenfolge neu geschrieben:

        $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";
            }
        }

Shauns Antwort war korrekt, aber ich habe das Gefühl, dass mehr Klarstellung erforderlich ist. Sie können ein Array in einen Benutzer -Meta -Eintrag einfügen. Wenn Sie ihn jedoch abrufen, müssen Sie ihn immer noch mit dem einzelnen Argument auf True abrufen, oder Sie erhalten ein Array von einem Array zurück. Hier ist mein 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);   
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top