Cosa sono i meta box

I meta box sono i blocchi visibili nella schermata di modifica dei post e delle pagine. La loro funzione è quella di permettere all’utente di inserire informazioni aggiuntive al contenuto principale del post.

I metabox possono essere considerati una versione più evoluta dei campi personalizzati.

Per fare qualche esempio, le sezioni pubblica, formato, tags, immagine in evidenza sono tutte metabox.

immagine in evidenza

Lanciamo print_r() della variabile globale $wp_meta_boxes possiamo vedere un elenco di tutti i meta box registrati e come sono strutturati.
Eseguire il codice solo in un sito di test perchè interrompe la visualizzazione normale delle pagine

// functions.php
add_action( 'add_meta_boxes', 'isw_priter_metabox' );

function isw_priter_metabox()
{
			global $wp_meta_boxes;
			echo '<pre>';
			print_r($wp_meta_boxes);
			echo '</pre>';
}

Se visitiamo la pagina http://nostro-sito.it/wp-admin/post-new.php
otteniamo

Array
(
    [post] => Array
        (
            [normal] => Array
                (
                    [core] => Array
                        (
                            [revisionsdiv] => Array
                                (
                                    [id] => revisionsdiv
                                    [title] => Revisioni
                                    [callback] => post_revisions_meta_box
                                    [args] =>
                                )

                            [postexcerpt] => Array
                                (
                                    [id] => postexcerpt
                                    [title] => Riassunto
                                    [callback] => post_excerpt_meta_box
                                    [args] =>
                                )

                            [trackbacksdiv] => Array
                                (
                                    [id] => trackbacksdiv
                                    [title] => Invia trackback
                                    [callback] => post_trackback_meta_box
                                    [args] =>
                                )

                            [postcustom] => Array
                                (
                                    [id] => postcustom
                                    [title] => Campi personalizzati
                                    [callback] => post_custom_meta_box
                                    [args] =>
                                )

                            [commentstatusdiv] => Array
                                (
                                    [id] => commentstatusdiv
                                    [title] => Discussione
                                    [callback] => post_comment_status_meta_box
                                    [args] =>
                                )

                            [commentsdiv] => Array
                                (
                                    [id] => commentsdiv
                                    [title] => Commenti
                                    [callback] => post_comment_meta_box
                                    [args] =>
                                )

                            [slugdiv] => Array
                                (
                                    [id] => slugdiv
                                    [title] => Abbreviazione
                                    [callback] => post_slug_meta_box
                                    [args] =>
                                )

                            [authordiv] => Array
                                (
                                    [id] => authordiv
                                    [title] => Autore
                                    [callback] => post_author_meta_box
                                    [args] =>
                                )

                        )

                )

            [side] => Array
                (
                    [core] => Array
                        (
                            [submitdiv] => Array
                                (
                                    [id] => submitdiv
                                    [title] => Pubblica
                                    [callback] => post_submit_meta_box
                                    [args] => Array
                                        (
                                            [revisions_count] => 5
                                            [revision_id] => 8
                                        )

                                )

                            [formatdiv] => Array
                                (
                                    [id] => formatdiv
                                    [title] => Formato
                                    [callback] => post_format_meta_box
                                    [args] =>
                                )

                            [categorydiv] => Array
                                (
                                    [id] => categorydiv
                                    [title] => Categorie
                                    [callback] => post_categories_meta_box
                                    [args] => Array
                                        (
                                            [taxonomy] => category
                                        )

                                )

                            [tagsdiv-post_tag] => Array
                                (
                                    [id] => tagsdiv-post_tag
                                    [title] => Tag
                                    [callback] => post_tags_meta_box
                                    [args] => Array
                                        (
                                            [taxonomy] => post_tag
                                        )

                                )

                        )

                    [low] => Array
                        (
                            [postimagediv] => Array
                                (
                                    [id] => postimagediv
                                    [title] => Immagine in evidenza
                                    [callback] => post_thumbnail_meta_box
                                    [args] =>
                                )

                            [post-thumbnail-due] => Array
                                (
                                    [id] => post-thumbnail-due
                                    [title] => Immagine in evidenza 2
                                    [callback] => Array
                                        (
                                            [0] => MultiPostThumbnails Object
                                                (
                                                    [label] => Immagine in evidenza 2
                                                    [id] => thumbnail-due
                                                    [post_type] => post
                                                    [priority] => low
                                                    [context] => side
                                                )

                                            [1] => thumbnail_meta_box
                                        )

                                    [args] =>
                                )

                        )

                )

        )

)

Dal contenuto dell’array si può notare che i meta box sono quelli relativi al post-type ‘post’ e sono suddivisi in due gruppi:

normal
Sono i metabox situali al centro della pagina, in conrrispondenza dell’edito di testo. Tra questi troviamo Le revisioni, il riassunto, Invia trackback, Campi personalizzati ecc..

