Kodexempel till att importera från en scv fil

På förra sidan gick vi igenom ett exempel på hur man man kunde importera poster från en csv fil. På denna sidan går vi igenom hur man kan importera bilder tillhörande dessa poster.

Vi förutsätter att bilderna redan ligger uppladdade på servern och att dom ligger i en undermapp  som heter ”bilder”. Denna mappen scannar vi för att se vilka bilder som finns där i:

$images = scandir( $path_to_images );

Ovan kod kommer spara ner ett fält med innehållande filer i denna mapp, lämpligt att göra detta innan loopen nämnd på förra sidan.

För att kunna koppla samman dessa bilder med en post behöver vi en länk mellan bilden och posten. Dvs att vi behöver nämna i en kolumn i csv -filen vad den tillhörande bilden heter.

Loopen nämnd på förra sidan avslutar med ett wp_insert_post anrop. Vi kommer här bygga vidare på denna och lägger till en if-sats därpå:

if( !in_array( $row[ 2 ], $images ))
  continue;

Vi kollar alltså helt enkelt om där finns en bild i mappen som är specificerad i csv -filen. Om inte så finns det ingen anledning att fortsätta scriptet och fortsätter därför till nästa rad.

Vi vill nu flytta dessa bilder till användarens specificerade uppladdningsmappen.

$src = $path_to_images . $row[ 2 ];
$upload_dir = wp_upload_dir( date( 'Y/m' ));
// DS = DIRECTORY_SEPARATOR
$dest = $upload_dir[ 'path' ] . DS;

if( !is_dir( $dest ))
  mkdir( $dest );

$dest .= $row[ 2 ];

if( copy( $src , $dest ))
  unlink( $src );

if( is_file( $src ))
  throw new Exception( 'Failed to remove: ' . $src );

Ovan kod kopierar inte bara bilden till rätt mapp. Detta innebär klart vissa begränsningar i csv -filen. Dvs att vi inte kan ha samma bild till olika rader. För enkelheten skull så går jag inte igenom lösningen för detta här men det borde inte vara några större svårigheter att själva hacka till då detta behövs.

Nu behöver vi ha reda på vilken filtyp som filen har kopplad till posten:

$filetype = wp_check_filetype( basename( $dest ));

Vi behöver också en länk till inlägget, dvs en url länk:

$dest_url = $upload_dir[ 'baseurl' ] 
          . DS . _wp_relative_upload_path( $dest );

Då kommer vi till att föra in själva datan i databasen. För att göra detta använder vi en funktion kallad wp_insert_attachment:

$attachment = array(
  'guid'           => _wp_relative_upload_path( $dest ),
  'post_mime_type' => $filetype[ 'type' ],
  'post_title'     => basename( $dest )),
  'post_content'   => '',
  'post_status'    => 'inherit' );

$attach_id = wp_insert_attachment( 
  $attachment, 
  $dest_url, 
  $post_id );

Då har vi posten i databasen, vi behöver vi dock uppdatera metadatan.  Detta görs med wp_generate_attachment_metadata och wp_update_attachment_metadata:

wp_update_attachment_metadata( 
  $attach_id, 
  wp_generate_attachment_metadata( 
    $attach_id, 
    $dest ));

Sist så fäster vi bilden som en tumnagel till posten, om så nu önskas:

update_post_meta( $post_id, '_thumbnail_id', $attach_id );