前一段时间,我在自定义CSV导入时遇到了类似的问题,但我最终使用了一些自定义SQL进行批量插入。但那时我还没有看到这个答案:
Optimize post insert and delete for bulk operations?
使用
wp_defer_term_counting()
启用或禁用术语计数。
如果您查看source 对于WordPress导入器插件,您将在批量导入之前看到以下功能:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
然后在批量插入之后:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
所以这可能是要尝试的;-)
将帖子导入为草稿而不是发布,也会加快速度,因为会跳过为每个帖子找到唯一slug的缓慢过程。例如,可以稍后以较小的步骤发布它们,但请注意,这种方法需要以某种方式标记导入的帖子,所以我们不只是稍后发布任何草稿!这需要仔细规划,很可能需要一些自定义编码。
如果有很多类似的职位名称(相同post_name
) 要导入,则wp_unique_post_slug()
由于循环查询迭代以查找可用的段塞,可能会变得很慢。这可能会生成大量的db查询。
自WordPress 5.1pre_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
);
如果有人尝试,例如。
$override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
具有
$suffix
像
$post_id
, 然后我们会注意到
$post_id
始终是
0
对于新职位,如预期的那样。在PHP中有多种方法可以生成唯一的数字,如
uniqid( \'\', true )
. 但要小心使用这个过滤器,确保你有独特的鼻涕虫。例如,我们可以在上运行组计数查询
post_name
当然
另一种选择是使用WP-CLI 以避免超时。参见例如我的答案张贴Creating 20,000 Posts or Pages using a .csv file?
然后我们可以运行定制的PHP导入脚本import.php
使用WP-CLI命令:
wp eval-file import.php
还要避免导入大量层次结构的帖子类型,因为当前的wp admin UI不能很好地处理它。参见示例。
Custom post type - posts list - white screen of deathHere\'s the great tip from @otto:
在批量插入之前,请禁用
autocommit
模式明确:
$wpdb->query( \'SET autocommit = 0;\' );
批量插入后,运行:
$wpdb->query( \'COMMIT;\' );
我还认为做一些家务活是个好主意,比如:
$wpdb->query( \'SET autocommit = 1;\' );
我没有在MyISAM上测试过这个,但这应该可以在InnoDB上使用。
像mentioned 作者@kovshenin这条提示对MyISAM不起作用。