webentwicklung-frage-antwort-db.com.de

Importieren von WordPress-Anhängen in benutzerdefinierte Verzeichnisse in wp-content/uploads /

Ich hoffe, dass jemand Licht in dieses Problem bringen kann, das ich zu lösen versuche, auch wenn ich einfach meinen Denkprozess dahingehend ändere, wie ich das lösen könnte.

Ich importiere eine benutzerdefinierte CakePHP-basierte CMS-Webanwendung in WordPress, indem ich die Datenbank durchquere, zahlreiche SQL-Abfragen durchführe, Arrays aufbaue und schließlich die für den Import erforderliche XML-Datei mit dem WordPress-Import-Tool ausgebe.

Momentan habe ich es geschafft, Kategorien, Tags und Posts/Seiten zu importieren, ohne Probleme, aber es sind die Bilder, die das Problem zu sein scheinen. Das aktuelle Format von Bildern im CakePHP-basierten CMS ist images/year/month/day/post_id/image_name.ext

Soweit ich weiß, kann WordPress standardmäßig nur Medien in wp-content/uploads oder wp-content/uploads/year/month speichern.

Was ich getan habe, ist, über alle Bildordner aus dem CakePPH-App-Verzeichnis in mein WordPress-Verzeichnis wp-content/uploads zu kopieren, sodass ein Beispielbild diesen Pfad hat: http://localhost/wordpress_site/wp-content/uploads/2013/01/01/12345/image.jpg

In meiner WordPress-XML-Datei, die ich generiere, habe ich die attachment_url und die GIUD so eingestellt, wie sie oben angegeben sind, und auf das neue Bild verwiesen, das ich in meinem Upload-Verzeichnis platziert habe. Ich habe sogar den Dateipfad in den serialzied-Metadaten des Anhangselements im XML festgelegt.

Wenn ich den Importvorgang ausführe und die Option "Anhänge herunterladen und importieren" in WordPress NICHT aktiviere, erhalte ich die Fehlermeldung, dass die Medien nicht importiert werden können ...

Wenn ich die Option "Anhänge herunterladen und importieren" aktiviere, befinden sich die Bilder innerhalb des oben angegebenen benutzerdefinierten Pfads. Die Größe der Bilder wird jedoch entsprechend den Abmessungen der Miniaturansichten usw. geändert, und das Bild wird weiterhin in einem Jahr/Monat/gespeichert. image.jpg path. Alles, was WordPress getan hat, war, die Datei an diesem (benutzerdefinierten) Speicherort zu lesen, aber dennoch den endgültigen Pfad zu einem Standard-WordPress-Pfad festzulegen, wobei das Bild und die generierten Miniaturansichten über den gewünschten Speicherort verschoben werden.

Kennt jemand eine Möglichkeit, die Medien einfach in einem benutzerdefinierten Pfad im Upload-Ordner zu speichern UND WordPress zu zwingen, diesen Pfad zu akzeptieren und zu verwenden, wenn ein Import ausgeführt wird?

Ich verstehe, dass ich über Aktionen und Hooks die Upload-Pfadstruktur ändern kann, aber nur innerhalb von WordPress und nur beim Hochladen von Medien über den Post/Page/Media Manager, nicht während eines Imports. Das Letzte, was ich tun möchte, ist das Importskript zu hacken.

Jede Hilfe, Anleitung, Ratschläge werden mehr als geschätzt.

3
SimonDowdles

Ja, Sie können den Anhang programmgesteuert hinzufügen.

$upl = wp_upload_dir();
$target = $upl['basedir'] . '/YOUR_CUSTOM_FOLDERS/YOUR_FILE';
$filetype = wp_check_filetype($target);

$attachment = array(
    'post_mime_type' => $filetype['type'],
    'post_title' =>  $YOUR_FILE_TITLE,
    'post_content' => '',
    'post_status' => 'inherit'
);

wp_insert_attachment( $attachment, $target, $POST_ID_TO_ATTACH_TO );

