Использование метафункций публикации WordPress с переменными массива в заказах WooCommerce

Я вижу во многих местах, что WordPress автоматически сериализует массивы с помощью update_post_meta.

Но в их документах указано, что вам следует сериализовать его перед использованием update_post_meta. https://developer.wordpress.org/reference/functions/update_post_meta/

Я также получаю разные результаты при использовании get_post_meta, который использует сериализованное значение или массив.

    $val = array();
    $val['one'] = 1;
    $val['two'] = 2;
    $val['threed']['x'] = 'ex';
    $val['threed']['y'] = 'why';

    $ser = serialize($val);

    update_post_meta($order_id, 'testing arr', $val);
    update_post_meta($order_id, 'testing ser arr', $ser);

    // This was saved in the table as...
    // a:3:{s:3:"one";i:1;s:3:"two";i:2;s:6:"threed";a:2:{s:1:"x";s:2:"ex";s:1:"y";s:3:"why";}}
    // s:88:"a:3:{s:3:"one";i:1;s:3:"two";i:2;s:6:"threed";a:2:{s:1:"x";s:2:"ex";s:1:"y";s:3:"why";}}";

    $testarr = get_post_meta($order_id, 'testing arr');
    $testarrser = get_post_meta($order_id, 'testing ser arr');
Using get_post_meta for each of the above and printing the array gives the following: 
NOTE 1: get_post_meta($id, $field, true) and get_post_meta($id, $field, false) return the same data structure.
NOTE 2: These were not unserialized - just print_r() the returned values.

testarr: Array(
    [0] => Array (
            [one] => 1
            [two] => 2
            [threed] => Array (
                    [x] => ex
                    [y] => why
                )
        )
)

testarrser: Array(
    [0] => a:3:{s:3:"one";i:1;s:3:"two";i:2;s:6:"threed";a:2:{s:1:"x";s:2:"ex";s:1:"y";s:3:"why";}}
)

Please explain the correct way to update_post_meta to retrieve the expected array.
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, вам не нужно сериализовать массив перед использованием функций WordPress add_post_meta() или update_post_meta(), поскольку эти функции сделают это внутренне, используя включенную функцию maybe_serialize().

Теперь при использовании get_post_meta() установите для третьего параметра значение true, чтобы получить правильный исходный сохраненный массив, например

$testarr = get_post_meta($order_id, 'testing arr', true);

Внимание, для заказов WooCommerce (и совместимости с HPOS):

Вам больше не следует использовать метафункции сообщений WordPress, вместо этого вам следует использовать методы CRUD из объекта WC_Order, например:

$data = array();
$data['one'] = 1;
$data['two'] = 2;
$data['threed']['x'] = 'ex';
$data['threed']['y'] = 'why';

$order = wc_get_order( $order_id ); // Get the WC_Order Object (if needed)

$order->update_meta_data( 'testing_arr', $data ); // Add the metadata
$order->save(); // Save it to the database

Чтобы получить этот массив из объекта WC_Order, используйте:

$order = wc_get_order( $order_id ); // Get the WC_Order Object (if needed)

$data = $order->get_meta('testing_arr'); // Get the metadata

Этот способ совместим с высокопроизводительным хранилищем заказов (HPOS), поскольку WooCommerce теперь использует пользовательские таблицы в базе данных.

Связанный:

Спасибо LoicTheAztec! Обожаю откровенные ответы!! (Интересно, почему WP сказал сначала сериализовать его. Но я прислушаюсь к вашему совету :))

Catsy 04.07.2024 20:45

Кроме того, да, это для данных заказа, и мы объединяем несколько строк связанных данных в одну строку таблицы. Благодарим за расширение вашего объяснения HPOS.

Catsy 04.07.2024 22:50

Хорошо! Просто хотел отдать тебе должное! Упс! Возможно, мне не стоит отвечать даже на это. Черт! Вы заслуживаете :).

Catsy 06.07.2024 19:17

Другие вопросы по теме