Basculer la métabox d'administration en fonction du modèle de page choisi

18

J'aimerais qu'une interface de champ personnalisée n'apparaisse que lorsqu'un certain modèle est attribué à une page WordPress particulière.

Des idées?

Jonathan Wold
la source
S'il n'a pas besoin d'être «en direct» (c'est-à-dire que la modification du modèle de page n'a pas besoin de faire apparaître / disparaître immédiatement la métabox), consultez cette question connexe: wordpress.stackexchange.com/questions/48611/…
Stephen Harris
@StephenHarris Merci pour le commentaire. Je me suis retrouvé avec la classe WPAlchemy MetaBox, qui inclut une option "par modèle" dans la configuration.
Jonathan Wold

Réponses:

22

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

Utilisez wp_enqueue_script()in functions.phppour 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 nécessite jQuery, masque ou affiche simplement une métabox basée sur la valeur sélectionnée dans la liste déroulante du modèle de page. Dans cet exemple, je montre uniquement la métabox pour les miniatures de publication au 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, juste pour le plaisir, voici une version plus courte et moins verbeuse du même script:

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

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

});
})(jQuery);
Geert
la source
Wow merci! Je donnerai bientôt un test à cela et je ferai rapport en conséquence.
Jonathan Wold
Tellement génial ... c'est juste ce dont j'avais besoin. Fonctionne parfaitement pour moi. Je vous remercie!!!
Ross
Désolé mais je suis un vrai débutant en javascript et je sais ce dont j'ai besoin, mais il semble que je ne suis pas en mesure de faire les choses correctement ... donc je ne suis pas sûr de comprendre ce que Je dois changer dans le fichier javascript .. Est-il possible d'avoir plus d'explications pour un nooby comme moi? ;)
1

Plutôt que de rendre la métabox uniquement pour la masquer avec jQuery, vous pouvez l'utiliser. La seule différence étant que le masquage / affichage 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.

davidcondrey
la source