jarred
  • 0
Новичок

Проблема хранения массивов с update_user_meta

  • 0

Я пишу функцию, которая добавляет идентификационный номер в массив и помещает массив в 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 работает нормально. Но когда массив сохраняется в пользовательских метаданных, а затем снова извлекается, последний элемент массива помещается в собственный массив, создавая бесконечно размерный массив. Я бы предпочел сохранить этот массив одномерным.

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

Share
  1. Не использовал эту функцию довольно долго, но я думаю, ваша проблема в том, что вы вставляете массив в массив. Итак, проверьте, 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;
    }
    
    • 0
    • var_dump($_GET[‘аукцион’]) отображает: string(1) «7». Кажется, что update_user_meta автоматически сериализует данные. Может ли это быть причиной проблемы?

      • 0
    • Привет, @Jarred, у тебя это в итоге получилось? У меня есть аналогичная потребность для моего сайта. У меня есть параметры пользовательского мета-флажка (массив), которые мне нужно обновить для каждого пользователя (более 1500 пользователей). И мне нужен способ обновить каждого пользователя, давая им разные варианты выбора, но в массовом масштабе. Кажется, что наше решение может работать, но я не уверен, как реализовать выбор различных параметров для каждого отдельного пользователя. Я хотел бы работать с вашим примером, но мне нужна помощь в его настройке для моих нужд, которая заключалась бы в том, чтобы сделать уникальный выбор для каждого пользователя и обновления.

      • 0
  2. У меня такая же проблема. Добавление «true» к «get_user_meta» сработало для меня. Например:

    ОТ:

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

    К:

    $reminders = get_user_meta($current_user->ID,"reminders",true);
    
    • 0
  3. Имел ту же проблему и решил ее с помощью этого небольшого бита, который помещает все новые значения в один массив, сохраняемый как пользовательские метаданные:

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

    Затем обновите мета…

    Брайан

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

            $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";
                }
            }
    
    • 0
  5. Ответ Шона был правильным, но я чувствую, что нужно больше пояснений. Вы можете поместить массив в мета-запись пользователя, но когда вы его извлекаете, вам все равно нужно получить его с единственным аргументом, установленным в 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);   
    }
    
    • 0

Оставить ответ

You must login to add an answer.