WordPress importiert eine große Anzahl von Bildern vom Server und verknüpft sie mit Posts

Lesezeit: 4 Minuten

Benutzer-Avatar
Miloš Radenković

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

Das Problem war der EWWW Image Optimizer, also müssen Sie darauf achten, ob zwischen Ihren Plugins eine Art Optimierer aktiv ist. Wenn ich das Plugin deaktiviert habe (einen Haken trennen), erhöht sich die Geschwindigkeit des Einfügens von Bildern eine Beute

1335210cookie-checkWordPress importiert eine große Anzahl von Bildern vom Server und verknüpft sie mit Posts

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy