设置WP多站点实例-客户端具有现有的本体/类别集,他们希望对整个博客集中的所有内容进行分类。另外,人们希望将任何新类别添加到“网络博客”级别并同步到其他博客。

这样做的最佳方法是什么?

评论

我想将类别分配给全局变量,然后在主题init上导入。

我认为这个问题与在3.0中跨多个博客共享一个分类法相同。但是,这个问题没有得到很好的答案。这是一个有趣的问题,我将提供赏金。

#1 楼

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之间运行每个博客的查询(可能更多)-根据数据库的速度,可能需要对该功能进行分块。
只有新添加的类别才被“同步”。不能更新和删除类​​别(需要修改代码)。
如果新添加的类别有一个父类别,并且在相关的多站点博客中找不到该父类别,则将在没有父类别的情况下创建类别(仅当父类别是在安装此功能之前创建的,才应该是这种情况。


评论


是否有-或可能有-一个这样做的插件?以及编辑和删除?还有一个设置页面,可以选择将其应用于哪些分类法和哪些子站点?

–马库斯·唐宁(Marcus Downing)
2011年4月20日在9:02

实际上,如果我使用您的代码作为编写插件的起点,您会反对吗?

–马库斯·唐宁(Marcus Downing)
2011年4月20日在9:10

没问题-我的回答属于堆栈交换的许可,必须注明出处的CC-Wiki :)

–TheDeadMedic
2011年5月5日15:47



#2 楼

哦,周日拖延...

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


允许批量添加条款
网络
您可以选择将影响哪些站点
使用自定义分类法
不删除
不同步

此这是我在最近几个小时内所做的事情,现在我没有时间进行更多测试。无论如何-它对我有用! 。)

试试看。还实现了“测试运行”功能,因此您可以在实际执行操作之前检查结果。

更新->屏幕截图:

操作前:



测试运行后:



上面链接的插件添加了用户界面,但该功能中几乎所有重要的事情都发生了: br />
        <?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;
    } ?>


我将稍后再编辑此信息并提供更多信息(如果需要)。

尚不完善(请阅读插件头)。
感谢任何反馈!

评论


当人们响应问题创建插件时,我喜欢它!您应该得到赏金!

– Jan Fabry
2011年6月3日18:40

感谢您的支持@Jan Fabry。如果我旁边有人真的觉得这件事有用,我会很高兴。

– Michal Mau
2011年6月3日20:15

github.com/michalmau/Network-Terminator

– nadavkav
2014年1月11日,11:11

#3 楼

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中央分类法

评论


这种方法存在一个大问题:职位和条款之间的关系可能不正确。表格term_relationships包含基于帖子ID和术语ID的此关系。但是总有可能子站点中的帖子具有相同的ID。更改一个帖子的术语可能会对另一个博客中的另一个帖子产生不可预测的影响。

– Anh Tran
13年11月22日在3:58



正确,不应包含term_relationships表。我很早就在插件中发现并修复了该问题,但是从未更新此答案以使其匹配。

–马库斯·唐宁(Marcus Downing)
13年11月22日在9:47

#4 楼

是的,这是可能的。我很早以前就为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