WordPress Multisite – глобальные категории

Настройка многоузлового экземпляра WP – клиент имеет существующую онтологию / набор категорий, которые они хотят классифицировать весь контент во множестве блогов. Также желание состоит в том, что любые новые категории будут добавлены на уровне сетевого блога и синхронизированы с другими блогами.

Каков наилучший способ сделать это?

Solutions Collecting From Web of "WordPress Multisite – глобальные категории"

function __add_global_categories( $term_id ) { if ( get_current_blog_id() !== BLOG_ID_CURRENT_SITE || ( !$term = get_term( $term_id, 'category' ) ) ) return $term_id; // bail if ( !$term->parent || ( !$parent = get_term( $term->parent, 'category' ) ) ) $parent = null; global $wpdb; $blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}'" ); foreach ( $blogs as $blog ) { $wpdb->set_blog_id( $blog ); if ( $parent && ( $_parent = get_term_by( 'slug', $parent->slug, 'category' ) ) ) $_parent_ID = $_parent->term_id; else $_parent_ID = 0; wp_insert_term( $term->name, 'category', array( 'slug' => $term->slug, 'parent' => $_parent_ID, 'description' => $term->description )); } $wpdb->set_blog_id( BLOG_ID_CURRENT_SITE ); } add_action( 'created_category', '__add_global_categories' ); 

Это будет выполняться всякий раз, когда категория добавляется на основной сайт. Несколько оговорок / очков, о которых стоит упомянуть;

  • Если у вас много блогов, эта функция может стать довольно интенсивной.
  • В среднем, мы работаем от 5 до 8 запросов (возможно, больше) в блоге – в зависимости от скорости вашей базы данных, эту функцию, возможно, нужно будет разбить.
  • Только новые категории «синхронизируются». Обновление и удаление категорий не являются (код необходимо будет пересмотреть).
  • Если недавно добавленная категория имеет родителя, а родительский элемент не может быть найден в многосайтовом блоге, вопрос будет создан без родителя (это должно быть только в том случае, если родительская категория была создана до того, как эта функция была установлена).

О, воскресное промедление …

https://github.com/maugly/Network-Terminator

  • В дополнение к количеству добавляйте термины по сети
  • Вы можете выбрать, какие сайты будут затронуты
  • Работает с пользовательскими таксономиями
  • Не удаляет
  • Не синхронизирует

Это то, что я сделал за последние несколько часов, и у меня нет времени на большее тестирование. В любом случае – это работает для меня! .)

Попробуйте. Также есть функция «тестового прогона», поэтому вы можете проверить результат, прежде чем что-то делать.

Обновление -> Скриншоты:

Перед действием:

Перед действием

После пробного прогона:

После пробного прогона

Плагин, связанный выше, добавляет пользовательский интерфейс, но в значительной степени это происходит в этой функции:

  <?php function mau_add_network_terms($terms_to_add, $siteids, $testrun = false) { // check if this is multisite install if ( !is_multisite() ) return 'This is not a multisite WordPress installation.'; // very basic input check if ( empty($terms_to_add) || empty($siteids) || !is_array($terms_to_add) || !is_array($siteids) ) return 'Nah, I eat only arrays!'; if ($testrun) $log = '<p><em>No need to get excited. This is just a test run.</em></p>'; else $log = ''; // loop thru blogs foreach ($siteids as $blog_id) : switch_to_blog( absint($blog_id) ); $log .= '<h4>'.get_blog_details( $blog_id )->blogname.':</h4>'; $log .= '<ul id="ntlog">'; // loop thru taxonomies foreach ( $terms_to_add as $taxonomy => $terms ) { // check if taxonomy exists if ( taxonomy_exists($taxonomy) ) { // get taxonomy name $tax_name = get_taxonomy($taxonomy); $tax_name = $tax_name->labels->name; //loop thru terms foreach ( $terms as $term ) { // check if term exists if ( term_exists($term, $taxonomy) ) { $log .= "<li class='notice' ><em>$term already exists in the $tax_name taxonomy - not added!</em></li>"; } else { // if it doesn't exist insert the $term to $taxonomy $term = strip_tags($term); $taxonomy = strip_tags($taxonomy); if (!$testrun) wp_insert_term( $term, $taxonomy ); $log .= "<li><b>$term</b> successfully added to the <b>$tax_name</b> taxonomy</li>"; } } } else { // tell our log that taxonomy doesn't exists $log .= "<li class='notice'><em>The $tax_name taxonomy doesn't exist! Skipping...</em></li>"; } } $log .= '</ul>'; // we're done here restore_current_blog(); endforeach; if ($testrun) $log .= '<p><em>No need to get excited. This was just the test run.</em></p>'; return $log; } ?> 

Я вернусь и отредактирую это позже с дополнительной информацией (при необходимости).

Он далек от совершенства (читайте известные проблемы в головке плагина).
Любые отзывы оценены!

Ответ TheDeadMedic выглядит неплохо, но я решил использовать другой подход к проблеме. Вместо того, чтобы дублировать одни и те же термины на многих сайтах, я вместо этого использовал другие сайты для использования таблиц исходного сайта.

 add_action('init', 'central_taxonomies'); function central_taxonomies () { global $wpdb; $wpdb->terms = "wp_terms"; $wpdb->term_taxonomy = "wp_term_taxonomy"; } 

Это заменяет имя таблицы wp_2_terms на wp_terms и т. Д. Вы должны, конечно, проверить свою базу данных, чтобы убедиться в точном имени таблиц, которые могут отличаться, если вы измените свой префикс.

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

  • Он активен только на дочерних сайтах, на которых активирован плагин. Невозможно обеспечить это с родительского сайта.
  • Это относится ко всем таксономии, а не только к избранным.

Этот подход является гибким – его можно адаптировать для вытягивания категорий из любого блога, а не только из центрального.


Обновление: я сделал это в плагин, который можно активировать на сайте, если вам это нужно: MU Central Taxonomies

Да, это возможно. Я построил такой плагин для WPMU давным-давно (http://natureofmind.org/30/default-categories-for-new-blogs/, но больше не поддерживается) более современными будут следующие два плагина: http : //wordpress.org/extend/plugins/wpmu-new-blog-defaults/ и http://premium.wpmudev.org/project/new-blog-template