Переключить метабокс администратора на основе выбранного шаблона страницы

18

Я бы хотел, чтобы интерфейс настраиваемого поля отображался только в том случае, если определенный шаблон назначен определенной странице WordPress.

Есть идеи?

Джонатан Уолд
источник
Если он не должен быть «живым» (т. Е. Изменение шаблона страницы не требует немедленного появления / исчезновения метабокса), посмотрите этот связанный вопрос: wordpress.stackexchange.com/questions/48611/…
Стивен Харрис,
@StephenHarris Спасибо за комментарий. Я закончил с классом WPAlchemy MetaBox, который включает в себя настройку «на шаблон».
Джонатан Уолд

Ответы:

22

Лучший способ справиться с этой ситуацией - через JavaScript. Таким образом, при изменении выбранного значения вы можете мгновенно скрыть / показать связанный метабокс.

Используйте wp_enqueue_script()в functions.phpдля загрузки пользовательского файла JavaScript в области администратора:

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

Сам скрипт, для которого требуется jQuery, просто скрывает или показывает метабокс на основе выбранного значения в раскрывающемся списке шаблона страницы. В этом примере я показываю метабокс для миниатюр сообщений только в том случае, если выбран шаблон страницы по умолчанию:

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

И, просто для забавы, вот более короткая, менее многословная версия того же сценария:

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

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

});
})(jQuery);
Герт
источник
Вау, спасибо! Я скоро проведу тест и сообщу соответственно.
Джонатан Уолд
Так круто ... это как раз то, что мне было нужно. Работал идеально для меня. Спасибо!!!
Росс
Извините, но я настоящий новичок в javascript и знаю, что там есть, что мне нужно, но, похоже, я не могу делать все правильно ... Так что я не уверен, что понимаю, что Я должен измениться в файле javascript. Можно ли получить больше объяснений для нуби, как я? ;)
1

Вместо того, чтобы отображать метабокс только для того, чтобы скрыть его с помощью jQuery, вы можете использовать это. Единственное отличие состоит в том, что для скрытия / отображения метабокса необходимо выбрать «Обновить» после изменения раскрывающегося поля.

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

Просто обновите строки 6 и 7 по желанию.

davidcondrey
источник