WordPress Multisite - categorías globales

20

Configuración de una instancia multisitio de WP: el cliente tiene una ontología / conjunto de categorías existentes en las que desea clasificar todo el contenido en el conjunto de blogs. El deseo también es que cualquier categoría nueva se agregue a nivel de 'blog de red' y se sincronice con los otros blogs.

¿Cuál es la mejor manera de hacer esto?

    
pregunta anu 16.03.2011 - 13:09

4 respuestas

13
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' );

Esto se ejecutará cada vez que se agregue una categoría en el sitio principal. Algunas advertencias / puntos que vale la pena mencionar;

  • Si tiene muchos de blogs, esta función puede ser bastante intensiva.
  • En promedio, estamos ejecutando entre 5 a 8 consultas (posiblemente más) por blog . Dependiendo de la velocidad de su base de datos, es posible que esta función deba dividirse.
  • Solo las categorías recién agregadas están 'sincronizadas'. Las categorías de actualización y eliminación no son (el código deberá ser revisado).
  • Si una categoría recién agregada tiene un padre y no se puede encontrar el padre dentro del blog multisitio en cuestión, la categoría se creará sin padre (esto solo debería ser el caso si la categoría padre se creó antes de esta función). instalado).
respondido por el TheDeadMedic 18.03.2011 - 23:47
10

Oh, domingo, dilación ...

enlace

  • Permite agregar términos en masa red
  • Puede seleccionar qué sitios serán afectados
  • Funciona con taxonomías personalizadas
  • No se elimina
  • No se sincroniza

Esto es algo que he hecho en las últimas horas y no tengo tiempo para más pruebas ahora. De todos modos - funciona para mí! .)

Inténtalo. También se implementó una función de "ejecución de prueba" para que pueda verificar el resultado antes de hacer algo.

Actualizar - > Capturas de pantalla:

Antes de la acción:

Despuésdelapruebadeejecución:

El complemento vinculado anteriormente agrega una interfaz de usuario, pero casi todo lo importante sucede en esta función:

        <?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;
    } ?>

Volveré y editaré esto con más información más adelante (si es necesario).

Está lejos de ser perfecto (lea los problemas conocidos en el encabezado del complemento).
Cualquier comentario apreciado!

    
respondido por el Michal Mau 30.05.2011 - 05:19
4

La respuesta de TheDeadMedic se ve bien, pero terminé adoptando un enfoque diferente al problema. En lugar de duplicar los mismos términos en los muchos sitios, en cambio, hice que los otros sitios usaran las tablas del sitio de origen para los términos.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

  $wpdb->terms = "wp_terms";
  $wpdb->term_taxonomy = "wp_term_taxonomy";
}

Esto reemplaza el nombre de la tabla wp_2_terms con wp_terms , etc. Por supuesto, debe revisar su base de datos para asegurarse del nombre exacto de las tablas, que podría ser diferente si cambia su prefijo.

Puede ejecutar esto desde un complemento o un tema (aunque recomiendo un complemento). Es posible que tenga que publicar un complemento para hacer esto en algún momento. Hay dos desventajas de este enfoque:

  • Solo está activo en sitios secundarios que tienen el complemento activado. No hay manera de hacer cumplir esto desde el sitio principal.
  • Se aplica a todas las taxonomías, no solo a las seleccionadas.

Este enfoque es flexible: se puede adaptar para extraer categorías de cualquier blog, no solo el central.

Actualización: He convertido esto en un complemento, que puede activarse en todo el sitio si lo necesita: Taxonomias centrales de MU

    
respondido por el Marcus Downing 06.05.2011 - 12:44
1

Sí, esto es posible. Construí un complemento como este para WPMU hace años (http://natureofmind.org/30/default-categories-for-new-blogs/ pero ya no se admite) más actualizados serían los siguientes dos complementos: < a href="http://wordpress.org/extend/plugins/wpmu-new-blog-defaults/"> enlace y enlace

    
respondido por el dwenaus 01.06.2011 - 10:07

Lea otras preguntas en las etiquetas