Mon tableau de messages est d'environ 600K, et je ne considère pas cela du tout grand. Quoi qu'il en soit, wp_insert_post devient très lent. J'essaie d'importer une liste énorme d'informations sur les hôtels dans les postes. La liste est d'environ 1500K grande. L’insertion de messages commence bien à 200-400 messages par seconde, mais elle chute considérablement à environ 20-10 messages par seconde lorsque le nombre de messages atteint 400 000.
Lorsque je fais une requête directe sur la table des publications, il insère à nouveau 400 publications par seconde. Donc, ma conclusion est que wp_insert_post ralentit considérablement les choses.
J'ai essayé quelques astuces pour améliorer la vitesse de wp_insert_post, telles que:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
$wpdb->query( 'SET autocommit = 0;' );
et après l'importation en vrac:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
$wpdb->query( 'SET autocommit = 1;' );
$wpdb->query( 'COMMIT;' );
mais cela n'aide pas à améliorer la vitesse d'insertion, en réalité l'amélioration est nulle.
Quelqu'un peut-il m'expliquer s'il vous plaît ce que 'check' dans la fonction wp_insert_post le ralentit?
Est-ce que c'est la colonne 'post_name' AKA slug? ça doit être unique, non? Y a-t-il d'autres colonnes qui sont cochées?
J'aimerais savoir ce qui est vérifié ou ce qui doit être vérifié car je songe sérieusement à remplacer la fonction wp_insert_post par la mienne pour accélérer les choses.
merci d'avance
edit - a ajouté ma boucle:
foreach($hotels as $key => $hotel) {
$slug = $hotel->HotelName;
$title = $hotel->HotelName;
if ($hotel->translation == NULL) {
$description = $hotel->Overview;
} else {
$description = $hotel->translation;
}
$hotel_id = wp_insert_post(
array(
//'ID' => $hotel->id,
'post_mime_type' => $hotel->id,
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_author' => $author_id,
'post_name' => $slug,
'post_title' => $title,
'post_status' => 'publish',
'post_type' => 'hotel',
'post_content' => $description, )
);
}
vous devriez inverser le code, vous devriez ajouter ceci avant l'importation
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
ne le définissez pas faux et après l'importation vous le définissez vrai, vous devez faire la chose oppsite
J'ai eu le même problème pour insérer 50 messages, cela a pris environ 7 minutes après avoir ajouté ce code avant le wp_insert_post, cela ne m'a pris que 7 secondes.
et vous pouvez aussi ajouter ceci
define( 'WP_IMPORTING', true );
et après avoir importé la publication, ajoutez ceci et exécutez le script
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Essayez de modifier la base de données pour améliorer la vitesse de recherche du champ post_name ...
ALTER TABLE `wp_posts` ADD INDEX (`post_name`);
Vous voulez éviter d'écrire votre propre remplacement wp_insert_post()
car de petites astuces se produisent dans des endroits inattendus et deviennent un véritable casse-tête pour un débogage ultérieur.