• Resolvido Daniel Lemes

    (@daniel_iceman)


    Estou tentando restringir a visibilidade de campos personalizados pelos contribuidores em um blog multi-autor.

    Por exemplo, ao criar um novo artigo, quero que apenas administradores tenham acesso a opções como “seo”, “rating”, “views”, etc. O colaborador só vai poder adicionar custom fields como “autor”, “editora”, etc.

    Procuro há dias como fazer isso, mas só consegui eliminar os campos do select através de css, o que não é seguro. Descobri que no arquivo em wp-admin/includes/template.php, fica o trecho que gera o select com as opções, assim:

    foreach ( $keys as $key ) {
        echo "\n<option value='" . esc_attr($key) . "'>" . esc_html($key) . "</option>";
    }

    Mas não sei como pegar o resultado do loop antes de preencher o select, eliminar os campos indesejados (“views”, por exemplo), e seguir em frente. Seria algo como:

    foreach ( $keys as $key ) {
    /* se uma das key for igual a "views", ou "seo", elimine-a e continue, gerando o select com as restantes */
       echo "\n<option value='" . esc_attr($key) . "'>" . esc_html($key) . "</option>";
    }

    Alguma luz sobre como fazer isso, ou alguma sugestão mais eficiente sobre o problema, mesmo com outra abordagem? Obrigado antecipadamente.

Visualizando 3 respostas - 1 até 3 (de um total de 3)
  • Acho que o uso seria assim:

    add_filter('is_protected_meta', 'my_is_protected_meta_filter', 10, 2);
    
    function my_is_protected_meta_filter($protected, $meta_key) {
        return $meta_key == 'test1' ? true : $protected;
    }

    Substitua ‘test1’ pelo nome do seu custom field. Se forem vários campos que vc quer esconder, teria que usar o operador OR mais ou menos assim:

    add_filter('is_protected_meta', 'my_is_protected_meta_filter', 10, 2);
    
    function my_is_protected_meta_filter($protected, $meta_key) {
        if ($meta_key == 'test1' or $meta_key=='test2'){
                return true; {
        else {
                return $protected;
        }
    }
    Criador do tópico Daniel Lemes

    (@daniel_iceman)

    Obrigado, Renato. Parti para outra abordagem. Primeiro removi o acesso aos não-administradores aos custom fields “normais” com:

    // metaboxes que colab não devem usar
    if (!current_user_can('update_core')) {
    function remove_post_custom_fields() {
    remove_meta_box('postcustom', 'post' , 'normal');
    }
    add_action( 'admin_menu' , 'remove_post_custom_fields' );
    }

    Depois usei isso http://www.farinspace.com/wpalchemy-metabox/ para criar um metabox com novos custom fields específicos para o que eu preciso.

    Mesmo assim, vou testar o que você postou, posso precisar em outro projeto.

Visualizando 3 respostas - 1 até 3 (de um total de 3)
  • O tópico ‘Eliminar valores de foreach antes de preencher um select’ está fechado para novas respostas.