Eu tive problemas semelhantes há algum tempo com uma importação CSV personalizada, mas acabei usando algum SQL personalizado para a inserção em massa. Mas eu não tinha visto essa resposta até então:
Otimizar pós-inserção e exclusão para operações em massa?
para wp_defer_term_counting()
ativar ou desativar a contagem de termos.
Além disso, se você verificar a fonte do plug-in importador do WordPress, verá estas funções imediatamente antes da importação em massa:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
e depois da inserção em massa:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Portanto, isso pode ser algo para experimentar ;-)
A importação de postagens como rascunho, em vez de publicação , também acelerará as coisas, pois o processo lento de encontrar uma lesma exclusiva para cada uma é ignorado. Pode-se, por exemplo, publicá-las posteriormente em etapas menores, mas observe que esse tipo de abordagem precisaria marcar as postagens importadas de alguma forma, para que não publicemos apenas os rascunhos posteriormente! Isso exigiria um planejamento cuidadoso e provavelmente uma codificação personalizada.
Se houver, por exemplo, muitos títulos de postagem semelhantes (iguais post_name
) a serem importados, wp_unique_post_slug()
pode ficar lento, devido à iteração da consulta de loop para encontrar uma lesma disponível. Isso pode gerar um grande número de consultas de banco de dados.
Desde o WordPress 5.1, o pre_wp_unique_post_slug
filtro está disponível para evitar a iteração de loop da lesma. Veja o tíquete principal # 21112 . Aqui está um exemplo:
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
);
Se alguém tentar, por exemplo, $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
com $suffix
as $post_id
, notaremos que $post_id
é sempre 0
para novas postagens, como esperado. Existem várias maneiras de gerar números únicos em PHP, como uniqid( '', true )
. Mas use esse filtro com cuidado para garantir que você tenha lesmas exclusivas. Por exemplo, poderíamos executar uma consulta de contagem de grupos posteriormente post_name
para ter certeza.
Outra opção seria usar o WP-CLI para evitar o tempo limite. Veja, por exemplo, minha resposta publicada em Criando 20.000 postagens ou páginas usando um arquivo .csv?
Em seguida, podemos executar nosso script de importação PHP personalizado import.php
com o comando WP-CLI:
wp eval-file import.php
Evite também importar um grande número de tipos hierárquicos de postagem, pois a atual interface do usuário wp-admin não lida bem com isso. Veja, por exemplo, tipo de publicação personalizada - lista de publicações - tela branca da morte
Aqui está a ótima dica do @otto:
Antes das inserções em massa , desative o autocommit
modo explicitamente:
$wpdb->query( 'SET autocommit = 0;' );
Após as inserções em massa, execute:
$wpdb->query( 'COMMIT;' );
Também acho que seria uma boa ideia fazer algumas tarefas domésticas, como:
$wpdb->query( 'SET autocommit = 1;' );
Eu não testei isso no MyISAM, mas isso deve funcionar no InnoDB .
Como mencionado por @kovshenin, essa dica não funcionaria para o MyISAM .