it-swarm.com.de

Wie importiere ich einen RSS-Feed als Wordpress-Posts ohne Duplikate?

Ich habe eine XML-Feed-URL. Ich verwende jetzt diesen Code, um aus einem RSS-Feed in meiner Datei functions.php neue benutzerdefinierte Posts zu erstellen:

    /*
| -------------------------------------------------------------------
| Schedule and update fashion news with the news rss feed
| -------------------------------------------------------------------
| 
| */

if (!wp_next_scheduled('update_feed'))
    wp_schedule_event(current_time('timestamp'), 'hourly', 'update_feed');

add_action('update_feed', 'update_fashion_news');

function update_fashion_news() {
    // retrieve the previous date from database
        $time = get_option('latestpostdate');

        //read the feed
        if(function_exists('fetch_feed')){
            $uri = 'http://www.sitename.com/feed.xml';
            $feed = fetch_feed($uri);
        }

        if($feed) {

            foreach ($feed->get_items() as $item){
                $titlepost = $item->get_title();
                $content = $item->get_content();
                $description = $item->get_description();
                $itemdate = $item->get_date();
                $media_group = $item->get_item_tags('', 'Enclosure');
                $img = $media_group[0]['attribs']['']['url'];
                $width = $media_group[0]['attribs']['']['width'];           
                // $latestItemDate = $feed->get_item()->get_date();


                // if the date is < than the date we have in database, get out of the loop
                if( $itemdate <= $time) break;


                // prepare values for inserting

                $post_information = array(
                    'post_title' => $titlepost,
                    'post_content' => $description,
                    'post_type' => 'fashionnews',
                    'post_status' => 'publish',
                    'post_date' => date('Y-m-d H:i:s')
                );

                wp_insert_post( $post_information );    

            }
        }
        // update the new date in database to the date of the first item in the loop        
        update_option( 'latestpostdate', $feed->get_item()->get_date() );
}

[UPDATE: Haben den obigen Code aktualisiert, um von simple_xml auf simplepie umzusteigen]

[UPDATE2: Haben den Code verschoben und in ein WP Zeitplanereignis eingepackt, wie von @Mridul unten empfohlen]

Ich überprüfe immer noch, ob mein Code funktioniert, wenn die nächsten Nachrichtenaktualisierungen eintreffen. Glaubt jemand, dass dieser Code aus irgendeinem Grund nicht funktionieren würde?

2
Amit Erandole

Der RSS-Feed enthält alle Elemente in einer festen Reihenfolge (vom neuesten zum ältesten). In diesem Fall können Sie das Datum und die Uhrzeit des letzten von Ihnen erstellten Posts als Option speichern. Wenn Sie den Feed erneut lesen, können Sie die zuvor gespeicherte Uhrzeit überprüfen, um festzustellen, welche der Posts im Feed neu sind, und sie einfügen. dann aktualisiere die Zeit erneut

Die Funktionen, an denen Sie interessiert sind, sind update_option, get_option & wp_insert_post. Sie können die Referenz für jeden von ihnen im WordPress-Codex finden, googeln Sie es einfach. Der Fluss würde so verlaufen

// retrieve the previous date from database
$time = get_option('mylastfeeddate');

// include the code to read the xml file here &
// then the foreach loop as you did in the question
foreach($items as $item) {

    // if the date is < than the date we have in database, get out of the loop
    if( $item->pubDate < $time) break;

    // assign the values in the format of wp_insert_post()
    $out = array();

    // insert the post
    $post_id = wp_insert_post( $out );

}

// update the new date in database to the date of the first item in the loop
update_option( 'mylastfeeddate', $items[0]->pubDate );

UPDATE

Verwenden Sie zum Ausführen des Codes nach einem festgelegten Zeitraum die folgenden WordPress-Cron-Funktionen

if (!wp_next_scheduled('update_feed'))
    wp_schedule_event(current_time('timestamp'), 'hourly', 'update_feed');

add_action('update_feed', 'function_name');
function function_name() {
    // here goes all the code to read the feed
}

ändern Sie hourly zu der Zeit, die Sie möchten. Hier finden Sie die Codex-Referenz http://codex.wordpress.org/Function_Reference/wp_schedule_event

Zum Hinzufügen von benutzerdefinierten Zeitrahmen

add_filter('cron_schedules', 'new_cron_schedules');
function new_cron_schedules($schedules) {
    array_merge($schedules, array('two_hourly' => array( 'interval' => 7200, 'display' => __('Twice Hourly') )));
}

Nach diesem Filter für z. Sie können oben "stündlich" durch "zwei Stunden" ersetzen.

3
Mridul Aggarwal