Hace algún tiempo tuve problemas similares con una importación CSV personalizada, pero terminé usando un SQL personalizado para la inserción masiva. Pero no había visto esta respuesta para entonces:
¿Optimizar la inserción y eliminación de publicaciones para operaciones masivas?
para wp_defer_term_counting()
habilitar o deshabilitar el conteo de términos.
Además, si revisa la fuente del complemento importador de WordPress, verá estas funciones justo antes de la importación masiva:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
y luego después de la inserción masiva:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Entonces esto podría ser algo para probar ;-)
Importar publicaciones como borrador en lugar de publicar también acelerará las cosas, ya que se omite el lento proceso de encontrar una babosa única para cada una. Uno podría, por ejemplo, publicarlos más tarde en pasos más pequeños, pero tenga en cuenta que este tipo de enfoque necesitaría marcar las publicaciones importadas de alguna manera, ¡así que no publicaremos ningún borrador más adelante! Esto necesitaría una planificación cuidadosa y muy probablemente una codificación personalizada.
Si, por ejemplo, se importan muchos títulos de publicaciones similares (iguales post_name
), wp_unique_post_slug()
puede volverse lento, debido a la iteración de la consulta de bucle para encontrar una babosa disponible. Esto posiblemente puede generar una gran cantidad de consultas db.
Desde WordPress 5.1, el pre_wp_unique_post_slug
filtro está disponible para evitar la iteración del bucle de la babosa. Ver boleto principal # 21112 . Aquí hay un ejemplo:
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
);
Si uno intenta, por ejemplo, $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
con $suffix
as $post_id
, entonces notaríamos que $post_id
siempre es 0
para nuevas publicaciones, como se esperaba. Sin embargo, hay varias formas de generar números únicos en PHP, como uniqid( '', true )
. Pero use este filtro con cuidado para asegurarse de tener babosas únicas. Podríamos, por ejemplo, ejecutar una consulta de recuento grupal después post_name
para estar seguros.
Otra opción sería usar WP-CLI para evitar el tiempo de espera. ¿Ve, por ejemplo, mi respuesta publicada para Crear 20,000 publicaciones o páginas usando un archivo .csv?
Luego podemos ejecutar nuestro script de importación PHP personalizado import.php
con el comando WP-CLI:
wp eval-file import.php
También evite importar una gran cantidad de tipos de publicaciones jerárquicas, ya que la interfaz de usuario actual de wp-admin no lo maneja bien. Ver, por ejemplo, tipo de publicación personalizada - lista de publicaciones - pantalla blanca de la muerte
Aquí está el gran consejo de @otto:
Antes de las inserciones masivas , deshabilite el autocommit
modo explícitamente:
$wpdb->query( 'SET autocommit = 0;' );
Después de las inserciones masivas, ejecute:
$wpdb->query( 'COMMIT;' );
También creo que sería una buena idea hacer algunas tareas de limpieza como:
$wpdb->query( 'SET autocommit = 1;' );
No he probado esto en MyISAM pero debería funcionar en InnoDB .
Como mencionó @kovshenin, este consejo no funcionaría para MyISAM .