Multisite

WP permette di gestire un ambiente multisite. In pratica si ha un sito padre e dei siti figli. La cosa comoda è che i files sono in comune quindi css, functions ecc funzionano su tutti i siti della “rete”.

Vediamo come creare un ambiente multisite

<h1>Creazione ambiente</h1>

- Creare un ambiente normale di WP o partire da uno già creato
- Aggiornare i permalink
- Disabilitare tutti i plugin
- Aprire il file config.php
- Aggiungere in fondo, prima del commento /* Finito, interrompere le modifiche! Buon blogging. */, la seguente riga
define( 'WP_ALLOW_MULTISITE', true );

- Salvare e refreshare il backend di wp
- In "impostazioni" >>> "configurazione della rete" compilare i campi richiesti (nome rete e mail admin) e scegliere l'opzione di gestire i siti figli come sottominii.
- Copiare il codice proposto ed incollarlo in wp-config.php e nel .htaccess
- Nel wp-config.php aggiungere poi di seguito le seguenti righe
define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');
define('COOKIEPATH', '');
define('SITECOOKIEPATH', '');<br><br>

- Ottenere una cosa del tipo :
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', 'qrpinternationalcom.artera.org');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');
define('COOKIEPATH', '');
define('SITECOOKIEPATH', '');

<h1>Creazione siti figli</h1>

Una volta loggati di nuovo nel backend in alto sotto la voce "i miei siti >>> gestione network" si potranno gestire

- L'elenco dei siti
- L'elenco dei plugin
- Gli utenti
- I temi
- Altre impostazioni secondarie

Nell'elenco dei siti, cliccare su "Aggiungi nuovo" e compilare i campi proposti. ATTENZIONE : l'indirizzo del sito potrà poi essere cambiato successivamente.

Una volta inserito, sotto "Modifica", si potrà modificarne l'indirizzo, gli utenti, i temi e le impostazioni. Definire ora il vero indirizzo del sito.

 

I siti, avranno però i dati diversi, uno dall’altro. Quindi post, pagine, categorie ecc

Se si volessero utilizzare le stesse taxonomy (categorie) tra i vari siti utilizzare :

/* UTILIZZO DELLE TAXONOMY E DEI TERMS DEL SITO PADRE SUI SITI FIGLI */
function buddydev_change_tax_terms_table() {
    global $wpdb;
    //change terms table to use main site's
    $wpdb->terms = $wpdb->base_prefix . 'terms';
    //change taxonomy table to use main site's taxonomy table
    $wpdb->term_taxonomy = $wpdb->base_prefix . 'term_taxonomy';
    //if you want to use a different sub sites table for sharing, you can replca e$wpdb->vbase_prefix with $wpdb->get_blog_prefix( $blog_id )
}

add_action( 'init', 'buddydev_change_tax_terms_table', 0 );
add_action( 'switch_blog', 'buddydev_change_tax_terms_table', 0 );

Se invece vogliamo stampare un menu che faccia da link ai vari siti figli :

function projects_menu_entry($id, $title, $link_self)
{
    global $blog_id;
    $url = get_home_url($id);
    echo '<li><a href="' . $url . '">' . __( $title,"qrpinternational") . '</a></li>';
}

function projects_menu($link_self = true)
{
    global $wpdb;
    echo "<div class='external-cont-albero-multisite'><div class='cont-albero-multisite clearfix'>";
    echo "<div id='ico-close-country'></div>";
    echo "<div class='title'>".__("Choose your Country","qrpinternational")."</div>";
    echo '<ul class="albero-multisite clearfix">';
    $blogs = $wpdb->get_results("
        SELECT blog_id
        FROM {$wpdb->blogs}
        WHERE site_id = '{$wpdb->siteid}'
        AND spam = '0'
        AND deleted = '0'
        AND archived = '0'
    ");
    $sites = array();
    foreach ($blogs as $blog) {
        $sites[$blog->blog_id] = get_blog_option($blog->blog_id, 'blogname');
    }
    natsort($sites);
    foreach ($sites as $blog_id => $blog_title) {
        projects_menu_entry($blog_id, $blog_title, $link_self);
    }
    echo '</ul></div></div>';
}

add_shortcode('bloglist', function($atts){ projects_menu(true); });

Se poi tulizziamo ACF, bisogna considerare che essendo sempre dati, saranno diversi per ogni sito figlio. Quindi anche la creazione degli stessi deve essere fatta in modo particolare:

  • Creare i custom post type dal sito padre, ricordandosi (perchè il cliente non faccia danni) di nascondere poi la voce del menù
  • Fare export del codice (opzione di ACF tramite bottone nel pannello di ACF)
  • Copiare ed incollare il codice in un file php richiamato da functions.php (vedi esempio sotto)
<?php

// nascondo menu ACF per i siti figli
function remove_acf_menu() {
		remove_menu_page('edit.php?post_type=acf');
	}
add_action( 'admin_menu', 'remove_acf_menu', 999);

/* CUSTOM FIELDS EXPORT */

global $blog_id;
if ($blog_id != -1) {

if(function_exists("register_field_group"))
{

	register_field_group(array (
		'id' => 'acf_custom-fields-downloads',
		'title' => 'Custom fields downloads',
		'fields' => array (
			array (
				'key' => 'field_5714dce9f9013',
				'label' => 'Title',
				'name' => 'qrp_download_title',
				'type' => 'text',
				'default_value' => '',
				'placeholder' => '',
				'prepend' => '',
				'append' => '',
				'formatting' => 'html',
				'maxlength' => '',
			),
			array (
				'key' => 'field_5714dd18f9015',
				'label' => 'Type',
				'name' => 'qrp_download_type',
				'type' => 'select',
				'choices' => array (
					'Catalogue' => __('Catalogue','qrpinternational'),
					'Presentations' => __('Presentations','qrpinternational'),
					'Resources' => __('Resources','qrpinternational'),
					'Templates' => __('Templates','qrpinternational'),
				),
				'default_value' => '',
				'allow_null' => 0,
				'multiple' => 0,
			),
		),
		'location' => array (
			array (
				array (
					'param' => 'post_type',
					'operator' => '==',
					'value' => 'qrpdownloads',
					'order_no' => 0,
					'group_no' => 0,
				),
			),
		),
		'options' => array (
			'position' => 'normal',
			'layout' => 'no_box',
			'hide_on_screen' => array (
			),
		),
		'menu_order' => 0,
	));

}}