我知道插件Advanced Custom Field 确实如此。正在检查its code, 我看到他使用jQuery处理这个问题。作为参考,我认为这应该对您有用:
/*
* 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;
}