Duplicate possible:
Basculez metabox admin en fonction du modèle de page choisi
Est-il possible de changer l'écran de l'éditeur immédiatement après que quelqu'un a choisi un modèle dans la liste déroulante? J'ai besoin d'une metabox affichée uniquement lorsque le modèle de page est page-portfolio.php
. Je sais que je peux utiliser ce code:
$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;
$template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
Et que d'ajouter mes boîtes en utilisant des instructions if
. Le problème est que cela ne fonctionne pas immédiatement. Est-ce même possible sans codage très complexe de faire "attraper" le moment où l'utilisateur modifie la liste des modèles sans enregistrer?
Je sais que le plugin Advanced Custom Field fait cela. En vérifiant son code , j'ai vu qu'il traitait ce problème en utilisant jQuery. En l’utilisant comme référence, je pense que cela devrait fonctionner pour vous:
/*
* 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;
}