web-dev-qa-db-fra.com

Comment importer un flux RSS sous forme de publications Wordpress sans doublons?

J'ai une URL de flux XML. J'utilise maintenant ce code pour créer de nouveaux messages de type de publication personnalisés à partir d'un flux RSS dans mon fichier functions.php:

    /*
| -------------------------------------------------------------------
| 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: Avoir mis à jour le code ci-dessus pour passer de simple_xml à simplepie]

[UPDATE2: ont déplacé le code et l'ont enveloppé dans un événement de planification WP comme conseillé par @Mridul ci-dessous]

Je vérifie toujours si mon code fonctionne lorsque le prochain lot de mises à jour de nouvelles arrive. Est-ce que quelqu'un pense que ce code ne fonctionnerait pas pour une raison quelconque?

2
Amit Erandole

Le flux RSS contient tous les éléments dans un ordre déterminé (du plus ancien au plus ancien). Dans ce cas, vous pouvez enregistrer la date et l'heure du dernier message que vous avez créé, en option. Lorsque vous relisez le flux, vous pouvez vérifier le temps précédemment enregistré pour savoir lesquelles des articles du flux sont nouveaux et les insérer. puis mettre à jour l'heure à nouveau

Les fonctions qui vous intéressent sont update_option, get_option & wp_insert_post. Vous pouvez trouver la référence de chacun d’entre eux dans le codex wordpress, il suffit de le rechercher sur Google. Le flux irait comme ça

// 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

Pour que le code soit exécuté après un laps de temps fixe, utilisez les fonctions wordpress cron telles que

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
}

changez hourly au temps que vous aimez ici est la référence du codex http://codex.wordpress.org/Function_Reference/wp_schedule_event

Pour ajouter des délais personnalisés

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

Après ce filtre pour par exemple. vous pouvez remplacer "horaire" ci-dessus par "deux heures"

3
Mridul Aggarwal