WP: Creare un plugin per salvare l’albero genealogico

Questo è un piccolo esempio del mio plugin personal per salvare un albero genealogico usando le funzioni di base di wordpress.

Non è ottimizzato, se avessi voluto avere una versione ottimizzata sarebbe stato meglio creare una cella a posta per le persone con i loro attributi in modo da evitare di salvare tante righe per ogni persona, però come punto di partenza per testare l’efficacia ho deciso di usare il metodo di wordpress, cioè quello di avere tabelle “verticali” (non so se si chiamano così, ma il concetto è che si salvano i dati con una key e un valore di riferimento al Custom Post Type, in modo che si possono espandere senza problemi di spazio, ma solo di problemi di tempo nell’esecuzione delle query sql).

Per creare il Custom Post Type (Link pagina w.org: http://codex.wordpress.org/Function_Reference/register_post_typeb )

Non ho messo le etichette a tutte le componenti, ma solo quelle che mi facevano più comodo.


<?php
add_action( 'init', 'persone_codex_init' );
function persone_codex_init() {
	$labels = array(
	'name' => _x( 'Persone', 'post type general name', 'your-plugin-textdomain' ),
	'singular_name' => _x( 'Persona', 'post type singular name', 'your-plugin-textdomain' ),
	'menu_name' => _x( 'Persone', 'admin menu', 'your-plugin-textdomain' ),
	'name_admin_bar' => _x( 'Persona', 'add new on admin bar', 'your-plugin-textdomain' ),
	'add_new' => _x( 'Add New', 'book', 'your-plugin-textdomain' ),
	'add_new_item' => __( 'Aggiungi nuova persona', 'your-plugin-textdomain' ),
	'new_item' => __( 'New Persona', 'your-plugin-textdomain' ),
	'edit_item' => __( 'Edit Persona', 'your-plugin-textdomain' ),
	'view_item' => __( 'View Persona', 'your-plugin-textdomain' ),
	'all_items' => __( 'All Persone', 'your-plugin-textdomain' ),
	'search_items' => __( 'Search Persone', 'your-plugin-textdomain' ),
	'parent_item_colon' => __( 'Parent Persone:', 'your-plugin-textdomain' ),
	'not_found' => __( 'No Persone found.', 'your-plugin-textdomain' ),
	'not_found_in_trash' => __( 'No Persone found in Trash.', 'your-plugin-textdomain' )
	);
$args = array(
	'labels' => $labels,
	'description' => __( 'Description.', 'your-plugin-textdomain' ),
	'public' => true,
	'publicly_queryable' => true,
	'show_ui' => true,
	'show_in_menu' => true,
	'query_var' => true,
	'rewrite' => array( 'slug' => 'Persona' ),
	'capability_type' => 'post',
	'has_archive' => true,
	'hierarchical' => false,
	'menu_position' => null,
	//'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) array( 'title')
	'supports' => false
	);
register_post_type( 'Persona', $args );
}

Dopo aver creato il Custom Post Type, ho creato i meta_box per visualizzare nel momento dell’inserimento dei campi personalizzati per questo plugin, partendo semplicemente da Nome, Cognome, Padre e Madre.

Per prendere i valori del post, usando i meta del post, uso get_post_meta


function Generalità_meta_box_markup($post)
{
?>
<div>
<label for="meta-box-nome">Nome</label>
<input name="meta-box-nome" id="meta-box-nome" type="text" value="<?php echo get_post_meta($post->ID, "meta-box-nome",true) ; ?>">
<label for="meta-box-cognome">Cognome</label>
<input name="meta-box-cognome" type="text" value="<?php echo get_post_meta($post->ID, "meta-box-cognome",true); ?>">
<br>
<script>
document.getElementById("meta-box-nome").focus();
</script>
<label for="meta-box-genere">Genere</label>
<select name="meta-box-genere">
<?php
$option_values = array("M"=>"Maschio", "F"=>"Femmina");
foreach($option_values as $key => $value) {
if($key == get_post_meta($post->ID, "meta-box-genere", true)) {
?>
<option selected value="<?php echo $key; ?>"><?php echo $value; ?></option>
<?php
} else {
?>
<option value="<?php echo $key; ?>"><?php echo $value; ?></option>
<?php
}
}
?>
</select>
<br>
<label for="meta-box-select">Madre</label>
<select name="meta-box-madre">
<option value="-1">None</option>
<?php
$args = array(
'post_type' => 'persona',
'numberposts' => -1,
);
$ElencoPersone = get_posts( $args );
foreach ($ElencoPersone as $Persona)
{
$Selected = (get_post_meta($post->ID, "meta-box-madre",true) == $Persona->ID ? "selected" : "");
if($Persona->ID!=$post->ID)
if(get_post_meta($Persona->ID, "meta-box-genere",true)=="F")
echo "<option ".$Selected." value=\"".$Persona->ID."\">". get_post_meta($Persona->ID, "meta-box-cognome",true). " " . get_post_meta($Persona->ID, "meta-box-nome",true). "</option>";
}
?>
</select>
<br>
<label for="meta-box-select">Padre</label>
<select name="meta-box-padre">
<option value="-1">None</option>
<?php
foreach ($ElencoPersone as $Persona)
{
$Selected = (get_post_meta($post->ID, "meta-box-padre",true) == $Persona->ID ? "selected" : "");
if($Persona->ID!=$post->ID)
if(get_post_meta($Persona->ID, "meta-box-genere",true)=="M")
echo "<option ".$Selected." value=\"".$Persona->ID."\">". get_post_meta($Persona->ID, "meta-box-cognome",true). " " . get_post_meta($Persona->ID, "meta-box-nome",true). "</option>";
}
?>
</select>
</div>
<?php
}

A questo punto dopo aver creato i box in cui si visualizzano i dati inseriti o vuoti al momento di un nuovo inserimento si andrà a salvare questi dati nel database, usando le funzioni di wordpress, cioè usando le tabelle di base di wordpress.

Ho aggiunto un codice per modificare il titolo del CPT per evitare di riscrivere tutte le volte il nome e cognome anche per il titolo.

function add_custom_meta_box()
{
add_meta_box("custom-meta-box_0", "Generalità", "Generalità_meta_box_markup", "Persona", "normal");
}
add_action("add_meta_boxes", "add_custom_meta_box");
function save_custom_meta_box($post_id, $post)
{
if(!current_user_can("edit_post", $post_id))
return $post_id;
if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE)
return $post_id;
$slug = "persona"; //Non so il motivo ma è minuscolo e quindi con "Persona" non procedeva
//if($slug != $post->post_type)
if($slug != get_post_type( $post_id ))
return $post_id;
$NameOfBoxToSaves = array("meta-box-nome", "meta-box-cognome", "meta-box-genere", "meta-box-madre" ,"meta-box-padre");
foreach ($NameOfBoxToSaves as $NameOfBoxToSave)
{
$meta_box_value="";
if(isset($_POST[$NameOfBoxToSave]))
$meta_box_value = htmlspecialchars($_POST[$NameOfBoxToSave]);
update_post_meta($post_id, $NameOfBoxToSave, $meta_box_value);
}
$Title="";
if(isset($_POST["meta-box-nome"]))
$Title .= htmlspecialchars($_POST["meta-box-nome"]);
$Title .=" ";
if(isset($_POST["meta-box-cognome"]))
$Title .= htmlspecialchars($_POST["meta-box-cognome"]);
global $wpdb;
$wpdb->update( $wpdb->posts, array( 'post_title' => $Title ), array( 'ID' => $post_id ) );
}
add_action("save_post", "save_custom_meta_box", 10, 2);

Nel prossimo articolo mostro come ho scelto di visualizzare l’albero genealogico.