Is it possible to use a global taxonomy across a multi-site network?

Hi..

I've created a custom post type (portfolio), and a custom taxonomy (portfolio_type) using CustomPress. This works perfect across the entire network...

Then I would like to set the portfolio types on a global level. This means I set the types (Photography, Art, Design, Architecture, etc.), and the end-user can't add new types themselves.
The portfolio types have to be the same across the network, and therefore managed in one place..

Is this possible..?

Any advice is greatly appreciated...

  • Hjalde Markvad

    Hi..

    Hmm, the way I understand it, you are talking about the custom taxonomies, but thats working fine.. I already using the settings you are talking about..

    I would like to set the individual taxonomy items on a global level. Not the custom taxonomy itself, but the items of that taxonomy..

    If it was the default wordpress categories, I would like to set a global set of values (the default one is Uncategorized), to use across the network..

    Hope this makes it more understandable...

  • Hjalde Markvad

    If anyone can use it, this is the plugin code:

    <?php
    /*
    Plugin Name: Hm - Taxonomy Sync
    Plugin URI: http://markvad.com
    Description: Sync taxonomy across network
    Version: 1.0
    Author: Hjalde
    Author URI: http://markvad.com
    Tags: Taxonomy sync
    */
    
    // Taxonomies
    $taxonomies_to_sync = array( 'portfolio_type' ); // Change These!
    
    function ms_taxonomy_sync_add_menu() {
        add_submenu_page( 'index.php', __('Taxonomy Sync'), __('Taxonomy Sync'), 'manage-options', 'ms-taxonomy-sync-'.basename(__FILE__), 'ms_taxonomy_sync_page');
    }
    add_action('network_admin_menu', 'ms_taxonomy_sync_add_menu');
    
    function ms_taxonomy_sync_page() {
    
        if ( !current_user_can('manage_options') )
            wp_die( __('You do not have sufficient permissions to access this page.') );
    
        $ms_taxonomy_sync = 'ms-taxonomy-sync';
    
        if ( isset($_POST[ $ms_taxonomy_sync ]) && $_POST[ $ms_taxonomy_sync ] == '1' ) {
            ms_taxonomy_sync(); ?>
            <div class="updated"><p><strong><?php _e('Taxonomy synchronization completed.'); ?></strong></p></div>
        <?php }
    
        echo '<div class="wrap">';
        echo '<h2>' . __( 'Sync Taxonomies Across Network') . '</h2>';
        ?>
    
        <form name="ms-taxonomy-sync" method="post" action="">
        <input type="hidden" name="<?php echo $ms_taxonomy_sync; ?>" value="1">
        <p class="submit">
        <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Sync Taxonomies') ?>" />
        </p>
        </form>
    
        <?php
        echo '</div>';
    }
    
    // Taxonomy Sync
    function ms_taxonomy_sync() {
    
        // Globals
        global $wpdb;
        global $switched;
        global $current_site;
        global $taxonomies_to_sync;
    
        // Master Site?
        if ($current_site->id == 1) :
    
            foreach ($taxonomies_to_sync as $taxonomy_to_sync) :
    
                // Get Master Taxonomies
                $query = "SELECT * FROM ".$wpdb->prefix."terms a, ".$wpdb->prefix."term_taxonomy b where a.term_id = b.term_id and b.taxonomy = '".$taxonomy_to_sync."'";
                $mastertaxonomies = $wpdb->get_results($query);
                //print_r($mastertaxonomies); echo '<br /><br />'; // For Debugging
    
                // Get An Array of Slugs
                $masterslugs = array();
                foreach ($mastertaxonomies as $mastertaxonomy) :
                    $masterslugs[] = $mastertaxonomy->slug;
                endforeach;
    
                // Query Sites in Network
                $query = $wpdb->prepare("select blog_id from $wpdb->blogs");
                $sites = $wpdb->get_results($query);
    
                // Use This Later
                $childrentaxonomies = array();
    
                // For Each Site
                foreach ($sites as $site) :
                    // Skip Master Site
                    if ($site->blog_id != 1) :
                        // Switch
                        switch_to_blog($site->blog_id);
                        // Get Taxonomies
                        $query = "SELECT * FROM ".$wpdb->prefix."terms a, ".$wpdb->prefix."term_taxonomy b where a.term_id = b.term_id and b.taxonomy = '".$taxonomy_to_sync."'";
                        $taxonomies = $wpdb->get_results($query);
                        //print_r($taxonomies); echo '<br /><br />'; // For Debugging
                        // If a Taxonomy shouldn't be here, delete it
                        foreach ($taxonomies as $key => $taxonomy) :
                            if (!in_array($taxonomy->slug, $masterslugs)) :
                                wp_delete_term( $taxonomy->term_id, $taxonomy_to_sync );
                            endif;
                        endforeach;
                        $query = "SELECT * FROM ".$wpdb->prefix."terms a, ".$wpdb->prefix."term_taxonomy b where a.term_id = b.term_id and b.taxonomy = '".$taxonomy_to_sync."'";
                        $taxonomies = $wpdb->get_results($query);
                        //print_r($taxonomies); echo '<br /><br />'; // For Debugging
                        // Updated Array of Slugs
                        $updatedslugs = array();
                        foreach ($taxonomies as $taxonomy) :
                            $updatedslugs[] = $taxonomy->slug;
                        endforeach;
                        // If a Taxonomy needs to be here, add it
                        foreach ($mastertaxonomies as $key => $mastertaxonomy) :
                            if (!in_array($mastertaxonomy->slug, $updatedslugs)) :
                                // Does this Taxonomy have a parent?
                                if ($mastertaxonomy->parent == 0) :
                                    $term = wp_insert_term($mastertaxonomy->name, $taxonomy_to_sync, array('description' => $mastertaxonomy->taxonomy_description, 'slug' => $mastertaxonomy->slug, 'parent' => '0'));
                                // Let's come back to this and go through the rest so we get ALL parent ID's
                                else :
                                    foreach ($mastertaxonomies as $i => $tax) :
                                        if ($mastertaxonomy->parent == $tax->term_id) :
                                            $parenttaxslug = $mastertaxonomies[$i]->slug;
                                            $childrentaxonomies[] = array('name' => $mastertaxonomy->name, 'description' => $mastertaxonomy->taxonomy_description, 'slug' => $mastertaxonomy->slug, 'parent_slug' => $parenttaxslug);
                                        endif;
                                    endforeach;
                                endif;
                            endif;
                        endforeach;
                        $query = "SELECT * FROM ".$wpdb->prefix."terms a, ".$wpdb->prefix."term_taxonomy b where a.term_id = b.term_id and b.taxonomy = '".$taxonomy_to_sync."'";
                        $taxonomies = $wpdb->get_results($query);
                        //print_r($taxonomies); echo '<br /><br />'; // For Debugging
                        // Now we can deal with the child taxonomies
                        if ($childrentaxonomies) :
                            foreach ($childrentaxonomies as $key => $childtaxonomy) :
                                foreach ($taxonomies as $i => $tax) :
                                    if ($childtaxonomy['parent_slug'] == $tax->slug) :
                                        $childtaxonomyparent = $taxonomies[$i]->term_id;
                                        if ($childtaxonomyparent) :
                                            // Insert Child Taxonomy
                                            $term = wp_insert_term($childtaxonomy['name'], $taxonomy_to_sync, array('description' => $childtaxonomy['description'], 'slug' => $childtaxonomy['slug'], 'parent' => $childtaxonomyparent));
                                        endif;
                                    endif;
                                endforeach;
                            endforeach;
                        endif;
                        // Restore
                        restore_current_blog();
                    endif;
                endforeach;
                // Clear Term Cache For Each Site
                foreach ($sites as $site) :
                    // Skip Master Site
                    if ($site->blog_id != 1) :
                        // Switch
                        switch_to_blog($site->blog_id);
                        $query = "SELECT * FROM ".$wpdb->prefix."terms a, ".$wpdb->prefix."term_taxonomy b where a.term_id = b.term_id and b.taxonomy = '".$taxonomy_to_sync."'";
                        $taxonomies = $wpdb->get_results($query);
                        foreach ($taxonomies as $tax) :
                            ms_taxonomy_sync_clean_term_cache($tax->term_id, $taxonomy_to_sync, true, true);
                        endforeach;
                        restore_current_blog();
                    endif;
                endforeach; 
    
            // End For Each Taxonomy
            endforeach;
    
        endif;
    }
    
    // Debug
    function ms_taxonomy_sync_debug() {
        if (isset($_GET['ms_taxonomy_sync_debug'])) :
            ms_taxonomy_sync();
        endif;
    }
    add_action( 'admin_init', 'ms_taxonomy_sync_debug' );
    
    function ms_taxonomy_sync_clean_term_cache($ids, $taxonomy = '', $clean_taxonomy = true, $force_clean_taxonomy = false) {
        global $wpdb;
        static $cleaned = array();
    
        if ( !is_array($ids) )
            $ids = array($ids);
    
        $taxonomies = array();
        // If no taxonomy, assume tt_ids.
        if ( empty($taxonomy) ) {
            $tt_ids = array_map('intval', $ids);
            $tt_ids = implode(', ', $tt_ids);
            $terms = $wpdb->get_results("SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)");
            $ids = array();
            foreach ( (array) $terms as $term ) {
                $taxonomies[] = $term->taxonomy;
                $ids[] = $term->term_id;
                wp_cache_delete($term->term_id, $term->taxonomy);
            }
            $taxonomies = array_unique($taxonomies);
        } else {
            $taxonomies = array($taxonomy);
            foreach ( $taxonomies as $taxonomy ) {
                foreach ( $ids as $id ) {
                    wp_cache_delete($id, $taxonomy);
                }
            }
        }
    
        foreach ( $taxonomies as $taxonomy ) {
            if ( isset($cleaned[$taxonomy]) && ! $force_clean_taxonomy )
                continue;
            $cleaned[$taxonomy] = true;
    
            if ( $clean_taxonomy ) {
                wp_cache_delete('all_ids', $taxonomy);
                wp_cache_delete('get', $taxonomy);
    
                // clear get_terms cache
                $cache_keys = wp_cache_get( 'get_terms:cache_keys', 'terms' );
                if ( ! empty( $cache_keys ) ) {
                    foreach ( $cache_keys as $key => $cache_taxonomies ) {
                        if ( in_array( $taxonomy, $cache_taxonomies ) ) {
                            wp_cache_delete( "get_terms:{$key}", 'terms' );
                            unset( $cache_keys[$key] );
                        }
                    }
                } else {
                    $cache_keys = array();
                }
                wp_cache_set( 'get_terms:cache_keys', $cache_keys, 'terms' );
    
                delete_option("{$taxonomy}_children");
                // Regenerate {$taxonomy}_children
                _get_term_hierarchy($taxonomy);
            }
    
            do_action('clean_term_cache', $ids, $taxonomy);
        }
    }

Thank NAME, for their help.

Let NAME know exactly why they deserved these points.

Gift a custom amount of points.