Ich habe mich gefragt, ob es möglich ist, den bestehenden Importprozess zu beschleunigen, den ich für eine WordPress-Site erstellt habe. Ich muss die Daten aus einer externen XML-Datei importieren, Produkte basierend auf diesen Daten erstellen, die Bilder herunterladen und sie den erstellten Produkten zuweisen. Das Problem ist, dass auch Thumbnails generiert und über wp-Funktionen mit den Produkten verknüpft werden müssen. Ich schaffe es derzeit 1 bis 2 Bilder pro Sekunde einzufügen, das Skript wird alle 5 min per Cron-Job aufgerufen und das Limit für den Import liegt bei 120 Bildern. Das entspricht etwa 80 bis 150 Sekunden für einen Block von 120 Bildern. Das Problem ist, dass ich etwa 10000 Produkte mit 200000 Bildern importieren muss.
im tmp-Ordner pro Zeit ca. 1000 Bilder
Aktuelle Funktionalität, die ich verwende, ist:
function upload_image(){
ini_set("memory_limit","2048M");
add_filter('intermediate_image_sizes', function ($image_sizes){
return array('thumbnail');
},1000 );
if($this->ids===false) {
self::get_all_ids();
}
$upload_dir = wp_upload_dir();
$root = $upload_dir['basedir'].DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR;
$handle = opendir($root);
$files=array();
$propertys=array();
$propertys_images=array();
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$tmp_data=explode('_',$entry);
if(isset($tmp_data[1])) {
$post_id = isset($this->ids[$tmp_data[1]]) ? $this->ids[$tmp_data[1]] : 0;
if (!empty($post_id)) {
$propertys[$post_id] = $post_id;
$files[] = array('url' => $root . $entry, 'post_id' => $post_id, 'name' => $entry);
}else{
unlink( $root . $entry);
}
}else{
unlink( $root . $entry);
}
}
}
if (empty($propertys)){return'';}
global $wpdb;
$results = $wpdb->get_results("
SELECT ID,post_parent, post_title
FROM $wpdb->posts AS posts
WHERE post_type="attachment"
AND post_parent IN(".implode(',',$propertys).")
Order by ID asc
",ARRAY_A ) ;
$set_images=array();
foreach ($results as $r){
$set_images[]=$r['post_title'];
$propertys_images[$r['post_parent']][$r['ID']]=$r['ID'];
}
foreach ($files as $k => $d){
if(in_array($d['name'],$set_images)){
unset($files[$k]);
unlink($d['url']);
}
}
require_once( ABSPATH . 'wp-admin/includes/image.php' );
foreach ($files as $id_of_i => $f){
if($id_of_i > 120){continue;}
$image_url = $f['name'];
$post_id=$f['post_id'];
$base_path=$upload_dir['basedir'].DIRECTORY_SEPARATOR.'tmp' .DIRECTORY_SEPARATOR.$image_url;
$filename = basename( $image_url );
if ( wp_mkdir_p( $upload_dir['path'] ) ) {
$file = $upload_dir['path'] . "https://stackoverflow.com/" . $filename;
}
else {
$file = $upload_dir['basedir'] . "https://stackoverflow.com/" . $filename;
}
if(file_exists($base_path)) {
rename($base_path, $file);
//copy($base_path, $file);
}
$wp_filetype = wp_check_filetype( $filename, null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name( $filename ),
'post_parent' => $post_id,
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $file );
$propertys_images[$post_id][$attach_id]=$attach_id;
$attach_data = wp_generate_attachment_metadata( $attach_id, $file );
wp_update_attachment_metadata( $attach_id, $attach_data );
}
foreach ($propertys_images as $prop_id => $images){
$images_ids=array_values($images);
set_post_thumbnail($prop_id, $images_ids[0]);
update_post_meta($prop_id, '_thumbnail_id', $images_ids[0]);
update_post_meta($prop_id, 'fave_prop_slider_image', $images_ids[0]);
$num=get_post_meta($prop_id,'numb_of_images',true);
delete_post_meta($prop_id,'fave_property_images');
foreach ($images_ids as $k =>$id){
if($k!='0'){
add_post_meta($prop_id, 'fave_property_images', $id);
}
}
if($num<=count($images_ids)){
update_post_meta($prop_id, 'all_images_imp', 'true');
}
}
exit();
}
Zuerst habe ich eingestellt, nur Miniaturansichten dieser Bilder zu generieren, dann sammle ich alle product_codes (“get_all_ids()”), dann bekomme ich alle Bilder aus dem tmp-Ordner und überprüfe, ob Produkte für dieses Bild vorhanden sind, dann erhalte ich alle Anhänge für Produkte, deren Bilder ich habe dann migriere ich das Bild in den wp-Upload-Pfad
Rufen Sie dann “wp_insert_attachment” auf, um das Basisbild hinzuzufügen, und generieren Sie dann mit “wp_generate_attachment_metadata” ein Miniaturbild und dann hänge ich diese Informationen mit “wp_update_attachment_metadata” an den Anhang an.
Erhaltene Anhangs-IDs, die ich zu Produkten und Produktgalerien hinzufüge
Ich denke, dass in diesem Skript der verlangsamte Teil ein Vorschaubild generiert, gibt es eine Möglichkeit, diesen Prozess zu beschleunigen, oder wenn Sie einen Vorschlag haben
Mit der aktuellen Geschwindigkeit dauert es ca. 5 bis 10 Tage, um alle Bilder hinzuzufügen
Danke im Voraus