Проблема с хранением массивов с обновленной метой пользователя


Я пишу функцию, которая добавляет идентификационный номер в массив и помещает массив в usermeta. $_GET['auction'] является post_id.

Ниже приведена функция:

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

Вот результат после добавления одного аукциона:

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

Вот результат после добавления двух аукционов:

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

И вот результат после добавления трех аукционов:

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

Обратите внимание, что добавление нового элемента в массив с помощью array_push отлично работает. Но когда массив хранится в usermeta, затем извлекается снова, последний элемент массива помещается в собственный массив, создавая бесконечномерный массив. Я бы предпочел сохранить этот массив одномерным.

Есть ли способ запустить update_user_meta и get_user_meta без изменения структуры моего массива?

 5
Author: nyedidikeke, 2011-03-29

5 answers

Довольно давно не использовал эту функцию, но я предполагаю, что ваша проблема в том, что вы помещаете массив в массив. Поэтому проверьте, является ли intval($_GET['auction']) массивом:

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

Редактировать #1: Возможно, вам нужно получить значение из этого массива, а затем array_push его. Так что, может быть, что-то вроде array_push( $reminders, $_GET['auction'][0]) ); - если вы добавляете только одно значение. Вы также можете сделать что-то вроде $reminders[] = $_GET['auction'][0];, чтобы добавить его в конец вашего массива.

Редактирование #2: При взгляде на основной файл: да. update_user_meta() это просто псевдоним update_metadata(), который принимает идентификатор + значение и помещает его в базу данных как и массив.

// 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
Author: kaiser, 2011-03-29 16:47:28

У меня была та же проблема. Добавление "true" в "get_user_meta" сработало для меня. Например:

ОТ:

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

ЧТОБЫ:

$reminders = get_user_meta($current_user->ID,"reminders",true);
 6
Author: Shaun, 2011-10-30 01:15:44

Имел ту же проблему и решил ее с помощью этого небольшого бита, который помещает все новые значения в один массив, сохраненный в качестве метаданных пользователя:

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

Массив перед сохранением/обновлением для мета-ключа (из get_user_meta):

Array
(
    [0] => access_9
)

Результирующий массив (после обновления метаданных), добавляющий значение 'access_5':

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

Если вам нужно добавить новое значение в конец массива, сделайте это вместо этого:

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

Затем обновите мету...

Брайан

 3
Author: FueledPublishing, 2012-02-25 00:38:03

Казалось, что проблема заключалась в сериализации/несериализации массива, поэтому я просто переписал функцию, чтобы она была строкой с запятой:

        $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
Author: Jarred, 2011-03-29 17:13:51

Ответ Шона был правильным, но я чувствую, что нуждается в большем разъяснении. Вы можете поместить массив в мета-запись пользователя, но когда вы его извлекаете, вам все равно нужно извлечь его с единственным аргументом, установленным в значение true, иначе вы получите массив массива обратно. Вот мой код:

$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
Author: Yaron, 2012-03-08 20:35:57