Dies teilt Wordpress mit, dass es einen Anhang bei $ target gibt, und Sie können ihn optional an einen Beitrag mit dem letzten Parameter im Aufruf von wp_insert_attachment anhängen.

2
tobbr

Für alle, die mit dem gleichen Dilemma konfrontiert sind wie ich, gibt es viele Online-Ressourcen, die bestimmen, wie dieses Problem gelöst werden kann. Ich fand, der beste Weg, die Lösung zu finden, bestand darin, programmgesteuert nach so etwas wie WordPress-Anhängen zu suchen, was eine ganze Reihe von Lösungen hervorbrachte.

Vielen Dank an @tobbr für seine wertvolle Anleitung, mich in die richtige Richtung zu weisen. Meine letzte Lösung bestand darin, ein Plugin zu erstellen, die alte Site-Datenbank (CakePHP) nach alten Bildern und ihren Pfaden zu durchsuchen und diese dann zum Importieren der Anhänge in WordPress zu verwenden.

Der wichtige wichtige Punkt, den Sie dabei berücksichtigen sollten, ist, dass ich das Verzeichnis mit den Bildern der alten Sites in mein WordPress-Upload-Verzeichnis KLONIERT habe. Die alten Bildpfade waren wie folgt:

CAKE_ROOT/app/WebRoot/images/2012/10/2/12345/image_name.jpg

