poky.ro : part 4… autoposting

Dupa ce am ajuns la procesul de copy+paste sa va zic cum am trecut peste acest proces… intr-un final se public automat articolele.

Publicarea unui articol nou se face foarte usor cu ajutorul functiei wp_insert_post()… cu parametrii bine setati.

Dar sa vedem mai detaliat.

Daca vrei sa faci un script (de la zero) care face ceva in wordpress este necesar sa incluzi urmatoarea linie de cod :

1
  require( dirname(__FILE__) . '/wp-load.php' );

wp-load.php e un script ce incarca (practic vorbind) tot frameworkul de wordpress, dupa care ai access cam la toate feature-urile ce ti le ofera wordpressul. Trebuie sa ii pozitionati corect directoriul astfel ca sa incarce fisierul. La mine scriptul ce publica posturile automat nu se afla in acelasi directoriu unde e instalat wordpressul, cu un un nod mai sus in arborele de directorii, deci la mine e ceva de genu (in www e blogul instalat) :

1
  require( dirname(__FILE__) . '/www/wp-load.php' );

Acum doar imi ramane sa pregatesc articolul si sa apelez wp_insert_post().

Articolele mele se afla in fisiere txt cu prima linie care contine titlul, iar restul e continutul articolului. Toate articolele sunt in fisiere txt intr-un folder NEW si mai am un directoriu OLD in care pun fisierele cu articolele deja afisate (ca sa nu sterg txt-urile magice). Ideea e sa ieu un fisier TXT din directoriul NEW -> il mut in OLD apoi il afisez pe blog.

Inainte de a trece la cod, vreau sa zic ca am o functie ce trimite mail pentru raportare (da… citesc rapoartele scriptului sa vad ce se intimpla)

1
2
3
4
    function send_mail123( $content = 'ping', $subject = 'publishing report' )
    {
        mail( 'report@gmail.com', $subject . ' ' . date( 'Y.m.d H:i:s' ), $content );
    }

e simpla… deci trecem fara multe comentarii peste.

am 2 directorii… new si old :

1
2
    $newdir = dirname(__FILE__) . '/new/';
    $olddir = dirname(__FILE__) . '/old/';

iau un fisier:

1
2
3
4
    $file = get_file123( $newdir );
    if ( $file === FALSE ) {
        send_mail123( "Nu mai sunt fisiere pentru http://poky.ro" , "Error report" );
    }

am o functie get_file123() care face toata treaba… iaka sursa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    function get_file123( $dir )
    {
        $handle = opendir( $dir );
        if ( $handle === false ) {
            send_mail123( "get_file123 can't open dir $dir\n" );
            return FALSE;
        }
           
        while ( false !== ( $file = readdir( $handle ) ) ) {
            if ( is_file( $dir.$file ) ) {
                closedir($handle); 
                return $file;
            }
        }
       
        send_mail123( "get_file123 no file in $dir\n" );
        return FALSE;
    }

la linia #3 deschid directoriul, la linia #9 iau primul fisier din directoriu, la #10 verific daca fisierul este… fisier ๐Ÿ™‚ (poate intoarce si nume de directorii, . (punct) sau .. (doua puncte)). La #12 returnez numele fisierului. In rest doar tratarea cazurilor de eroare… inutile pentru post… dar utile pentru mine.

apoi… mut fisierul in directriul OLD :

1
2
    rename( $newdir . $file, $olddir . $file );
    $file = $olddir . $file; // = full path + filename

apoi… ieu continutul articolului :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    function get_post123( $file ) {
        $rett = array( );

        $txt = explode("\n", $txt);
        if ( count( $txt ) == 0 )
            send_mail123( "no text in file $file\n" );
           
        $title = '';
        foreach ( $txt as $key => $value) {
            if( strlen( $value ) == 0 ||
                str_word_count( $value ) == 0 )
                unset( $txt[ $key ] );
            else
            if ( strlen( $title ) == 0 ) {
                $title = $value;
                unset( $txt[ $key ] );
            }
        }
       
        if ( strlen( $title ) == 0 ) {
            send_mail123( "nam gasit titlul in $file" );
            die( );
        }
       
        $rett[ 'title' ] = $title ; /// TITLE
       
        $txt = explode( "\n", implode( "\n", $txt ) );
       
        $wcount = 0;
        for ( $i = 0; $i < count( $txt ) - 1; $i++ ) {
            $wcount += str_word_count( $txt[ $i ] );
            if ( $wcount > 200 ) {
                $txt[ $i ] .= "\n\n<!-- more -->";
                break;
            }
        }

        $rett[ 'post' ] = implode( "\n\n", $txt );
       
        return $rett;
    }
    $fpost = get_post123( $file );

la #2 e variabila $rett care va fi intoarsa de catre functia get_post123. La #4 pun textul intr-un array, dupa care la linia #9 parsez fiecare element si sterg liniile goale (IF de la #10 si UNSET de la #12) dupa care setez variabila ce contine titlul articolului (linia #15) si il sterg din continutul articolului (linia #16)

la linia #25 bag titlu in variabila $rett, dupa care recreez arrayul cu liniile articolului (un fel de update la indexi). FORul de la linia #30 are ca scop introducerea cuvantului magic MORE din wordpress, care face ca jumate de articol sa fie afisat pe pagina de home(index) si tot articolul atunci cand se intra pe linkul lui (200 de cuvinte pana la MORE e oki…). Si la sfarsit se pune continutul articolului in variabila(array) de output $rett (la linia #38) si se returneaza continutul lui.

In continuare se lucreaza cu continutul lui $fpost care ia valoarea functiei get_post123().

Am nevoie de IDul categoriei in care va fi articolul nou (exista categoria Articles in care vor fi toate articolele):

1
    $theCatId = get_cat_ID( 'Articles' );

Acum ca am toate datele necesare, creez obiectul ce il voi pasa functiei wp_insert_post() :

1
2
3
4
5
6
7
8
9
    $my_post = array(
        'post_type' => 'post',
        'post_title' => $fpost[ 'title' ],
        'post_content' => $fpost[ 'post' ],
        'post_status' => 'publish',
        'post_author' => 1,
        'post_category' => array( $theCatId ),
        'comment_status' => 'open'
    );

si apelez functia ce publica articolul :

1
2
    wp_insert_post( $my_post );
    send_mail123( "$file \r\n<br/>\r\n" . print_r( $fpost, true ) );

… si la sfarsit un mail de confirmare ca totu e oki.

Am pus scriptul sa ruleze in crontab… si gata… happy posting ๐Ÿ™‚ . Tot ce treb sa fac e sa ii dau de “mancare” scriptului in directoriul NEW.

PS: Merci celor de la WordPress pentru documentatia buna.

Leave a Reply

Your email address will not be published. Required fields are marked *