Intereting Posts
Включить файлы сценариев для подменю admin Регистрация пользователя в настоящее время не разрешена включить постоянные ссылки в окне хостинга Как установить путь к изображению вместо alt в media.php? WordPress и Git – Какие папки я должен отслеживать? $ wpdb и MySQL Create Trigger Показать последние сообщения из одной категории на сайте, не принадлежащем WP Условные теги или несколько файлов Аргумент 'exclude' не работает с get_posts для настраиваемого типа сообщения Установить изображение для архивных шаблонов Скрыть редактор с определенным значением метаданных Как изменить цвет фона моего заголовка динамически на основе значения цвета пользовательских сообщений? Как я могу поместить массив как переменную в shortcode_atts? Категории раскрывающегося списка WP, отображать подкатегории, но не категории внуков? Параметр смещения WordPress WP_Query не работает с параметром поиска

Миграция иерархических таксономических категорий между типами сообщений

Я переношу около 500 сообщений (на самом деле, продуктов WooCommerce) на новый тип пользовательской публикации (с использованием плагина Convert Post Types) и вы также хотите перенести категории.

Существует плагин конвертера таксономии, который мигрирует сами категории, но не их иерархии, хотя он говорит, что это будет.

Там также просто работает:

UPDATE wp_term_taxonomy SET taxonomy='project-category' WHERE taxonomy='product_cat'; 

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

Каждая строка, возвращаемая рекурсивным итератором, выглядит примерно так:

 Array ( [term_id] => 39 [description] => Bla bla bla [parent] => 0 [count] => 7 [name] => Security Bars [slug] => security-bars ) 

Но я неясен, где эта информация хочет быть вставлена. Я думаю, что что-то вроде:

 $qry = $wpdb->insert('wp_term_taxonomy', array( 'term_id' => $row['term_id'], 'taxonomy' => 'project-category', 'description' => $row['description'], 'parent' => $parent_id )); 

Но это все еще не дает мне иерархии. Я думаю, это потому, что каждый parent должен быть идентификатором некоторой wp_term_taxonomy я только что создал.

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

Код таким образом:

 class RecursiveCategoryIterator implements RecursiveIterator { const ID_FIELD = 'term_id'; const PARENT_FIELD = 'parent'; private $_data; private $_root; private $_position = 0; public function __construct(array $data, $root_id = 0) { $this->_data = $data; $this->_root = $root_id; } public function valid() { return isset($this->_data[$this->_root][$this->_position]); } public function hasChildren() { $subid = $this->_data[$this->_root][$this->_position][self::ID_FIELD]; return isset($this->_data[$subid]) && is_array($this->_data[$subid]); } public function next() { $this->_position++; } public function current() { return $this->_data[$this->_root][$this->_position]; } public function getChildren() { return new self($this->_data, $this->_data[$this->_root][$this->_position][self::ID_FIELD]); } public function rewind() { $this->_position = 0; } public function key() { return $this->_position; } public static function createFromResult($result) { $menu_array = array(); foreach($result as $row) { $menu_array[$row[self::PARENT_FIELD]][] = $row; } return new self($menu_array); } } 

Функция, которая его использует:

 function migrate_terms() { $sql="SELECT a.term_id,a.description,a.parent,a.count,b.name,b.slug FROM wp_term_taxonomy a INNER JOIN wp_terms b WHERE a.term_id=b.term_id AND a.taxonomy='product_cat'; "; global $wpdb; $result = $wpdb->get_results($sql, ARRAY_A); // always test for failure if($result === false) { die("query failed: ". $wpdb->show_errors() ); } // create the iterator from the result set $wpterms = RecursiveCategoryIterator::createFromResult($result); // Look at it echo "<pre>"; print_r($wpterms); echo "</pre>"; // and import it. //insert_it($wpterms, 0); } 

И «функция, которая выполняет всю грязную работу»:

 function insert_it($iterator, $parent_id = 0) { foreach($iterator as $row) { // insert the row, just edit the query, and don't forget // to escape the values. if you have an insert function, // use it by all means $qry = $wpdb->insert(WHAT GOES HERE?); $status = $wpdb->get_results($qry); if($status === false) { // insert failed - rollback and abort die("hard: " . $wpdb->show_errors() ); } // you need to pass the id of the new row // so the "child rows" have their respective parent $cid = $wpdb->insert_id; // insert the children too if($iterator->hasChildren()) { insert_it($iterator->getChildren(), $cid); } } } // Now we set that function up to execute when the admin_notices action is called add_action( 'admin_notices', 'migrate_terms' ); 

Итак, по крайней мере, здесь есть решение, добавим, что этот плагин, похоже, успешно переносит сообщения, а также категорию и иерархию: https://wordpress.org/plugins/post-type-convertr .

На рабочем сервере мне также понадобилось выполнить следующий SQL-запрос после перехода с плагином Post Type Convertr:

UPDATE wp_term_taxonomy SET taxonomy='project-category' WHERE taxonomy='product_cat';

Не знаю. Извините, это не более полезная информация.