Wobei 12345 = die ID des Bildeintrags in der Datenbank (die ID des Anhangs beim Import in WordPress. Ich habe also den GESAMTEN Bilderordner oben in mein WordPress-Upload-Verzeichnis verschoben, sodass meine WordPress-Bildordnerstruktur wie folgt aussah:

WP_ROOT/wp-content/uploads/2012/10/2/12345/image_name.jpg

Es ist wichtig zu beachten, dass Ihre Bilder irgendwo in Ihrem WordPress-Upload-Verzeichnis gespeichert sein MÜSSEN, bevor Sie mit dem programmgesteuerten Import von Anhängen beginnen. Stellen Sie außerdem sicher, dass Sie über die erforderlichen Berechtigungen verfügen. Um den Import zu ermöglichen, habe ich vor dem Start einen chmod -R 777 -Befehl für meinen Upload-Ordner ausgeführt.

Ich habe dann das Plugin geschrieben, das bei weitem nicht so kompliziert war, wie ich es mir vorgestellt hatte.

<?php
/*
Plugin Name: Image Importer
Plugin URI: 
Description:
Author: xxxxx
Version: 1.0
Author URI: 
*/

error_reporting(E_ALL);

add_action( 'admin_menu', 'sd_plugin_menu' );

function sd_plugin_menu() {
    add_options_page( 'My Plugin Options', 'My Image Importer', 'manage_options', 'sd-image-importer', 'sd_image_importer' );
}

function sd_image_importer() {
    if ( !current_user_can( 'manage_options' ) )  {
        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
    }

    echo '<div style="overflow:hidden;padding:20px;margin:20px 0 0 0;border:1px solid #ccc;font-size:14px;color:#666;">';

    if($_REQUEST['getfiles'] == 1) {

    // Make a MySQL Connection
    $con = mysqli_connect("xxx", "xxx", "xxx") or die(mysql_error());
    mysqli_select_db($con,"xxxx") or die(mysqli_error($con));

    // Retrieve all the data from the images table
    $result = mysqli_query($con,"SELECT * FROM cake_attached_images WHERE created > '2012-10-01' AND created < '2012-10-02'") or die(mysql_error($con));  

    // pre buffer empty array so as not to create one on each iteration of DB
    $files = array();

        while ($row = mysqli_fetch_array($result,MYSQL_ASSOC)) {
            $year = date('Y', strtotime($row['created']));
            $month = date('m', strtotime($row['created']));
            $day = ltrim(date('d', strtotime($row['created'])),0);
            $id = $row['id'];
            $foreign_key = $row['foreign_key'];
            $caption = $row['caption'];
            $filename = $row['filename'];

            $files[$id] = array(
                'id' => $id,
                'foreign_key' => $foreign_key,
                'path' => "$year/$month/$day/$id/$filename",
            );
        };
    }; // End if getfiles param present in URL

    if($_REQUEST['insert'] == 1){

        global $wpdb; 

        foreach($files as $file){

          $wp_filetype = wp_check_filetype(basename($wp_upload_dir['baseurl'].'/'.$file['path']), null );
          $wp_upload_dir = wp_upload_dir();

          $attachment = array(
             'guid' => $wp_upload_dir['baseurl'].'/'. $file['path'], 
             'post_mime_type' => $wp_filetype['type'],
             'post_title' => preg_replace('/\.[^.]+$/', '', basename($wp_upload_dir['baseurl'].'/'.$file['path'])),
             'post_content' => '',
             'post_status' => 'inherit',
             'post_parent' => $file['foreign_key']
          );

          // Insert attachment, newly added attachmnet ID is returned...
          $attach_id = wp_insert_attachment( $attachment, $wp_upload_dir['path'].'/'. $file['path'], $file['foreign_key'] );
          // The file MUST be included to make use of the wp_generate_attachment_metadata function below
          require_once(ABSPATH . 'wp-admin/includes/image.php');
          // Generate metadata from newly added attachment above
          $attach_data = wp_generate_attachment_metadata( $attach_id, $wp_upload_dir['path'].'/'. $file['path'] );
          // Updates atttachment metadata for newly added attachmnet based on the generated metadata above
          if(wp_update_attachment_metadata( $attach_id, $attach_data )){
            // Optional, can be sued to set the added attachmnet as the featured image on the post
            add_post_meta($file['foreign_key'], '_thumbnail_id', $attach_id, true);
            // Simple outout to indicate if attachmnet was added or not, for debugging
            echo '<span style="color:green;">Attachment successfully added for post with ID <strong>'.$file['foreign_key'].'</strong>, path of new attachment is at <strong>'.$wp_upload_dir['baseurl'].'/'.$file['path'].'</strong></span><br/>';
          }else{
            echo '<span style="color:red;">Failed to generate new attachment for post with ID <strong>'.$file['foreign_key'].'</strong></span><br/>';
          }

        }
    } // end if insert param present in URL request

    $files = null;

    echo '</div>';
}?>

UND HIER IS EINE BONUSFUNKTION:

Ich bin darauf gestoßen, NACHDEM ich das Plugin geschrieben habe, aber wenn Sie nur ein paar (ich hatte über 100.000 Bilder zum Importieren!) Haben, gibt es in WordPress eine SEHR nützliche Funktion namens media_sideload_image, die ein Bild von einer entfernten URL aufnimmt und es einem Beitrag hinzufügt Ihrer Wahl, es lohnt sich, einen Blick darauf zu werfen. Weitere Informationen finden Sie im Codex: http://codex.wordpress.org/Function_Reference/media_sideload_image


Folgende Links zu WordPress Codex-Ressourcen haben mir geholfen:

  1. http://codex.wordpress.org/Function_Reference/wp_insert_attachment - Programmgesteuertes Einfügen von Anhängen
  2. http://codex.wordpress.org/Function_Reference/wp_update_attachment_metadata - Aktualisieren von Metadaten für neu hinzugefügte Anhänge add_post_meta - Wenn Sie das neu hinzugefügte Bild als ausgewähltes Bild festlegen möchten

Andere externe Seiten, die mir geholfen haben:

  1. http://www.zdnet.com/blog/diy-it/programmatically-importing-thousands-of-featured-image-post-thumbnails-into-wordpress/118 - ZDNet
  2. http://nlb-creations.com/2012/09/26/how-to-programmatically-import-media-files-to-wordpress/ - NB Creations
  3. Bilder programmatisch per URL abrufen und im Upload-Ordner speichern - WordPress Answers
  4. Programmgesteuertes Erstellen von Bildanhängen aus lokalen URLs und Festlegen der empfohlenen Bild - WordPress-Antworten

Ich hoffe das hilft jemandem wie mir. Simon

1
SimonDowdles