問題描述
我有一個我要插入的 csv 檔案,包含〜 1,500 行和 97 列。做完全進口需要 2-3 個小時,如果有辦法,我想改進一下。目前,對於每一行,我正在做一個 $ post_id = wp_insert_post,然後為每一行的 97 個關聯列建立一個 add_post_meta 。這是非常低效的…
有沒有更好的方式來解決這個問題,可以得到一個 post_id 保持帖子和它的 post_meta 值之間的關係?
現在我正在我的本地機器上嘗試這個,但是會在 VPS 上執行
最佳解決方案
之前我有類似的問題,使用自定義 CSV 匯入,但我最終使用一些自定義 SQL 進行批次插入。但是我當時沒有看到這個答案:
Optimize post insert and delete for bulk operations?
使用 wp_defer_term_counting()啟用或停用術語計數。
此外,如果您檢視了 WordPress 匯入器外掛的 source,您將在批次匯入之前看到這些功能:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
然後批次插入:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
所以這可能是要嘗試的東西;-)
這是 @otto 的好提示:
批次插入之前,請明確停用 autocommit 模式:
$wpdb->query( 'SET autocommit = 0;' );
批次插入後,執行:
$wpdb->query( 'COMMIT;' );
我也認為做一些家務的好主意像:
$wpdb->query( 'SET autocommit = 1;' );
我沒有在 MyISAM 上測試這個,但這應該在 InnoDB 上工作。
次佳解決方案
您將需要插入帖子以獲取您的 ID,但 $wpdb->postmeta 表的結構非常簡單。您可能會使用直接的 INSERT INTO 語句,就像 MySQL 檔案一樣:INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
在你的情況下
$ID = 1; // from your wp_insert_post
$values = '($ID,2,3),($ID,5,6),($ID,8,9)'; // build from your 97 columns; I'd use a loop of some kind
$wpdb->query("INSERT INTO {$wpdb->postmeta} (post_id,meta_key,meta_value) VALUES {$values}");
這不會處理任何編碼,序列化,轉義,錯誤檢查,重複或其他任何事情,但我希望它更快 (雖然我還沒有嘗試) 。
我不會在沒有徹底測試的情況下在生產現場做到這一點,如果我只需要做一到兩次,我會使用核心功能,並在進口時吃午飯。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。