Przełącz metabox administratora na podstawie wybranego szablonu strony

18

Chciałbym, aby niestandardowy interfejs pola był wyświetlany tylko wtedy, gdy określony szablon jest przypisany do konkretnej strony WordPress.

Jakieś pomysły?

Jonathan Wold
źródło
Jeśli nie musi być „na żywo” (tzn. Zmiana szablonu strony nie musi powodować natychmiastowego pojawiania się / znikania metaboksu), zobacz to powiązane pytanie: wordpress.stackexchange.com/questions/48611/…
Stephen Harris
@StephenHarris Dzięki za komentarz. Skończyło się na użyciu klasy WPAlchemy MetaBox, która zawiera opcję „na szablon” w konfiguracji.
Jonathan Wold

Odpowiedzi:

22

Najlepszym sposobem podejścia do tej sytuacji jest JavaScript. W ten sposób, za każdym razem, gdy zmienia się wybrana wartość, możesz natychmiast ukryć / pokazać powiązany metaboks.

Użyj wp_enqueue_script()w, functions.phpaby załadować niestandardowy plik JavaScript w obszarze administracyjnym:

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

Sam skrypt, który wymaga jQuery, po prostu ukrywa lub pokazuje metaboks na podstawie wybranej wartości z listy rozwijanej szablonu strony. W tym przykładzie pokazuję metaboks dla miniatur postów tylko w przypadku wybrania domyślnego szablonu strony:

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

I, dla zabawy, oto krótsza, mniej szczegółowa wersja tego samego skryptu:

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

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

});
})(jQuery);
Geert
źródło
Wow, dziękuję! Niedługo poddam to testowi i odpowiednio go przekażę.
Jonathan Wold
Tak niesamowite ... właśnie tego potrzebowałem. Działa idealnie dla mnie. Dziękuję Ci!!!
Ross
Przepraszam, ale jestem prawdziwym początkującym w javascript i wiem, co tam jest, czego potrzebuję, ale wygląda na to, że nie jestem w stanie robić rzeczy we właściwy sposób ... Więc nie jestem pewien, co rozumiem Muszę zmienić plik javascript. Czy można uzyskać więcej wyjaśnień dla takiego nooby jak ja? ;)
1

Zamiast renderować metaboks tylko w celu ukrycia go za pomocą jQuery, możesz tego użyć. Jedyna różnica polega na tym, że ukrywanie / wyświetlanie metaboksu wymaga wybrania opcji „Aktualizuj” po zmianie pola rozwijanego.

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

Po prostu zaktualizuj linie 6 i 7 według potrzeb.

Davidcondrey
źródło