问题描述
设置 WP 多站点实例 – 客户端有一个现有的本体/一组类别,他们希望将所有内容分类到整个博客中。此外,愿望是在’network blog’ 级别添加任何新类别并同步到其他博客。
这样做最好的方法是什么?
最佳解决方案
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 个查询 (可能更多) 之间运行 – 取决于数据库的速度,此功能可能需要分块。
-
只有新增的类别是’synced’ 。更新和删除类别不是 (代码将需要修改) 。
-
如果新添加的类别有父级,并且在有问题的多站点博客中找不到父级,则该类别将在没有父级的情况下创建 (只有在安装此功能之前创建父类别时才应用) 。
次佳解决方案
哦,星期日拖延…
https://github.com/maugly/Network-Terminator
-
在网络上批量添加条款
-
您可以选择哪些网站将受到影响
-
适用于自定义分类法
-
不删除
-
不同步
这是我在过去几个小时内完成的工作,现在我没有时间进行更多的测试。无论如何 – 它适合我! 。)
试一试。还实现了一个’test run’ 功能,因此您可以在实际执行某些操作之前检查结果。
更新 – > 截图:
行动前:
试运行后:
上面插入的插件添加了用户界面,但几乎所有重要事情发生在此功能中:
<?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;
} ?>
我会回来再编辑这个更多的信息 (如果需要) 。
它远不完美 (在插件头中看到已知的问题) 。任何反馈赞赏!
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。