Alternar metabox de administrador com base no modelo de página escolhido

18

Eu gostaria que uma interface de campo personalizada aparecesse apenas quando um determinado modelo fosse atribuído a uma página específica do WordPress.

Alguma ideia?

Jonathan Wold
fonte
Se ele não precisa ser 'ao vivo' (ou seja, alterar o modelo de página não precisa fazer a METABOX aparecer / desaparecer imediatamente) ver esta questão relacionada: wordpress.stackexchange.com/questions/48611/...
Stephen Harris
@StephenHarris Obrigado pelo comentário. Acabei indo para a classe WPAlchemy MetaBox, que inclui uma opção "por modelo" na instalação.
11132 Jonathan Wold

Respostas:

22

A melhor maneira de abordar essa situação é via JavaScript. Dessa forma, sempre que o valor selecionado for alterado, você poderá ocultar / mostrar instantaneamente a metabox relacionada.

Use wp_enqueue_script()em functions.phpcarregar um arquivo JavaScript personalizado na área de administração:

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

O próprio script, que requer jQuery, simplesmente oculta ou mostra uma metabox com base no valor selecionado na lista suspensa do modelo de página. Neste exemplo, mostro apenas a metabox para postar miniaturas, caso o modelo de página padrão seja selecionado:

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

E, apenas por diversão, aqui está uma versão mais curta, menos detalhada, do mesmo script:

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

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

});
})(jQuery);
Geert
fonte
Uau, obrigada! Em breve, testarei isso e apresentarei um relatório de acordo.
Jonathan Wold
Tão incrível ... isso é exatamente o que eu precisava. Funcionou perfeito para mim. Obrigado!!!
Ross
Desculpe, mas eu sou um iniciante em javascript e sei o que há de que preciso, mas parece que não sou capaz de fazer as coisas da maneira correta ... Portanto, não sei ao certo o que Eu tenho que mudar no arquivo javascript .. É possível ter mais explicações para um nooby como eu? ;)
1

Em vez de renderizar o metabox apenas para ocultá-lo com o jQuery, você pode usá-lo. A única diferença é que a ocultação / exibição da metabox requer a seleção de 'Atualizar' após alterar o campo suspenso.

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

Atualize as linhas 6 e 7 conforme desejado.

davidcondrey
fonte