Kodexempel till att importera från en scv fil

Publicerar ett kortare script som exempel på hur man kan läsa av en scv fil och importera i WordPress. Detta är inte meningen att det ska vara komplett eller på något vis flexibelt utan endast förklara en grundläggande tanke på hur det kan gå till.

Först vill vi ha tillgång till en fil:

// DS = DIRECTORY_SEPARATOR;
$path = __DIR__ . DS . 'produkter.csv';

if( is_file( $path ))
{
    $handle = fopen( $path, 'r' );
    ...

Konstanten __DIR__ lades till i PHP 5.3 och är det samma som dirname( __FILE__ ).

Först anger vi alltså vilken fil vi vill öppna, efter detta kollar vi om denna filen existerar och verkligen är en fil. Sist, men inte minst, så öppnar vi en ström till filen med endast läsrättigheter och sparar ett handtag till denna.

Här efter vill vi loopa igenom alla rader var för sig och använder då fgetcsv funktionen till detta.

while(( $row = fgetcsv( $handle )) !== false )

While loopen ovan kommer avbryta då där inte längre finns några rader att gå igenom.
Funktionen fgetcsv tar andra parametrar med. Läs på i manualen för en djupare förståelse.

Nu när vi har fått vår rad i csv filen så vill vi bygga vår post och lägga in den i vår databas. Vi åstadkommer detta med hjälp av wp_insert_post:

$post = array(
    'post_title'   => $row[ 0 ],
    'post_content' => $row[ 1 ],
    'post_status'  => 'publish' );

wp_insert_post( $post );

I exemplet ovan utgår vi alltså från att första kolumnen i vår csv fil är titeln till vår post och att den andra kolumnen är själva innehållet. Se wordpess codex för ytterligare förståelse och möjligheter.

Vill vi istället uppdatera befintliga poster som har samma titel måste vi ange ett id till denna post. Detta kan vi hämta med WP_Query:

$slug = sanitize_title( $row[ 0 ] );

$q = new WP_Query(
    array(
        'name'      => $slug,
        'post_type' => 'post' ));

if( $q->have_posts() )
    $post[ 'ID' ] = $q->next_post()->ID;

Först gör vi en slug av titeln med hjälp av sanitize_title. Därefter hämtar vi från databasen och lägger till referensen ID i vårt post fält om WP_Query fick en träff.

Hela kodstycket

$path = __DIR__ . DS . 'produkter.csv';

if( is_file( $path ))
{
    $handle = fopen( $path, 'r' );

    while(( $row = fgetcsv( $handle )) !== false )
    {
        $slug = sanitize_title( $row[ 0 ] );

        $post = array(
            'post_title'    => $row[ 0 ],
            'post_name'     => $slug,
            'post_content'  => $row[ 1 ],
            'post_status'   => 'publish' );

        $q = new WP_Query(
            array(
                'name'      => $slug,
                'post_type' => 'post' ));

        if( $q->have_posts() )
            $post[ 'ID' ] = $q->next_post()->ID;

        $id = wp_insert_post( $post );
    }
}

Läs vidare på nästa sida om hur man kan importera tillhörande bilder och sätta tumnaglar/featured image till posterna. 

Länkar

http://php.net/manual/en/function.fgetcsv.php
http://codex.wordpress.org/Function_Reference/wp_insert_post
http://codex.wordpress.org/Class_Reference/WP_Query
http://codex.wordpress.org/Function_Reference/sanitize_title