Bascule la métabox administrative en fonction du modèle de page choisi

16

J'aimerais qu'une interface de champ personnalisée soit affichée uniquement lorsqu'un modèle donné est affecté à une page WordPress particulière.

Des idées?

    
posée Jonathan Wold 24.05.2011 - 17:03

2 réponses

21

La meilleure façon d’aborder cette situation consiste à utiliser JavaScript. De cette façon, chaque fois que la valeur sélectionnée change, vous pouvez instantanément afficher / masquer la métabox associée.

Utilisez wp_enqueue_script() dans functions.php pour charger un fichier JavaScript personnalisé dans la zone d'administration:

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

Le script lui-même, qui requiert jQuery, masque ou affiche simplement une métabox en fonction de la valeur sélectionnée dans la liste déroulante des modèles de page. Dans cet exemple, je montre uniquement la métabox pour les vignettes de publication dans le cas où le modèle de page par défaut est sélectionné:

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

Et pour le plaisir, voici une version plus courte et moins détaillée du même script:

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

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

});
})(jQuery);
    
réponse donnée Geert 24.05.2011 - 19:41
1

Plutôt que de rendre la métaboxe uniquement pour la cacher avec jQuery, vous pouvez l'utiliser. La seule différence est que l'affichage / masquage de la métabox nécessite de sélectionner "Mettre à jour" après avoir modifié le champ déroulant.

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

Mettez à jour les lignes 6 et 7 comme vous le souhaitez.

    
réponse donnée davidcondrey 07.12.2014 - 22:47

Lire d'autres questions sur les étiquettes