WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

Пакетно перемещаем записи (посты) из одной таксономии в другую (из рубрики в метку)

Сегодня знакомый спросил, - как можно объединить статьи из двух категорий в одну. На что я, понимая всю глубину вопроса, шутя ему ответил, - перенести каждую статью в другую категорию.

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

function kama_change_cat( $change_from, $change_to ){
	global $wpdb;

	$sql = "SELECT p.ID, p.post_title FROM $wpdb->posts p
		JOIN $wpdb->term_relationships rel ON ( p.ID = rel.object_id )
		WHERE rel.term_taxonomy_id = '$change_from'";

	if( ! $posts = $wpdb->get_results( $sql ) )
		return print 'ERROR: Вернулся пустой запрос.';

	echo '<ol>';
	foreach( $posts as $res ){
		$wpdb->query( "UPDATE $wpdb->term_relationships SET term_taxonomy_id = '$change_to' WHERE object_id = '$res->ID'" );
		echo "<li>Обновленна запись с ИД: $res->ID ($res->post_title)</li>";
	}
	echo '</ol>';

}

Разместите этот код куда-нибудь, а затем вызовите функцию так:

<?php kama_change_cat( 1, 8 ); ?>

где вместо 1 и 8 необходимо указать ID категорий: откуда (1) и куда (8) нужно перемещать. Перед этим обязательно сделайте бэкап базы данных! Мало ли что...

Для тех, кто в танке, но нужен такой прием
  1. Открываем файл шаблона footer.php туда в самый низ подряд вставляем функцию и её вызов. Сохраняем footer.php. Идем на сайт и обновляем любую страницу. После обновления в самом низу (в футере) будет видно, какие записи были перенесены.

  2. Опять открываем footer.php и удаляем все, что только что туда было добавлено (функцию и её вызов).

  3. Радуемся smile

Второй вариант

Чтобы изменить тип записи, скажем, сделать из записей постоянные страницы или запись произвольного типа, можно использовать специальную функцию set_post_type().

А чтобы переместить записи из одной таксономии в другую, можно воспользоваться функцией wp_set_post_terms( $post_ID, $tags, $taxonomy, $append ). Здесь при перемещении мы указываем:

  • ID записи ($post_ID);

  • название элементов таксономии, куда будем перемещать ($tags);

  • название таксономии, куда будем перемещать ($taxonomy);

  • как перемещать: true значит оставить в текущих элементах таксономии и дополнить к указанным, false удалить из текущих и добавить в указанные ($append);

Например, переместим посты с ID: 5 и 10, которые находятся в таксономии "tax1" в таксономию "tax2" (в указанные элементы этой таксономии с ID 45 и  5):

$posts = array(5,10);
foreach( $posts as $post_id ){
	if( wp_set_post_terms( $post_id, array(45, 5), "tax2", false ) ){
		echo "Перемещено";
	}
}

Плагин

В комментариях предложили для перемещения статей из одной категории в другую или массового удаления, использовать плагин Bulk Move.

16 комментов
Полезные 2 Вопросы 1 Все
  • @ Артём

    Привет, по скольку я не очень силён в MySQL, хотелось бы узнать как будет выглядит функция, если я перемещаю в другой каталог только определенные посты а не все посты из категории...

    <?php kama_change_cat (откуда, куда, id поста); ?>
    Ответить7.8 лет назад #
  • Михаил gomelcity.net

    Эта функция будет работать для версии 3.3.1?
    Еще момент, Функция перенесет запланированные записи или только опубликованные?

    А то блин с прогой одной накасячел laugh и теперь у меня 100500 одинаковых рубрик.

    Ответить7.5 лет назад #
    • Kama7540

      Точно не могу утверждать, но вроде, все должно работать и под 3.3.1

      Ответить7.5 лет назад #
  • Андрей

    А не подскажешь, допустим у меня есть 2 рубрики, как мне вывести на отдельной странице только то, что входит и в первую рубрику и во вторую?

    Заранее спасибо.

    Ответить7.3 лет назад #
  • Denis

    Все понял, все сделал, но получил ответ "Ошибка! Вернулся пустой запрос. "
    WP 3.5.1
    Блин, а функция очень крутая

    Ответить6.1 лет назад #
    • Denis

      Вот нашел такой очень простой и удобный плагин _http://wordpress.org/plugins/bulk-move/
      Кстати в рунете нет ответа на вопрос как перенести большое количество записей из одной рубрики в другую, решение нашел в wordpress.org через поиск)

      Ответить6.1 лет назад #
  • Серега dtp-profi.ru/page19.html

    Проблема еще и в поисковиках, изменится адрес страницы, а значит куча ошибок у поисковика, что не есть хорошо, придется посидеть деля редиректы, чтобы не потерять ссылки.

    Ответить4.5 года назад #
    • Kama7540

      Это только в том случае если в ЧПУ есть %category% я как раз по этой причине и по причине лишней нагрузки на сервер, никогда не использую структуру ЧПУ с %category%.

      Ответить4.5 года назад #
  • prostolinux prostolinux.ru

    Подскажите, я хочу перенести почти 100 статей из одной рубрики сайта на другой свой сайт. Перенести не проблема, как сделать редиректы со старых адресов на новые? Не вручную же все вписывать? bad

    Ответить3.9 года назад #
    • Kama7540

      Получите все старые УРЛы, выведите их в формате массива и используйте этот массив для редиректа на новые в новом сайте. Конкретно программирование плз не спрашивайте...

      Ответить3.9 года назад #
  • а как перенести записи если на сайте нарушены скрипты импорта а править их нет смысла так как ситуация не простая с сайом изза классного плагина - проект п яме а осталось только перенести посты со старого на новый (( хотелосб бы sql запросом каким или просто порезать базу но хз как так сделать чтоб норм

    Ответить9 мес назад #
  • Александр1 www.alexzdesign.ru

    Спасибо большое за решение!
    Мне нужно было перетащить старые новости в архив (другую рубрику) и я просто добавил к условию

    WHERE (rel.term_taxonomy_id = '$change') AND (p.post_date < 'ГОД')";
    Ответить8 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться