問題描述

我有一個我要插入的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。