side
Sono situali nella sidebar. Comprendono ad esempio le sezioni Pubblica, Formato, Categorie ecc…

Un’altra cosa che si può notare è che i metabox sono raggruppati in base alla priorità, che stabilisce qualè metabox viene mostrato più in alto (es [core], [low]).

Registrare nuovi metabox

Per aggiungere una nuova meta box personalizzata dobbiamo vedere la funzione add_meta_box() e i suoi parametri

add_meta_box( $id, $title, $callback, $post_type, $context, $priority, $callback_args );
  • $id
    l’ID html del blocco div nella schermata di modifica del post
  • $title
    il tilolo del blocco che contiene il nuovo campo, è visibile all’utente
  • $callback
    il nome della funzione che produce l’html del blocco. Il nome è indicato come stringa oppure all’interno di una classe come array.
    La funzione può accettare due argomenti. Il primo è l’oggetto $post del contenuto che stiamo editando. Il secondo è l’array $metabox passato in $callback_args.
  • $post_type
    il tipo di post (pagina, articoli o altro custom post type) in cui sarà visibile il nuovo blocco. Es ( ‘post’ o ‘page’)
  • $context
    La posizione dove il blocco deve essere mostrato. Possibili valori sono normal, ‘advanced’, ‘side’.
  • $priority
    priorità di visualizzazione all’interno del modulo. Possiamo inserire ‘high’, ‘core’, ‘default’ or ‘low’
  • $callback_args
    Argomenti da passare alla funzione di callback come array (si aggiungono all’oggetto del post)

Esempio: Aggiungiamo un campo per un testo aggiuntivo


function isw_test_metabox()
{

			add_meta_box(
			'isw-testo', // id attributo html
			'Testo aggiuntivo', // titolo del metabox
			'isw_create_html', // funzione di callback che stampa l'html
			'post',  // post type
			'normal',
			'high'
			);

}

add_action( 'add_meta_boxes', 'isw_test_metabox' );

Nella funzione isw_create_html() creiamo l’input html, dopo aver prelevato eventualmente i valori già presenti nel database da inserire come default.


function isw_create_html( $post )
{
       // preleviamo i dati inseriti se esistono per il campo aggiuntivo
       $testo = esc_html( get_post_meta( $post->ID, '_key_testo', true ) );

       // crea campo nascosto
    	wp_nonce_field(__FILE__, 'isw_nonce_field');
       ?>
	       	<tr>
	       		<td>
	       		 	<input type="text" size="100"  name="testo" value="<?php echo $testo; ?>" />
	       		</td>
	       	</tr>

       	<?php 

}

}

Il metabox è ora visibile con il titolo ‘Testo aggiuntivo’.

nuovo-metabox-wordpress

Tuttavia se proviamo a inserire del testo vedremo che non viene salvato assieme agli altri contenuti del post.

È quindi necessario scrivere un’altra funzione che recupera il testo inserito nell’input $_POST[ ‘testo’] e lo registra nel database.
Questa funzione deve essere lanciata nel momento in cui salviamo il post. Per questo motivo viene registrata nell’hook save_post

add_action( 'save_post', 'isw_save_post', 10, 2 );

function isw_save_post( $post_id, $post )
{

	if ( !isset( $_POST['isw_nonce_field'] ) || !wp_verify_nonce( $_POST['isw_nonce_field'], __FILE__ ) )
		return $post_id;

	if ( !current_user_can( 'edit_post' ) )
    return $post_id;

	if (  !$post->post_type == 'post')
		return $post_id;

	$valore_database = get_post_meta( $post->ID, '_key_testo', true );
	$valore_inserito = $_POST[ 'testo' ];

	if (  !$valore_database && $valore_inserito )
		add_post_meta( $post_id, '_key_testo',  $_POST['testo'] );	

	if (  $valore_database && $valore_inserito )
		update_post_meta( $post_id, '_key_testo',  $_POST['testo'] );

	if (  $valore_database && $valore_inserito == '' )
		delete_post_meta( $post_id, '_key_testo' );

}

Come sono salvati i valori nel database

Attraverso le funzioni add_post_meta(), update_post_meta(), delete_post_meta() creaiamo, aggiorniamo o cancelliamo i valori dal database.
Questi valori sono salvati nella tabella wp_postmeta

Per ogni valore aggiunto troviamo i seguenti campi

    • meta_id:
      Id univoco del valore inserito
    • post_id:
      Id del post a cui è associato il valore
    • meta_key:
      una chiave utilizzata per recuperare il valore
    • meta_value:
      Il valore inserito nel metabox

database-postmeta

Recuperare i valori dal database

Fare riferimento alla funzione get_post_meta()

$testo_aggiuntivo = get_post_meta( get_the_ID(), '_key_testo', true );

Per approfondire

How to create custom post meta boxes in wordpress

Function/reference: Add meta boxes


  inStileWeb.com
blog comments powered by Disqus