设置WP多站点实例-客户端具有现有的本体/类别集,他们希望对整个博客集中的所有内容进行分类。同样,人们希望在“网络博客”级别添加任何新类别,并将其同步到其他博客。
最好的方法是什么?
设置WP多站点实例-客户端具有现有的本体/类别集,他们希望对整个博客集中的所有内容进行分类。同样,人们希望在“网络博客”级别添加任何新类别,并将其同步到其他博客。
最好的方法是什么?
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' );
只要在主站点上添加类别,此命令就将运行。一些注意事项/要点;
哦,周日拖延...
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
term_relationships
表不应包括在内。我很早就在插件中发现并修复了该问题,但从未更新此答案以使其匹配。
是的,这是可能的。我很早以前就为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