Intereting Posts
Как открыть комментарии всем посетителям Как рассчитать общее количество комментариев, сделанных определенным пользователем Папка «Шаблоны страниц» с сайта совместного доступа к файлам Получить URL-адрес изображения с полным размером изображения, используя идентификатор сообщения? get_total () возвращает 0 – woocommerce Контактная форма 7 Многоязычная подача с использованием полиланга Почему мой текстовый виджет не показывает заголовок, который я ему даю? Добавить пользовательские результаты поиска в основной поиск WP Правильный способ подключения wp_get_attachment_url или любого другого способа изменить этот URL-адрес в медиа-библиотеке Контроль версий как для конфигурации Vagrant, так и для разрабатываемых тем 404 Страница не отображается Изменение стартового номера идентификатора пользователя случайные категории отображения – изменить URL-адрес Принять или запретить куки – как? Случайные домашние фоновые изображения с заголовком

При использовании add_post_meta и update_post_meta существует ли способ предоставить отдельные ключи массивов?

При добавлении массивов для публикации мета, используя add_post_meta, добавляются новые подмассивы. Мне было интересно, можно ли назвать эти подмассивы.

поэтому вместо того, чтобы

array([0](2,3), [1](4,5)) 

я бы получил

 array ([meaningful_name](2,3),[meaningful_name2](4,5)) 

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

Исходные данные

Предположим, у вас есть такой массив:

 $family = [ 'father' => [ 'John', 'Doe', 40 ], 'mother' => [ 'Jane', 'White', 39 ], 'child_1' => [ 'Luke', 'Doe', 5 ] ]; 

Если вы сохраняете каждый вспомогательный массив как другую мета-строку, единственным идентификатором для этой строки является meta_id но это не имеет особого смысла и трудно использовать функции WordPress.

Подход «карта»

Обходным решением может быть сохранение карты значений / мета-идентификаторов в другой метатете сообщений.

Это можно сделать благодаря тому, что как update_post_meta() и add_post_meta() возвращают только что добавленный add_post_meta() .

Хранить данные

Таким образом, вы можете сделать что-то вроде этого:

 $map = []; foreach( $family as $who => $person ) { // update_post_meta returns the meta ID $map[ $who ] = update_post_meta( $postId, 'family_member', $person ); } // we store the map of family "role" to meta IDs in a separate meta update_post_meta( $postId, 'family_members_map', $map ); 

Получение данных

Когда вы извлекаете значения, например

 $family = get_post_meta( $postId, 'family_member' ); 

вы получаете 2-мерный неблокированный массив следующим образом:

 [ [ 'John', 'Doe', 40 ], [ 'Jane', 'White', 39 ], [ 'Luke', 'Doe', 5 ], ] 

Короче говоря, вы теряете ключи вспомогательного массива.

Но вы можете использовать сохраненную карту и функцию get_post_meta_by_id для воссоздания исходных данных:

 $map = get_post_meta( $postId, 'family_members_map', true ); $family = array_combine( array_keys( $map ), array_map( 'get_post_meta_by_id', $map ) ); 

И семья будет равна исходным данным:

 [ 'father' => [ 'John Doe', 40 ], 'mother' => [ 'Jane White', 39 ], 'child_1' => [ 'Luke Doe', 5 ] ] 

Обновить данные

Обновление данных, это не очень сложно:

 $justBorn = [ 'Anna', 'Doe', 0 ]; // current map $map = get_post_meta( $postId, 'family_members_map', true); // add both new sub array and new meta ID to map $map['child_2'] = update_post_meta( $postId, 'family_member', $justBorn ); // update the map update_post_meta( $postId, 'family_members_map', $map ); 

Альтернатива: подход «все в одном месте»

Подход выше работает, но это не самый простой способ.

Фактически, было бы легче хранить весь начальный ассоциативный массив (массив $family ) – это единая мета, а не в разных подмассивах.

 // store data update_post_meta( $postId, 'family_members', $family ); // retrieve data (please note the `true` as 3rd argument) $family = get_post_meta( $postId, 'family_members', true ); // update data $family = get_post_meta( $postId, 'family_members', true ); $family['child_2'] = [ 'Anna', 'Doe', 0 ]; update_post_meta( $postId, 'family_members', $family ); 

Сохранять, извлекать и обновлять данные довольно просто, и никаких дополнительных накладных расходов нет.

Преимущества подхода «карта»

В большинстве случаев подход «все в одном месте» является наиболее удобным.

Но если есть сотни или даже тысячи вспомогательных массивов, использование уникального мета-значения для их хранения приведет к очень большому объему памяти, используемой для извлечения и анализа данных. Используя разные строки и современную PHP-функцию, такую ​​как генераторы , этот объем памяти может быть резко сокращен.

Более того, при работе с существующими данными (возможно, унаследованными от старой версии веб-сайта) этот подход может быть полезен для получения значимой информации без преобразования старых данных.

Наконец, имея меньшие и более характерные вспомогательные массивы, хранящиеся в разных строках БД, запрос для сообщений, использующих мета-запрос и LIKE для сериализованного массива в метазначении, может быть проще и надежнее, даже если фактическая надежность сильно зависит от структуры данных.

Некоторые возможные способы использования add_post_meta:

Для получения дополнительной информации перейдите по ссылке

 add_post_meta($post_id, $meta_key, $meta_value, $unique); update_post_meta($post_id, $meta_key, $meta_value, $prev_value); $meta_values = get_post_meta( $post_id, $key, $single ); update_post_meta($post_ID, {key}, {array of vals}) $data = Array( 'url' => $url, 'name' => $name, 'description' => $desc, ); //Update inserts a new entry if it doesn't exist, updates otherwise update_post_meta($post_ID, 'yourkey', $data); //To Fetch $yourdata = get_post_meta($post_ID, 'yourkey'); 

Ссылка на Codex для получения более подробной информации

Благодаря!