2016-02-15 1 views
0

У меня есть плагин, который является расширением для woocommerce. Этот плагин хранит информацию в таблице MySQL «wp_woocommerce_order_itemmeta». Под столбцом «meta_key» есть «_wc_deposit_meta». Рядом со столбцом «meta_key» у меня есть «meta_value». В разделе «meta_value» вы найдете a:5:{s:6:"enable";s:3:"yes";s:7:"deposit";d:197.67000000000001591615728102624416351318359375;s:9:"remaining";d:401.32999999999998408384271897375583648681640625;s:5:"total";d:599;s:5:"ratio";d:1;}. Изучая PHP, я никогда не сталкивался с такой ценностью. Может ли кто-нибудь объяснить, что это за значение, и как мне получить доступ к значению «депозит». Это еще один пример многомерного массива?Как получить доступ к плагинам WordPress Variable/MySQL Data?

Я пытаюсь получить доступ к этому значению $my_order = $order->get_items(); в my functions.php, который возвращает массив. Я вижу правильный массив под названием «_wc_deposit_meta» с этим странным значением, которое я не знаю, как получить доступ из-за запятых и двоеточий.

Извините за вопрос о нобе, но я пытался исследовать эту покупку, не смог найти простой черно-белый ответ. Если бы кто-то мог указать мне в правильном направлении, я был бы очень благодарен.

ответ

1

Когда WordPress нужно хранить многомерные данные в поле он применяет serialize() функцию РНР для преобразования данных в сохраняемую строку, затем unserialize() при чтении значения, чтобы вернуть его в правильную структуру данных.

Анатомия сериализованными определений данных описаны в первом комментарии по РНР serialize() документации:

  • Строка: s:[size]:[value];
  • Integer: i:[value];
  • Double: d:[value];
  • булевой: b:[value]; (не сохраняет «true» или «false», сохраняет «1» или «0»)
  • Null: N;
  • Массив: a:[size]:{[key definition];[value definition];(repeated per element)}
  • Объект: O:[strlen(object name)]:[object name]:[object size]:{s:[strlen(property name)]:[property name]:[property definition];(repeated per property)}

Более конкретно, WordPress использует это собственные maybe_serialize() и maybe_unserialize() оберток для снижения вероятности (ООН) сериализацию, когда нет необходимости.

В конкретных сериализованных данных, с которыми вы работаете, ваш депозит представлен определениями ключа/значения s:7:"deposit";d:197.67000000000001591615728102624416351318359375;. Чтобы изменить стоимость депозита вручную, вы должны изменить двойное значение после d:. Чтобы программно изменить значение в WordPress, используйте Metadata API для запроса поля с помощью функции «get» (которая будет неявно ее неэтериализовать), измените значение поля 'deposit' в возвращаемом ассоциативном массиве, а затем сохраните новое значение, обновить "из API метаданных.

1

Значение, которое вы ищете, было serialized() и хранилось в базе данных. Просто возьмите эту переменную и использовать unserialize() на нем, например, так:

$myVal = unserialize($databaseColumn); 
  1. serialize
  2. unserialize
Смежные вопросы