Come implementare campi personalizzati senza utilizzare plugin?
Sto cercando di creare una directory di membri utilizzando un custom post type "members". Conosco come utilizzare il plugin ACF, ma ci sono metodi per associare un campo personalizzato a uno specifico custom post type per avere una semplice casella di input come numero di telefono e indirizzo?
// Aggiungi meta box per i campi personalizzati
function add_member_meta_boxes() {
add_meta_box(
'member_details', // ID univoco
'Dettagli Membro', // Titolo del box
'display_member_meta_box', // Callback function
'members' // Post type
);
}
add_action('add_meta_boxes', 'add_member_meta_boxes');
// Visualizza i campi nel meta box
function display_member_meta_box($post) {
// Recupera i valori esistenti
$phone = get_post_meta($post->ID, '_member_phone', true);
$address = get_post_meta($post->ID, '_member_address', true);
// Campo Nonce per sicurezza
wp_nonce_field('member_meta_box', 'member_meta_box_nonce');
// Campo telefono
echo '<p>';
echo '<label for="member_phone">Telefono:</label>';
echo '<input type="text" id="member_phone" name="member_phone" value="' . esc_attr($phone) . '" />';
echo '</p>';
// Campo indirizzo
echo '<p>';
echo '<label for="member_address">Indirizzo:</label>';
echo '<textarea id="member_address" name="member_address">' . esc_textarea($address) . '</textarea>';
echo '</p>';
}
// Salva i dati dei campi personalizzati
function save_member_meta($post_id) {
// Verifica nonce
if (!isset($_POST['member_meta_box_nonce']) ||
!wp_verify_nonce($_POST['member_meta_box_nonce'], 'member_meta_box')) {
return;
}
// Salva telefono
if (isset($_POST['member_phone'])) {
update_post_meta(
$post_id,
'_member_phone',
sanitize_text_field($_POST['member_phone'])
);
}
// Salva indirizzo
if (isset($_POST['member_address'])) {
update_post_meta(
$post_id,
'_member_address',
sanitize_textarea_field($_POST['member_address'])
);
}
}
add_action('save_post_members', 'save_member_meta');

Se non vuoi utilizzare un plugin, puoi provare a implementare una meta box da associare a quel custom post type. Questo è il codice che utilizzo se voglio aggiungere un semplice campo di input per un determinato post type, nell'esempio seguente assumo che member_post_type sia il tuo post type dichiarato:
function member_add_meta_box() {
//questo aggiungerà la metabox per il post type member
$screens = array( 'member_post_type' );
foreach ( $screens as $screen ) {
add_meta_box(
'member_sectionid',
__( 'Dettagli Membro', 'member_textdomain' ),
'member_meta_box_callback',
$screen
);
}
}
add_action( 'add_meta_boxes', 'member_add_meta_box' );
/**
* Stampa il contenuto della box.
*
* @param WP_Post $post L'oggetto per il post/pagina corrente.
*/
function member_meta_box_callback( $post ) {
// Aggiungi un campo nonce per poterlo verificare in seguito
wp_nonce_field( 'member_save_meta_box_data', 'member_meta_box_nonce' );
/*
* Usa get_post_meta() per recuperare un valore esistente
* dal database e usare il valore per il form.
*/
$value = get_post_meta( $post->ID, '_my_meta_value_key', true );
echo '<label for="member_new_field">';
_e( 'Numero di Telefono', 'member_textdomain' );
echo '</label> ';
echo '<input type="text" id="member_new_field" name="member_new_field" value="' . esc_attr( $value ) . '" size="25" />';
}
/**
* Quando il post viene salvato, salva i nostri dati custom.
*
* @param int $post_id L'ID del post che viene salvato.
*/
function member_save_meta_box_data( $post_id ) {
if ( ! isset( $_POST['member_meta_box_nonce'] ) ) {
return;
}
if ( ! wp_verify_nonce( $_POST['member_meta_box_nonce'], 'member_save_meta_box_data' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Controlla i permessi dell'utente.
if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return;
}
} else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
}
if ( ! isset( $_POST['member_new_field'] ) ) {
return;
}
$my_data = sanitize_text_field( $_POST['member_new_field'] );
update_post_meta( $post_id, '_my_meta_value_key', $my_data );
}
add_action( 'save_post', 'member_save_meta_box_data' );
Risorse aggiuntive per le Metabox di WordPress:
Consulta la documentazione qui

Ho provato ad aggiungere il tuo codice nel file function.php del mio tema e ora ho un nuovo metabox nel mio custom post type. Sai per caso se posso anche controllare l'ordine del metabox per farlo visualizzare per primo o alla fine?

Come ho già detto nei commenti,
I custom field sono già una funzionalità integrata. Devi solo aggiungerne il supporto quando registri il tuo custom post type ;-)
Hai due opzioni qui:
Quando registri il tuo custom post type, aggiungi semplicemente
custom-fields
al parametrosupports
Esempio:
add_action( 'init', 'codex_custom_init' ); function codex_custom_init() { $args = [ 'public' => true, 'label' => 'Libri', 'supports' => ['title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields'] ]; register_post_type( 'book', $args ); }
Puoi semplicemente usare
add_post_type_support()
per aggiungere i custom field al tuo custom post typeEsempio:
add_action( 'init', 'wpcodex_add_custom_fileds_support_for_cpt', 11 ); function wpcodex_add_custom_fileds_support_for_cpt() { add_post_type_support( 'cpt', 'custom-fields' ); // Sostituisci cpt con il tuo post type }
