WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

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

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 Все