¿Cómo implementar campos personalizados sin usar plugins?

13 dic 2015, 08:02:49
Vistas: 24.9K
Votos: 3

Estoy tratando de crear un directorio de miembros usando un tipo de publicación personalizada llamada "members". Estoy familiarizado con cómo usar el plugin ACF, pero ¿hay algún método para asociar un campo personalizado a un tipo de publicación específico para tener una caja de entrada simple como número de teléfono y dirección?

2
Comentarios

Los campos personalizados ya son una característica integrada. Solo necesitas agregar soporte para ello cuando registres tu tipo de publicación personalizada ;-)

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

Gracias Pieter, pero ¿hay alguna manera de agregar un código para que no tengamos que seleccionar el campo personalizado cada vez que agregamos una nueva entrada? Primero probaré el código de Carl para ver si funciona

Mac organo Mac organo
14 dic 2015 15:49:38
Todas las respuestas a la pregunta 2
2

Si no deseas utilizar un plugin, puedes intentar implementar un meta box para asociarlo con ese tipo de entrada personalizada. Este es el código que uso si quiero agregar un campo de entrada simple para un cierto tipo de publicación. En el ejemplo a continuación, asumo que member_post_type es tu tipo de publicación declarado:

function member_add_meta_box() {
//esto agregará el metabox para el tipo de publicación member
$screens = array( 'member_post_type' );

foreach ( $screens as $screen ) {

    add_meta_box(
        'member_sectionid',
        __( 'Detalles del Miembro', 'member_textdomain' ),
        'member_meta_box_callback',
        $screen
    );
 }
}
add_action( 'add_meta_boxes', 'member_add_meta_box' );

/**
 * Imprime el contenido del cuadro.
 *
 * @param WP_Post $post El objeto para la publicación/página actual.
 */
function member_meta_box_callback( $post ) {

// Agrega un campo nonce para que podamos verificarlo más tarde.
wp_nonce_field( 'member_save_meta_box_data', 'member_meta_box_nonce' );

/*
 * Usa get_post_meta() para recuperar un valor existente
 * desde la base de datos y usar el valor para el formulario.
 */
$value = get_post_meta( $post->ID, '_my_meta_value_key', true );

echo '<label for="member_new_field">';
_e( 'Número de Teléfono', 'member_textdomain' );
echo '</label> ';
echo '<input type="text" id="member_new_field" name="member_new_field" value="' . esc_attr( $value ) . '" size="25" />';
}

/**
 * Cuando se guarda la publicación, guarda nuestros datos personalizados.
 *
 * @param int $post_id El ID de la publicación que se está guardando.
 */
 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;
 }

 // Verifica los permisos del usuario.
 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' );

Recursos adicionales para los Metaboxes de WordPress:

por favor consulta la documentación aquí

14 dic 2015 15:36:52
Comentarios

Intenté agregar tu código en el functions.php de mi tema y ahora tengo un nuevo metabox en mi tipo de publicación personalizada. ¿Sabrías si también puedo controlar el orden del metabox para que se muestre primero o al final?

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

@Macorgano Sí, puedes hacerlo. El quinto parámetro de add_meta_box indica dónde quieres que aparezca, mientras que el sexto parámetro indica la prioridad.

Realmente deberías consultar la documentación.

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

Como ya mencioné en los comentarios,

Los campos personalizados ya son una función incorporada. Solo necesitas añadir soporte para ello al registrar tu tipo de contenido personalizado ;-)

Tienes dos opciones aquí:

  • Cuando registres tu tipo de contenido personalizado, simplemente añade custom-fields al parámetro supports

    Ejemplo:

    add_action( 'init', 'codex_custom_init' );
    function codex_custom_init() {
        $args = [
          'public' => true,
          'label'  => 'Libros',
          'supports' => ['title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields']
        ];
        register_post_type( 'book', $args );
    }
    
  • Puedes simplemente usar add_post_type_support() para añadir campos personalizados a tu tipo de contenido personalizado

    Ejemplo:

    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' ); // Cambia cpt por tu tipo de contenido
    }
    
14 dic 2015 21:15:54