Intereting Posts
Выполнение моей постоянной структуры? WP_query исключает сообщения в формате Отключить редактор WYSIWYG только при создании страницы API настроек – вход всегда обновляется после проверки HTTPS для каждой страницы, кроме каналов Вывод мультимедийного загрузчика на вход Экран комментариев в бэкэнд, как отключить Quick Edit | Редактировать | История | Спам | для не админов Как записать условный флажок для персонализированного флажка в метаданных с установленным изображением Ограничение сеансов на один IP одновременно Пользовательская циклическая разбивка на WordPress Как удалить «Без рубрики» из сообщений с более чем одной категорией? Подключить модератор комментариев WordPress с помощью плагина bbPress Moderation Функция для установки типа продукта в Woocommerce Отключить ссылку на медиа-файл на мобильных устройствах Как подключить боковую панель через add_action?

Как импортировать RSS-канал в качестве сообщений WordPress без дубликатов?

У меня есть URL-адрес канала XML. Теперь я использую этот код для создания новых пользовательских сообщений Post Type из файла rss в моем файле 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('Ymd 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: обновили код выше, чтобы перейти от simple_xml к использованию simplepie]

[UPDATE2: переместили код и завернули его в WP-расписание, как указано @Mridul ниже]

Я по-прежнему проверяю, работает ли мой код, когда придет очередная партия обновлений новостей. Кто-нибудь думает, что этот код не будет работать по какой-то причине?

RSS-канал содержит все элементы в фиксированном порядке (от самого последнего до самого старого). В этом случае вы можете сохранить дату и время последнего созданного вами сообщения в качестве опции, и когда вы снова прочтете фид, вы можете проверить время, ранее сохраненное, чтобы узнать, какие из записей в фиде являются новыми и вставлять их, затем обновить время снова

Функции, которые вас интересуют, – update_option , get_option & wp_insert_post . Вы можете найти ссылку для каждого из них в wordpress codex, просто пойдите в Google. Поток будет идти так

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

ОБНОВИТЬ

Для выполнения кода после некоторого фиксированного временного интервала используйте функции 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'