web-dev-qa-db-fra.com

Basculer metabox admin basé sur le modèle de page choisi

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

Des idées?

18
Jonathan Wold

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

Utilisez wp_enqueue_script() in 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);
22
Geert

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

Il suffit de mettre à jour les lignes 6 et 7 comme vous le souhaitez.

1
davidcondrey