Posts tagged: hack

Personalizzare il pannello di admin dei custom fields in WordPress

wordpress1Come avrei potuto non avere a che fare con WordPress !? Provate un pò a dirmelo….il mitico CMS semplice da usare, gestire e facile da installare. Non ho mai parlato sul blog di wordpress, ne di quanto lo usi a lavoro..Tutti i giorni il caro inkiostro mi riempie sempre di nuovi e mirabolanti problemi da risolvere in wordpress, quindi mi sono fatto una discreta cultura.
Quello di cui volevo parlare è di come fare a rendere più chiara l’organizzazione dei custom field all’interno del pannello di amministrazione di wordpress, raggruppandoli semanticamente all’interno di un riquadro. Per intenderci dalla situazione in figura :

campi-personalizzati-wp2

passare a questa:

Pannello dei custom field 

Vediamo il codice php per realizzare quanto mostrato in figura:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$box_dati_devme =
	array(
	    "titolo" => array(
	    "name" => "titolo",
	    "std" => "",
	    "title" => "Titolo",
	    "description" => ""),
 
	"url" => array(
	    "name" => "url",
	    "std" => "",
	    "title" => "URL",
	    "description" => ""),
 
	"argomento" => array(
	    "name" => "argomento",
	    "std" => "",
	    "title" => "Argomento",
	    "description" => ""));

Primo step: definire una variabile di tipo array in cui il primo elemento ha come chiave il nome del campo custom e come valore, un array che definisce il nome alcuni attributi del campo custom, nome, std, title e description.

1
2
3
4
5
6
7
8
9
10
11
function box_dati_devme_boxes() {
	global $post, $box_dati_devme;
	echo '';
	foreach($box_dati_devme as $meta_box) {
		echo '';
		echo '';
		echo '';
		echo '';
	}
	echo '<table style="width:99%"><tbody><tr><td class="left" style="width:25%;">'; 		$meta_box_value = get_post_meta($post->ID, $meta_box['name'], true); 		if($meta_box_value == "") 			$meta_box_value = $meta_box['std']; 		echo '<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />'; 		echo $meta_box['title']; 		echo '<br />'; 		echo '<label class="desc" style="font-size:10px;" for="'.$meta_box['name'].'_value">'.$meta_box['description'].'</label>'; 		echo '</td><td>'; 		echo '<textarea style="width:99%" rows="2" name="'.$meta_box['name'].'_value">'.$meta_box_value.'</textarea>'; 		echo '</td></tr></tbody></table>';
}

Secondo step: definire una funziona in cui l’unica cosa da fare è aggiungere come variabile globale dopo $post il nome della variabile definita allo step uno e la stessa variabile come iteratore del foreach.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function create_meta_box() {
    global $theme_name;
 
    if ( function_exists('box_dati_devme_boxes') ) {
        add_meta_box('box_dati_devme', 'Boxe DevMe', 'box_dati_devme', 'post', 'normal', 'high');
    }
}
 
function save_postdata( $post_id ) {
	global $post, $box_dati_devme;
 
	foreach($box_dati_devme as $meta_box) {
		if ( !wp_verify_nonce( $_POST[$meta_box['name'].'_noncename'], plugin_basename(__FILE__) )) {
			return $post_id;
		}
		if ( 'page' == $_POST['post_type'] ) {
			if ( !current_user_can( 'edit_page', $post_id ))
				return $post_id;
		} else {
			if ( !current_user_can( 'edit_post', $post_id ))
				return $post_id;
		}
		$data = $_POST[$meta_box['name'].'_value'];
		if(get_post_meta($post_id, $meta_box['name']) == "")
			add_post_meta($post_id, $meta_box['name'], $data, true);
		elseif($data != get_post_meta($post_id, $meta_box['name'], true))
			update_post_meta($post_id, $meta_box['name'], $data);
		elseif($data == "")
			delete_post_meta($post_id, $meta_box['name'], get_post_meta($post_id, $meta_box['name'], true));
	}
}
 
add_action('admin_menu', 'create_meta_box');
add_action('save_post', 'save_postdata');

Terzo step: nell’ultimo step ho racchiuso un pò di cose tutte assieme. Si definiscono 2 funzioni : la create_meta_box e la save_postdata. La prima viene richiamata dal framework di wordpress per creare il riquadro, contestualmente si definiscono il nome del riquadro che comparirà poi in pagine e si aggiunge il riferimento alla variabile definita nello step uno. La funzione save_postdata viene usata da wordpress per effettuare il salvataggio dei custom field inseriti al momento dell’inserimento e della modifica di un post. Infine si registrano le 2 funzioni php con le add_action di wordpress.
E’ chiaro che in presenza di pochi custom field si può procedere anche senza personalizzare il pannello; al contrario, con un centinaio di campi il tutto diviene più chiaro. Consiglio nel caso usiate questa soluzione, di definire la personalizzare dei campi all’interno di un file .php che terrete all’interno del tema che state usando, quindi importarlo all’interno del file function.php.
Prova il generatore qui.
Stay tuned.

WordPress Themes