Come implementare campi personalizzati senza utilizzare plugin?

13 dic 2015, 08:02:49
Visualizzazioni: 24.9K
Voti: 3

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');
2
Commenti

I campi personalizzati sono già una funzionalità integrata. Devi solo aggiungere il supporto quando registri il tuo custom post type ;-)

Pieter Goosen Pieter Goosen
13 dic 2015 08:18:30

Grazie Pieter ma c'è un modo per aggiungere un codice così non dobbiamo selezionare il campo personalizzato per ogni nuovo inserimento? Proverò prima il codice di Carl per vedere se funziona

Mac organo Mac organo
14 dic 2015 15:49:38
Tutte le risposte alla domanda 2
2

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

14 dic 2015 15:36:52
Commenti

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?

Mac organo Mac organo
14 dic 2015 15:56:17

@Macorgano Sì, puoi farlo. Il quinto parametro di add_meta_box indica dove vuoi posizionarlo, mentre il sesto indica la priorità.

Dovresti davvero consultare la documentazione.

Ezra Obiwale Ezra Obiwale
5 giu 2019 09:07:09
0

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 parametro supports

    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 type

    Esempio:

    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
    }
    
14 dic 2015 21:15:54