以前にカスタムCSVインポートで同様の問題が発生しましたが、一括挿入にカスタムSQLを使用することになりました。しかし、私はその時までにこの答えを見ていませんでした:
一括操作の挿入と削除を最適化しますか?
wp_defer_term_counting()
用語カウントを有効または無効にするために使用します。
また、WordPressインポータープラグインのソースをチェックアウトすると、一括インポートの直前に次の関数が表示されます。
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
そして、一括挿入後:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
だから、これは試してみるものかもしれません;-)
投稿をインポートする publishの代わりにドラフトすることも、それぞれのユニークなスラッグを見つける遅いプロセスがスキップされるので、物事をスピードアップします。たとえば、後で小さなステップで公開することもできますが、この種のアプローチではインポートされた投稿に何らかの方法でマークを付ける必要があるため、後で下書きを公開するだけではありません。これには、慎重な計画と、おそらくカスタムコーディングが必要です。
たとえばpost_name
、インポートする類似の投稿タイトル(同じ)が多数ある場合wp_unique_post_slug()
、利用可能なスラッグを見つけるためのループクエリの反復により、遅くなる可能性があります。これにより、大量のdbクエリが生成される可能性があります。
WordPress 5.1以降pre_wp_unique_post_slug
では、スラッグのループ反復を回避するためにフィルターを使用できます。コアチケット#21112を参照してください。次に例を示します。
add_filter( 'pre_wp_unique_post_slug',
function( $override_slug, $slug, $post_id, $post_status, $post_type, $post_parent ) {
// Set a unique slug value to shortcircuit the slug iteration loop.
// $override_slug = ...
return $override_slug;
}, 10, 6
);
たとえばasを使用$override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
し$suffix
て試行すると$post_id
、予想どおり、$post_id
常に0
新しい投稿用であることに注意してください。ただし、PHPで一意の数値を生成するにはさまざまな方法がありますuniqid( '', true )
。ただし、このフィルターは慎重に使用して、固有のスラッグがあることを確認してください。たとえば、後でpost_name
確実にグループカウントクエリを実行できます。
別のオプションは使用することです WP-CLIをタイムアウトを回避することです。たとえば、.csvファイルを使用して20,000の投稿またはページを作成するために投稿された私の回答を参照してください。
次にimport.php
、WP-CLIコマンドでカスタムPHPインポートスクリプトを実行できます。
wp eval-file import.php
また、現在のwp-admin UIでは適切に処理されないため、多数の階層的な投稿タイプをインポートしないでください。例参照カスタム投稿タイプ-投稿リスト-死の白い画面
@ottoからのすばらしいヒントを次に示します。
一括挿入の前に、autocommit
モードを明示的に無効にします。
$wpdb->query( 'SET autocommit = 0;' );
一括挿入後、次を実行します。
$wpdb->query( 'COMMIT;' );
また、次のようなハウスキーピングを行うことをお勧めします。
$wpdb->query( 'SET autocommit = 1;' );
私はこれをMyISAMでテストしていませんが、これはInnoDBで動作するはずです。
以下のように述べたこのチップはのために働かない@kovsheninでのMyISAM。