Alternar metabox de administrador según la plantilla de página elegida

18

Me gustaría tener una interfaz de campo personalizada que se muestre solo cuando se asigne una plantilla determinada a una página particular de WordPress.

¿Algunas ideas?

Jonathan Wold
fuente
Si no necesita estar "en vivo" (es decir, cambiar la plantilla de la página no necesita hacer que el metabox aparezca / desaparezca de inmediato) vea esta pregunta relacionada: wordpress.stackexchange.com/questions/48611/…
Stephen Harris
@StephenHarris Gracias por el comentario. Terminé con la clase WPAlchemy MetaBox, que incluye una opción "por plantilla" en la configuración.
Jonathan Wold el

Respuestas:

22

La mejor manera de abordar esta situación es a través de JavaScript. De esa manera, cada vez que cambie el valor seleccionado, puede ocultar / mostrar instantáneamente el metabox relacionado.

Utilizar wp_enqueue_script()en functions.phpcargar un archivo JavaScript personalizada en el área de administración:

add_action('admin_enqueue_scripts', 'my_admin_script');
function my_admin_script()
{
    wp_enqueue_script('my-admin', get_bloginfo('template_url').'/my-admin.js', array('jquery'));
}

El script en sí, que requiere jQuery, simplemente oculta o muestra un metabox basado en el valor seleccionado en la lista desplegable de la plantilla de página. En este ejemplo, solo estoy mostrando el metabox para miniaturas de publicaciones en caso de que se seleccione la plantilla de página predeterminada:

(function($){
$(document).ready(function() {

    var $page_template = $('#page_template')
        ,$metabox = $('#postimagediv'); // For example

    $page_template.change(function() {
        if ($(this).val() == 'default') {
            $metabox.show();
        } else {
            $metabox.hide();
        }
    }).change();

});
})(jQuery);

Y, solo por diversión, aquí hay una versión más corta y menos detallada del mismo script:

(function($){
$(function() {

    $('#page_template').change(function() {
        $('#postimagediv').toggle($(this).val() == 'default');
    }).change();

});
})(jQuery);
Geert
fuente
¡Wow gracias! Pronto le daré una prueba a esto y le informaré en consecuencia.
Jonathan Wold
Tan increíble ... esto es justo lo que necesitaba. Funcionó perfecto para mí. ¡¡¡Gracias!!!
Ross
Lo siento, pero soy un verdadero principiante en javascript y sé que lo que hay es lo que necesito, pero parece que no puedo hacer las cosas de la manera correcta ... Así que no estoy seguro de entender qué Tengo que cambiar el archivo javascript. ¿Es posible tener más explicaciones para un nooby como yo? ;)
1

En lugar de representar el metabox solo para ocultarlo con jQuery, puede usar esto. La única diferencia es que ocultar / mostrar el metabox requiere seleccionar 'Actualizar' después de cambiar el campo desplegable.

function add_meta_box() {
    global $post;
    if(!empty($post)) {
        $pageTemplate = get_post_meta($post->ID, '_wp_page_template', true);

        if($pageTemplate == 'your-page-template-here.php' ) {
            add_meta_box( $id, $title, $callback, 'page', $context, $priority, $callback_args );
        }
    }
}
add_action( 'add_meta_boxes', 'add_meta_box' );

Simplemente actualice las líneas 6 y 7 según lo desee.

davidcondrey
fuente