Qualche tempo fa ho avuto problemi simili con un'importazione CSV personalizzata, ma alla fine ho usato un codice SQL personalizzato per l'inserimento di massa. Ma non avevo ancora visto questa risposta:
Ottimizzare l'inserimento e l'eliminazione di post per operazioni in blocco?
da utilizzare wp_defer_term_counting()
per abilitare o disabilitare il conteggio dei termini.
Inoltre, se dai un'occhiata alla fonte per il plug-in importatore di WordPress, vedrai queste funzioni appena prima dell'importazione di massa:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
e quindi dopo l'inserimento di massa:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Quindi questo potrebbe essere qualcosa da provare ;-)
L'importazione di post come bozza invece di pubblicazione accelererà anche le cose, poiché il lento processo di ricerca di una lumaca unica per ognuno viene saltato. Si potrebbe, ad esempio, pubblicarli in seguito in passaggi più piccoli, ma si noti che questo tipo di approccio dovrebbe in qualche modo contrassegnare i post importati, quindi non pubblicheremo solo le bozze in un secondo momento! Ciò richiederebbe un'attenta pianificazione e molto probabilmente una codifica personalizzata.
Se ci sono ad esempio molti titoli di post simili (gli stessi post_name
) da importare, allora wp_unique_post_slug()
può rallentare, a causa dell'iterazione della query loop per trovare una lumaca disponibile. Questo può eventualmente generare un numero enorme di query db.
A partire da WordPress 5.1 il pre_wp_unique_post_slug
filtro è disponibile per evitare l'iterazione di loop per la lumaca. Vedi il core ticket # 21112 . Ecco un esempio:
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 uno prova ad es. $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
Con $suffix
as $post_id
, notiamo che $post_id
è sempre 0
per i nuovi post, come previsto. Ci sono vari modi per generare numeri univoci in PHP, come uniqid( '', true )
. Ma usa questo filtro con cura per assicurarti di avere lumache uniche. Potremmo ad esempio eseguire una query sul conteggio dei gruppi in seguito post_name
per essere sicuri.
Un'altra opzione sarebbe quella di utilizzare WP-CLI per evitare il timeout. Vedi ad esempio la mia risposta pubblicata per la creazione di 20.000 post o pagine utilizzando un file .csv?
Quindi possiamo eseguire il nostro script di importazione PHP personalizzato import.php
con il comando WP-CLI:
wp eval-file import.php
Evita anche di importare un gran numero di tipi di post gerarchici, poiché l'attuale interfaccia utente di wp-admin non la gestisce bene. Vedi ad esempio il tipo di post personalizzato - elenco post - schermo bianco della morte
Ecco il grande consiglio di @otto:
Prima di inserimenti in blocco , disabilitare autocommit
esplicitamente la modalità:
$wpdb->query( 'SET autocommit = 0;' );
Dopo gli inserti di massa, eseguire:
$wpdb->query( 'COMMIT;' );
Penso anche che sarebbe una buona idea fare delle pulizie come:
$wpdb->query( 'SET autocommit = 1;' );
Non l'ho provato su MyISAM ma questo dovrebbe funzionare su InnoDB .
Come accennato da @kovshenin questo suggerimento non funzionerebbe per MyISAM .