¿Cómo implementar campos personalizados sin usar plugins?
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?
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í

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?

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ámetrosupports
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 personalizadoEjemplo:
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 }
