Мультисайт WordPress - глобальные категории
Настройка экземпляра WP с несколькими сайтами - у клиента есть существующая онтология/набор категорий, в которых он хочет классифицировать весь контент в наборе блогов. Также желательно, чтобы любые новые категории добавлялись на уровне "сетевого блога" и синхронизировались с другими блогами.
Как лучше всего это сделать?
4 answers
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
Да, это возможно. Я создал подобный плагин для 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