Añadir campos personalizados cuando se seleccionan plantillas específicas

30 oct 2012, 15:06:20
Vistas: 14.1K
Votos: 4

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?

2
Comentarios

Incluso un punto de partida sería bueno, si alguien conoce un hook o dónde podrías encontrar la selección de plantilla actual en una variable en la página de edición de entradas.

Leonard Leonard
30 oct 2012 15:11:20

Han pasado 3 años desde que se hizo esta pregunta, pero quería agregar que ahora Advanced Custom Fields te permite usar campos condicionalmente para plantillas específicas. Así que no es necesario manejarlo tú mismo en código.

Santiago Bendavid Santiago Bendavid
28 ene 2016 21:30:32
Todas las respuestas a la pregunta 1
4
13

¿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.

30 oct 2012 15:32:22
Comentarios

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

Leonard Leonard
30 oct 2012 15:39:25

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 ;)

Leonard Leonard
30 oct 2012 17:55:52

Encantado de ayudar, ¡y bienvenido a WPSE!

Chip Bennett Chip Bennett
31 oct 2012 03:18:33

Normal no es una prioridad y hará que el metabox no se muestre. Por defecto, esa es la prioridad que se debe usar allí. Por lo demás, ¡perfecto! Gracias

Joel Worsham Joel Worsham
7 nov 2014 16:47:09