2014-07-14 15 views
5

Niektóre z powrotem historia (nie bezpośrednio odnoszące się do mojego pytania, ale może ktoś inny może korzystać z metody)wstawić wiele wartości statyczne dla wielu identyfikatorów zmiennych

pracuję w WordPress v3.9.1 za pomocą wtyczki Zaawansowane Pola niestandardowe. Zaimportowałem plik CSV o niestandardowych wartościach (za pomocą wtyczki WP Ultimate CSV Importer, wersja darmowa) ze starej bazy danych sformatowanej tak, jak potrzebuję w WordPress z jednym wyjątkiem - ACF Repeater Fields. Wtyczka jest świetna, ale nie ma jeszcze dobrej metody importowania mnóstwa danych.

Repeater pola są przechowywane w bazie danych, co następuje:

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 

To; dla każdego post_id jest jedno pole Repeatera o nazwie "łóżka". "W" pole wzmacniacza to 1 pole, powtórzone dwukrotnie. Każde pole ma 2 wpisy do bazy danych - odniesienie do pola (używane do zarządzania polami zapisu - zawsze takie same dla każdego pola) i wartości. Nie tak intuicyjny w konfiguracji, jak to tylko możliwe, ale został zaprojektowany w oparciu o domyślny system tabel WordPress.

Rzeczywiste pytanie

Teraz mam pola importowane z mojej starej bazy danych, która wygląda tak:

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 

muszę dodać

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 i meta_value są statyczne - nigdy się nie zmieniają (po utworzeniu pola zachowuje ono to samo pole _ ## do momentu usunięcia). meta_id to auto increment.

Problem polega na tym, że mam ponad 200 wartości post_id, z których każda potrzebuje 50 statycznych wpisów - nie chcąc tego napisać. Mogę wybrać wymagane identyfikatory przy użyciu następujących:

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

// Returns: 
post_id 
4697 
4698 

W skrócie

Jak można wykonać następujące czynności:

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 

** rozwiązaniem temp **

Dla w tym momencie po prostu wyrzuciłem wszystkie dane używając PHP & przesłałem je w PHPMyAdmin. Mógłbym napisać pętlę PHP, która wstawi, ale szukam rozwiązania MySQL, którego mogę użyć bez potrzeby przesyłania nowego pliku php (lub 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 />'; 

} 

Odpowiedz

1

Najprostszym sposobem na zrobienie tego byłoby zaimportowanie ukrytych pól niestandardowych (wiodących podkreślników) wraz z wartościami meta. Jeśli chcesz tylko wyczyścić dane, możesz użyć UNION SELECT jako wejścia do twojego INSERT - nie potrzebujesz meta_id, zostanie ono przypisane automatycznie. Zauważ, że ten SQL nie sprawdzi, czy dane już istnieją przed wstawieniem rzeczy, więc upewnij się, że nie skończysz z duplikatami.

Możesz uzyskać post_id, którego potrzebujesz, wyszukując wp_postmeta dla wszystkich wpisów z meta_key "łóżek".Używając tego post_id możesz zakodować inne wartości i aliasować je jako kolumny w instrukcji SELECT, która jest następnie używana dla wartości 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 

Można również uruchomić to jako trzy różne INSERT sprawozdania bez UNION.