Проблема хранение массивов с помощью update_user_meta
-
16-10-2019 - |
Вопрос
Я пишу функцию, которая добавляет идентификационный номер в массив и помещает массив в 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
без изменения структуры моего массива?
Решение
Не использовал эту функцию в течение достаточно долгого времени, но я думаю, что ваша проблема в том, что вы подталкиваете массив в массив. Так что проверьте, если intval($_GET['auction'])
это массив:
echo '<pre>';
print_r(intval($_GET['auction']));
echo '</pre>';
Редактировать № 1: Возможно, вам нужно получить значение из этого массива, а затем Array_push It. Так может что -то вроде 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;
}
Другие советы
У меня такая же проблема. Добавление «true» к «get_user_meta» сработало для меня. Например:
ИЗ:
$reminders = get_user_meta($current_user->ID,"reminders");
К:
$reminders = get_user_meta($current_user->ID,"reminders",true);
Имел ту же проблему и решил это с помощью этого маленького бита, что ставит все новые значения в одном массиве, сохраняемых в качестве мета -данных пользователя:
//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;
Затем обновите мета ...
Брайан
Казалось, что проблема заключалась в том, чтобы сериализация/непрерывность массива, поэтому я просто переписал функцию как запятую строку:
$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";
}
}
Ответ Шона был правильным, но я чувствую, что нужно больше разъяснений. Вы можете поместить массив в пользовательскую метаритуру, но когда вы его получаете, вам все еще нужно получить его с помощью единого аргумента, установленного 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);
}