Вставить несколько статических значений для нескольких идентификаторов переменных

Некоторая предыстория (не имеет прямого отношения к моему вопросу, но, возможно, кто-то другой сможет использовать мой метод)

Я работаю в WordPress v3.9.1, используя плагин Advanced Custom Fields. Я импортировал CSV-файл с пользовательскими значениями (с помощью плагина WP Ultimate CSV Importer, бесплатная версия) из старой базы данных, отформатированной так, как мне нужно в WordPress, за одним исключением - ACF Repeater Fields. Плагин отличный, но пока нет хорошего метода импорта большого количества данных.

Поля репитера хранятся в базе данных следующим образом:

meta_id  post_id meta_key           meta_value
3894       4697    beds               2
3895       4697    _beds              field_53bcfe244a98d
4051       4697    _beds_0_other      field_53c2273053218
4050       4697    beds_0_other       1
4051       4697    _beds_1_other      field_53c2273053218
4050       4697    beds_1_other       3

5894       4698    beds               2
5895       4698    _beds              field_53bcfe244a98d
5051       4698    _beds_0_other      field_53c2273053218
5050       4698    beds_0_other       1
5051       4698    _beds_1_other      field_53c2273053218
5050       4698    beds_1_other       3

То есть; для каждого post_id есть одно поле Repeater, называемое "кровати". «В» поле ретранслятора - это 1 поле, повторяющееся дважды. Каждое поле имеет 2 записи в базе данных - ссылку на поле (используется для управления сохранением полей - всегда одно и то же для каждого поля) и значение. Не такая интуитивно понятная настройка, как могла бы быть, но она разработана на основе стандартной системы таблиц WordPress.

Актуальный вопрос

Прямо сейчас у меня есть поля, импортированные из моей старой базы данных, которые выглядят следующим образом:

meta_id  post_id meta_key           meta_value
####       4697    beds               2
####       4697    beds_0_other       1
####       4697    beds_1_other       3

####       4698    beds               2
####       4698    beds_0_other       1
####       4698    beds_1_other       3

Мне нужно добавить

meta_id  post_id meta_key           meta_value
####       4697    _beds              field_53bcfe244a98d
####       4697    _beds_1_other      field_53c2273053218
####       4697    _beds_0_other      field_53c2273053218

####       4698    _beds              field_53bcfe244a98d
####       4698    _beds_1_other      field_53c2273053218
####       4698    _beds_0_other      field_53c2273053218

meta_key и meta_value статичны - они никогда не меняются (после создания поля оно сохраняет то же поле _ ## до удаления). meta_id - это автоматическое приращение.

Проблема в том, что у меня 200+ значений post_id, каждое из которых требует 50 статических записей - я не хочу жестко кодировать это. Я могу выбрать требуемые идентификаторы, используя следующее:

SELECT DISTINCT ID
FROM  `wp_posts`
WHERE post_type =  "community"

// Returns:
post_id
4697
4698

Короче

Как я могу сделать следующее:

INSERT INTO `table` (`meta_id`, `post_id`, `meta_key`, `meta_value`)
VALUES
// foreach related distinct ID in wp_posts
 (NULL, 'ID', "_beds", "field_53bcfe244a98d"),
 (NULL, 'ID', "_beds_0_other", "field_53c2273053218"),
 (NULL, 'ID', "_beds_1_other", "field_53c2273053218")
// end foreach

** временное решение **

На данный момент я просто сбросил все данные с помощью PHP и загрузил их в PHPMyAdmin. Мог бы написать цикл PHP, который вставляет, но я ищу решение MySQL, которое я могу использовать без необходимости загружать новый файл php (или sql).

$ids = array("4697", "4698" );

echo '
INSERT INTO `table` (`meta_id`, `post_id`, `meta_value`, `meta_key`)
VALUES<br />';
foreach ($ids as $id){
    echo '
(NULL, "'. $id .'", "1", "beds"),
(NULL, "'. $id .'", "field_53bcfe244a98d", "_beds"),
(NULL, "'. $id .'", "field_53c2273053218", "_beds_0_other"),
<br />';

}

person DACrosby    schedule 14.07.2014    source источник


Ответы (1)


Самый простой способ сделать это - импортировать скрытые настраиваемые поля (ведущее подчеркивание) вместе с мета-значениями. Если вы хотите просто очистить данные, вы можете использовать UNION SELECT в качестве входных данных для вашего INSERT - вам не нужен meta_id, он будет назначен автоматически. Обратите внимание, что этот SQL не будет проверять, существуют ли уже данные, прежде чем выполнять вставку, поэтому убедитесь, что вы не закончили с дублированием.

Вы можете получить post_id, который вам нужен, запросив wp_postmeta для всех записей с meta_key "кроватей". Используя этот post_id, вы можете жестко закодировать другие значения и присвоить им псевдонимы как столбцы в операторе SELECT, который затем используется для значений INSERT.

-- modify the wp_ prefix as needed
INSERT INTO `wp_postmeta` (`post_id`, `meta_key`, `meta_value`)
-- get "_beds" key/value for all entries with meta key of "beds"
SELECT post_id, '_beds' AS meta_key, 'field_53bcfe244a98d' AS meta_value
FROM wp_postmeta WHERE meta_key = 'beds'
UNION 
-- get "_beds_0_other" key/value for all entries with meta key of "beds"
SELECT post_id, '_beds_0_other' AS meta_key, 'field_53c2273053218' AS meta_value
FROM wp_postmeta WHERE meta_key = 'beds'
UNION 
-- get "_beds_1_other" key/value for all entries with meta key of "beds"
SELECT post_id, '_beds_1_other' AS meta_key, 'field_53c2273053218' AS meta_value
FROM wp_postmeta WHERE meta_key = 'beds'
-- order results (you can view what will be inserted if you run the SELECT without the INSERT)
ORDER BY post_id

Вы также можете запустить это как три разных INSERT оператора без UNION.

person doublesharp    schedule 14.07.2014