Añadir campos personalizados cuando se seleccionan plantillas específicas
Estoy intentando hacer cambios en un sitio donde la infraestructura actual no es la mejor, ya que se construyó sobre el sitio anterior en lugar de hacerse desde cero.
Tengo una sección del sitio que necesita sus propios campos personalizados. Esta sección no justifica su propio tipo de publicación, y debido al estado del sitio es extremadamente poco práctico hacerlo de esta manera. Lo que no quiero, por el bien del usuario, es obligarlos a usar los campos personalizados ya que resulta bastante desordenado.
Entonces, ¿cómo puedo añadir campos (como lo harías para un tipo de publicación personalizado) cuando se selecciona una plantilla específica?

¿Puedes hacer eso? ¡Absolutamente! Simplemente necesitas consultar el valor de la clave meta _wp_page_template
del objeto $post
, y actuar en consecuencia. Quizás algo como esto:
// Globalizar $post
global $post;
// Obtener el meta de la plantilla de página
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Si la página actual usa nuestra plantilla
// específica, entonces mostramos nuestro meta personalizado
if ( 'template-foobar.php' == $page_template ) {
// Coloca aquí tu código de meta personalizado específico
}
Ahora, recomendaría usar un meta box personalizado, en lugar de campos personalizados.
Aunque la implementación completa de meta boxes personalizados está ligeramente fuera del alcance de tu pregunta, la respuesta subyacente sigue siendo la misma. Intentaré orientarte en la dirección general, de todos modos. Usarás una combinación de add_meta_box()
, llamada en un callback enganchado a add_meta_boxes-{hook}
, un callback para definir el metabox y un callback para validar/sanitizar y guardar el meta personalizado.
function wpse70958_add_meta_boxes( $post ) {
// Obtener el meta de la plantilla de página
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Si la página actual usa nuestra plantilla
// específica, entonces mostramos nuestro metabox personalizado
if ( 'template-foobar.php' == $page_template ) {
add_meta_box(
'wpse70958-custom-metabox', // ID HTML del metabox
'Meta Especial', // Título del metabox
'wpse70598_page_template_metabox', // nombre del callback
'page', // tipo de post
'side', // contexto (advanced, normal, o side)
'default', // prioridad (high, core, default o low)
);
}
}
// Asegúrate de usar "_" en lugar de "-"
add_action( 'add_meta_boxes_page', 'wpse70958_add_meta_boxes' );
function wpse70598_page_template_metabox() {
// Define los campos del formulario del metabox aquí
}
function wpse70958_save_custom_post_meta() {
// Sanitiza/valida el meta aquí, antes de llamar a update_post_meta()
}
add_action( 'publish_page', 'wpse70958_save_custom_post_meta' );
add_action( 'draft_page', 'wpse70958_save_custom_post_meta' );
add_action( 'future_page', 'wpse70958_save_custom_post_meta' );
Edición
Puede ser mejor envolver toda la llamada a add_meta_box()
en el condicional.

¡Hermoso! Esa respuesta ha superado completamente cualquier respuesta que esperaba. ¡Gracias, eres una leyenda!

Funcionó de maravilla... Me gustaría votar a favor o seleccionarla como respuesta, pero acabo de unirme a esta sección de Stack Exchange, así que espero que mis gracias aquí sean suficientes ;)
