Aggiungere una meta box speciale al custom post type
Sono riuscito ad aggiungere una meta box al mio custom post type (vedi codice sotto). Ora ho bisogno di aggiungere un'altra meta box. Con questa box vorrei visualizzare/modificare un valore da un'altra tabella chiamata wp_project_bids_mitglied. Questa tabella contiene una riga con gli ID dei post e una riga con i valori (0,1,2) che vorrei modificare/visualizzare nel mio backend. Come devo modificare il codice per raggiungere questo obiettivo? Grazie!
function add_custom_meta_box() {
add_meta_box(
'custom_meta_box', // $id
'Durata', // $title
'show_custom_meta_box', // $callback
'project', // $page
'normal', // $context
'high'); // $priority
}
add_action('add_meta_boxes', 'add_custom_meta_box');
// Array dei campi
$prefix = 'custom_';
$custom_meta_fields = array(
array(
'label'=> 'Casella di Selezione',
'desc' => 'Specificare la durata dell\'incarico fotografico',
'id' => $prefix.'dauer',
'type' => 'select',
'options' => array (
'one' => array (
'label' => '1-3',
'value' => 'a'
),
'two' => array (
'label' => '3-6',
'value' => 'b'
),
'three' => array (
'label' => '6-9',
'value' => 'c'
),
'four' => array (
'label' => '>9',
'value' => 'd'
)
)
)
);
// La Callback
function show_custom_meta_box() {
global $custom_meta_fields, $post;
// Usa nonce per la verifica
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
// Inizia la tabella dei campi e il ciclo
echo '<table class="form-table">';
foreach ($custom_meta_fields as $field) {
// ottieni il valore di questo campo se esiste per questo post
$meta = get_post_meta($post->ID, $field['id'], true);
// inizia una riga della tabella con
echo '<tr>
<th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
<td>';
switch($field['type']) {
// i case items andranno qui
// testo
case 'select':
echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';
foreach ($field['options'] as $option) {
echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
}
echo '</select><br /><span class="description">'.$field['desc'].'</span>';
break;
} //fine switch
echo '</td></tr>';
} // fine foreach
echo '</table>'; // fine tabella
}
// Salva i Dati
function save_custom_meta($post_id) {
global $custom_meta_fields;
// verifica nonce
if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))
return $post_id;
// controlla autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
return $post_id;
// controlla i permessi
if ('page' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id))
return $post_id;
} elseif (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
// cicla attraverso i campi e salva i dati
foreach ($custom_meta_fields as $field) {
$old = get_post_meta($post_id, $field['id'], true);
$new = $_POST[$field['id']];
if ($new && $new != $old) {
update_post_meta($post_id, $field['id'], $new);
} elseif ('' == $new && $old) {
delete_post_meta($post_id, $field['id'], $old);
}
} // fine foreach
}

L'intero blocco di codice serve a replicare il processo, non a fornire il codice effettivo. Devi capire come il tuo processo può adattarsi a questo scenario. Ho commentato ogni riga possibile, consulta i commenti in linea per una comprensione corretta.
Passo #1
Innanzitutto, la prima parte del tuo codice crea una Custom Meta Box, quindi utilizza questa parte per creare prima la tua meta box:
<?php
//creazione della meta box (Nota: meta box != campo meta personalizzato)
function wpse_add_custom_meta_box_2() {
add_meta_box(
'custom_meta_box-2', // $id
'Durata2', // $title
'show_custom_meta_box_2', // $callback
'project', // $page
'normal', // $context
'high' // $priority
);
}
add_action('add_meta_boxes', 'wpse_add_custom_meta_box_2');
?>
Passo #2
Ora la tua meta box è pronta. Adesso devi creare alcuni campi del Form per ottenere i dati dell'utente, e per questo stiamo utilizzando la funzione $callback
che abbiamo appena dichiarato:
<?php
//mostra i campi del form personalizzati
function show_custom_meta_box_2() {
global $post;
// Usa nonce per la verifica e proteggere l'invio dei dati
wp_nonce_field( basename( __FILE__ ), 'wpse_our_nonce' );
?>
<!-- mio input per il valore personalizzato -->
<input type="number" name="wpse_value" value="">
<?php
}
?>
Passo #3
Al salvataggio del post, i due campi invieranno i valori via post
, ora dobbiamo salvarli dove vogliamo salvarli.
<?php
//ora stiamo salvando i dati
function wpse_save_meta_fields( $post_id ) {
// verifica nonce
if (!isset($_POST['wpse_our_nonce']) || !wp_verify_nonce($_POST['wpse_our_nonce'], basename(__FILE__)))
return 'nonce non verificato';
// controlla autosave
if ( wp_is_post_autosave( $post_id ) )
return 'autosave';
//controlla revisione del post
if ( wp_is_post_revision( $post_id ) )
return 'revisione';
// controlla i permessi
if ( 'project' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) )
return 'non puoi modificare la pagina';
} elseif ( ! current_user_can( 'edit_post', $post_id ) ) {
return 'non puoi modificare il post';
}
//i nostri controlli di base sono fatti, ora possiamo prendere ciò che abbiamo passato dal nostro form appena creato
$wpse_value = $_POST['wpse_value'];
//semplicemente ora dobbiamo salvare i dati
global $wpdb;
$table = $wpdb->base_prefix . 'project_bids_mitglied';
$wpdb->insert(
$table,
array(
'col_post_id' => $post_id, //lo abbiamo di default con questa funzione
'col_value' => intval( $wpse_value ) //supponiamo che stiamo passando un valore numerico
),
array(
'%d', //%s - stringa, %d - intero, %f - float
'%d', //%s - stringa, %d - intero, %f - float
)
);
}
add_action( 'save_post', 'wpse_save_meta_fields' );
add_action( 'new_to_publish', 'wpse_save_meta_fields' );
?>
Dato che stai lavorando con una tabella personalizzata, stiamo utilizzando la classe $wpdb per memorizzare in modo sicuro i dati necessari.
Nota bene, questo non è il codice di cui hai bisogno, è l'idea e il processo che ora puoi utilizzare per modellare il tuo percorso. Ricorda solo due cose:
show_custom_meta_box_2()
è l'area dove si trova il tuo form HTML, tratta questa parte come un semplice form HTML, ewpse_save_meta_fields()
agganciato alle azioni necessarie, salverà i dati del form quando il post viene pubblicato / salvato / aggiornato. Esegui un'adeguata sanitizzazione e validazione qui.
Spero sia utile. Grazie a @toscho per la recente chat. <3
