Configuration d'une instance multisite WP - le client dispose d'une ontologie/d'un ensemble de catégories existant qu'il souhaite classer tout le contenu sur l'ensemble des blogs. Aussi, le souhait est que toute nouvelle catégorie soit ajoutée au niveau du "blog du réseau" et synchronisée avec les autres blogs.
Quelle est la meilleure façon de faire cela?
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' );
Cela fonctionnera chaque fois qu'une catégorie est ajoutée sur le site principal. Quelques mises en garde/points à noter;
_ {Oh, la procrastination du dimanche ...
https://github.com/maugly/Network-Terminator
C’est quelque chose que j’ai fait au cours des dernières heures et je n’ai pas le temps de faire d’autres tests maintenant. En tout cas, ça marche pour moi! .)
Essaie. Une fonctionnalité de test a également été mise en place afin que vous puissiez vérifier le résultat avant de faire quelque chose.
Mise à jour -> Captures d'écran:
Avant l'action:
Après le test:
Le plugin lié ci-dessus ajoute une interface utilisateur, mais pratiquement tout ce qui est important se passe dans cette fonction:
<?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;
} ?>
Je reviendrai et éditer cela avec plus d'informations plus tard (si nécessaire).
Il est loin d'être parfait (lisez les problèmes connus dans la tête du plugin).
Tout commentaire apprécié!
La réponse de TheDeadMedic semble bonne, mais j'ai fini par adopter une approche différente du problème. Au lieu de dupliquer les mêmes termes sur plusieurs sites, j'ai plutôt demandé aux autres sites d'utiliser les tables du site d'origine pour les termes.
add_action('init', 'central_taxonomies');
function central_taxonomies () {
global $wpdb;
$wpdb->terms = "wp_terms";
$wpdb->term_taxonomy = "wp_term_taxonomy";
}
Ceci remplace le nom de la table wp_2_terms
par wp_terms
, etc. Vous devez bien sûr vérifier votre base de données pour vous assurer du nom exact des tables, ce qui pourrait être différent si vous modifiez votre préfixe.
Vous pouvez l'exécuter à partir d'un plugin ou d'un thème (bien que je recommande un plugin). Je pourrai peut-être publier un plugin pour le faire à un moment donné. Cette approche présente deux inconvénients:
Cette approche est flexible - elle peut être adaptée pour extraire des catégories de n'importe quel blog, pas seulement du blog central.
Mise à jour: Je l'ai transformé en un plugin, qui peut être activé à l'échelle du site si vous en avez besoin: Taxonomies centrales de MU
Oui c'est possible. J'ai construit un plugin comme celui-ci pour WPMU il y a bien longtemps (http://natureofmind.org/30/default-categories-for-new-blogs/ mais qui n'est plus pris en charge). Les deux plugins suivants seraient plus à jour: http://wordpress.org/extend/plugins/wpmu-new-blog-defaults/ et http://premium.wpmudev.org/project/new-blog-template