J'ai eu des problèmes similaires il y a quelque temps avec une importation CSV personnalisée, mais j'ai fini par utiliser du SQL personnalisé pour l'insertion en bloc. Mais je n'avais pas encore vu cette réponse:
Optimiser la post-insertion et la suppression pour les opérations en masse?
à utiliser wp_defer_term_counting()
pour activer ou désactiver le comptage des termes.
De plus, si vous vérifiez la source du plugin d'import WordPress, vous verrez ces fonctions juste avant l'importation en masse:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
puis après l'insertion en vrac:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Donc ça pourrait être quelque chose à essayer ;-)
L'importation de messages en tant que brouillon au lieu de les publier accélérera également les choses, car le lent processus de recherche d'un slug unique pour chacun est ignoré. On pourrait par exemple les publier plus tard en étapes plus petites, mais notez que ce type d'approche devrait marquer les articles importés d'une manière ou d'une autre, donc nous ne publions pas plus tard des brouillons! Cela nécessiterait une planification minutieuse et très probablement un codage personnalisé.
S'il y a par exemple beaucoup de titres de poste similaires (identiques post_name
) à importer, alorswp_unique_post_slug()
peut devenir lent, en raison de l'itération de la requête de boucle pour trouver un slug disponible. Cela peut éventuellement générer un grand nombre de requêtes db.
Depuis WordPress 5.1, le pre_wp_unique_post_slug
filtre est disponible pour éviter l'itération de boucle pour le slug. Voir ticket principal # 21112 . Voici un exemple:
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 l'on essaie par exemple $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
avec $suffix
as $post_id
, alors nous noterons que $post_id
c'est toujours 0
pour les nouveaux messages, comme prévu. Il existe différentes manières de générer des nombres uniques en PHP, comme uniqid( '', true )
. Mais utilisez ce filtre avec soin pour vous assurer d'avoir des limaces uniques. Nous pourrions par exemple exécuter une requête de comptage de groupe par la suite post_name
pour être sûr.
Une autre option serait d'utiliser WP-CLI pour éviter le dépassement de délai. Voir par exemple ma réponse postée pour création de 20 000 messages ou pages à l'aide d'un fichier .csv?
Ensuite, nous pouvons exécuter notre script d'importation PHP personnalisé import.php
avec la commande WP-CLI:
wp eval-file import.php
Évitez également d'importer un grand nombre de types de publication hiérarchiques, car l'interface utilisateur wp-admin actuelle ne le gère pas bien. Voir par exemple le type de message personnalisé - liste des messages - écran blanc de la mort
Voici le bon conseil de @otto:
Avant les insertions en masse , désactivez le autocommit
mode explicitement:
$wpdb->query( 'SET autocommit = 0;' );
Après les insertions en masse, exécutez:
$wpdb->query( 'COMMIT;' );
Je pense aussi que ce serait une bonne idée de faire un peu de ménage comme:
$wpdb->query( 'SET autocommit = 1;' );
Je n'ai pas testé cela sur MyISAM mais cela devrait fonctionner sur InnoDB .
Comme mentionné par @kovshenin, cette astuce ne fonctionnerait pas pour MyISAM .