web-dev-qa-db-ja.com

重複しないようにRSSフィードをWordpressの投稿としてインポートする方法を教えてください。

私は今私のfunctions.phpファイルのRSSフィードから新しいカスタム投稿タイプの投稿を作成するためにこのコードを使っているXMLフィードURLを持っています:

    /*
| -------------------------------------------------------------------
| 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() );
}

[更新:上記のコードをsimple_xmlからsimplepieの使用に移行するように更新しました]

[UPDATE2:以下の@Mridulのアドバイスに従って、コードを移動してWP scheduleイベントにラップしました]

次のニュースの更新が届いたときにコードが機能するかどうかをまだ確認しています。何らかの理由でこのコードが機能しないと思われる人はいますか?

2
Amit Erandole

RSSフィードには、すべてのアイテムが決まった順序(最新のものから古いものの順)に並んでいます。この場合は、最後に作成した投稿の日付と時刻をオプションとして保存することができます。また、フィードをもう一度読むときに、以前に保存した時刻を確認して、フィード内の投稿を確認できます。それからもう一度時間を更新する

あなたが興味を持っている関数はupdate_optionget_optionwp_insert_postです。あなたはそれをグーグルだけで、ワードプレスコーデックスのそれらのそれぞれのための参照を見つけることができます。流れはこのようになります

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

一定の時間枠の後にコードを実行させるには、次のようなwordpressのcron関数を使用します。

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
}

hourlyをここで好きな時間に変更してください http://codex.wordpress.org/Function_Reference/wp_schedule_event

カスタムタイムフレームを追加するため

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

このフィルタの後に例えば。上記の 'hourly'を 'two_hourly'に置き換えることができます。

3
Mridul Aggarwal