Custom meta box shown when template is chosen

Is this possible to change editor screen immediately after someone picks some template from the drop down?
I need a metabox shown only when page template is page-portfolio.php. I know I can use this code:

$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;

Read More

$template_file = get_post_meta($post_id,'_wp_page_template',TRUE);

And than add my boxes using if statements. The problem is it doesn’t work immediately. Is this even possible without very complex coding to do “catch” moment when user changes templates list without saving?

Related posts

Leave a Reply

1 comment

  1. I know that the plugin Advanced Custom Field does that.
    Checking its code, I saw that he deals with this issue using jQuery.
    Using it as reference, I think this should work for you:

    /* 
     * Change Meta Box visibility according to Page Template
     *
     * Observation: this example swaps the Featured Image meta box visibility
     *
     * Usage:
     * - adjust $('#postimagediv') to your meta box
     * - change 'page-portfolio.php' to your template's filename
     * - remove the console.log outputs
     */
    
    add_action('admin_head', 'wpse_50092_script_enqueuer');
    
    function wpse_50092_script_enqueuer() {
        global $current_screen;
        if('page' != $current_screen->id) return;
    
        echo <<<HTML
            <script type="text/javascript">
            jQuery(document).ready( function($) {
    
                /**
                 * Adjust visibility of the meta box at startup
                */
                if($('#page_template').val() == 'page-portfolio.php') {
                    // show the meta box
                    $('#postimagediv').show();
                } else {
                    // hide your meta box
                    $('#postimagediv').hide();
                }
    
                // Debug only
                // - outputs the template filename
                // - checking for console existance to avoid js errors in non-compliant browsers
                if (typeof console == "object") 
                    console.log ('default value = ' + $('#page_template').val());
    
                /**
                 * Live adjustment of the meta box visibility
                */
                $('#page_template').live('change', function(){
                        if($(this).val() == 'page-portfolio.php') {
                        // show the meta box
                        $('#postimagediv').show();
                    } else {
                        // hide your meta box
                        $('#postimagediv').hide();
                    }
    
                    // Debug only
                    if (typeof console == "object") 
                        console.log ('live change value = ' + $(this).val());
                });                 
            });    
            </script>
    HTML;
    }