Pregunta

Estoy escribiendo una función que agrega un número de identificación a una matriz y coloca la matriz en el usermeta. $_GET['auction'] es el post_id.

A continuación se muestra la función:

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

Aquí está la salida después de agregar una subasta:

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

Aquí está la salida después de agregar dos subastas:

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

Y aquí está la salida después de agregar tres subastas:

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

Observe que agregar un nuevo elemento a la matriz usando array_push funciona bien. Pero cuando la matriz se almacena en el usermeta Luego recuperado nuevamente, el último elemento en la matriz se ha puesto en una matriz propia, creando una matriz infinitamente dimensional. Preferiría mantener esta matriz unidimensional.

¿Hay alguna forma de correr? update_user_meta y get_user_meta ¿Sin cambiar la estructura de mi matriz?

¿Fue útil?

Solución

No he usado la función durante bastante tiempo, pero supongo que tu problema es que estás empujando una matriz en una matriz. Así que verifique si intval($_GET['auction']) es una matriz:

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

Editar #1: Tal vez necesite obtener el valor de esa matriz y luego array_push. Entonces tal vez algo como array_push( $reminders, $_GET['auction'][0]) ); - Si solo está agregando un solo valor. También podrías hacer algo como $reminders[] = $_GET['auction'][0]; Para agregarlo al final de su matriz.

Editar #2: Desde un vistazo al archivo central: Sí. update_user_meta() es solo un alias de update_metadata() que toma el ID + el valor y lo coloca en la base de datos como y matriz.

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

Otros consejos

Yo tuve el mismo problema. Agregar "verdadero" a "get_user_meta" funcionó para mí. Por ejemplo:

DE:

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

A:

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

Tuve el mismo problema y lo resolvió con este pequeño bit, lo que coloca todos los valores nuevos en una sola matriz guardada como meta datos del usuario:

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

Matriz antes de guardar/actualizar para meta clave (de get_user_meta):

Array
(
    [0] => access_9
)

Matriz resultante (después de la meta actualización) Agregar valor de 'access_5':

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

Si necesita que se agregue el nuevo valor al final de la matriz, haga esto en su lugar:

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

Luego actualice el meta ...

Bryan

Parecía que el problema era serializar/no serializar la matriz, por lo que solo reescribo la función de ser una cadena esperada de coma:

        $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 respuesta de Shaun fue correcta, pero creo que necesita más aclaraciones. Puede poner una matriz en una entrada meta del usuario, pero cuando la recupere, aún necesita recuperarla con el argumento único establecido en True o de lo contrario obtiene una matriz de una matriz. Aquí está mi código:

$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);   
}
Licenciado bajo: CC-BY-SA con atribución
scroll top