достаточно сложная задача, я бы написал небольшой скриптик с подключением к WordPress API читаем тут
http://codex.wordpress.org/Integrating_WordPress_with_Your_Website
далее нуна получить все посты ранее 2011 года
ну тат что-то типа
$my_query = new WP_Query('year=2010');
теперь в $my_query будет массив за 2010 год
далее запускаем цикл и для каждого поста последовательно сначала разрываем все связи в категориях
wp_delete_object_term_relationships($_REQUEST['ID'], array('category'));
далее если надо разрываем все связи с метками
wp_delete_object_term_relationships($_REQUEST['ID'], array('post_tag'));
потом обновляем пост
wp_update_post($post);
в масииве $post функции wp_update_post нужно будет изменить параметр post_category на id новой категории или массив категорий
$post[‘post_category’] = 324;
на нее есть подробная документация смотрите кодекс
Всё-таки моих скромных знаний и умений программирования не хватило для решения. Делал так:
$my_query = new WP_Query('year=2010');
while ($my_query->have_posts()) : $my_query->the_post();
wp_delete_object_term_relationships($post->ID, array('category'));
$post['post_category'] = 103;
wp_update_post($post);
endwhile;
И смотрю print_r($post);
и там нет ни ‘category’, ни ‘post_category’.
Попробуйте плагином http://wordpress.org/extend/plugins/bulk-move/
сначала переместить, потом убрать ненужную категорию
(только предварительно back up)
В этом плагине, нет выбора даты поста. Поэтому не подходит.
В коде плагина есть query
$posts = $my_query->query(array('category__in'=>array($old_cat), 'post_type'=>'post', 'nopaging'=>'true'));
можно добавить в запрос 'year'=>2010
работает, хоть и решение для ленивых.
посмотрел насчет wp_delete_object_term_relationships()
, которой не пользуется плагин.
при использовании функции wp_update_post()
все старые связи записи сохраняются в копии-редакции записи (post revision), если сохранение редакций предварительно не отключено. Так что в базе останется еще несколько тысяч редакций, но удалить их дело несложное.
И ещё имхо. Ввиду больших объемов, я бы эти манипуляции проводил на локальной копии сайта, а затем импортировал уже обновленную версию базы/таблиц.
И смотрю print_r($post); и там нет ни ‘category’, ни ‘post_category’.
их там и не должно быть, и скажу больше они вам даже не нужны!
вы сначала разрываете все связи со всеми категориями wp_delete_object_term_relationships
ну а id категории куда надо переместить все посты уж можно то посмотреть вот ее и указываете дополнительно в $post[‘post_category’] = 103;
кстати если этого не сделать то пост попадет в категорию ==Без рубрики==
так что можно сначала в настройках указать нужную вам рубрику по умолчанию и потом просто каждый пост сделать wp_update_post
vjpo — прав, ревизии желательно отключить