Todos os posts de Diogo Teobaldo

Filtro para conteúdo na biblioteca de mídia do WordPress

Por: Diogo Teobaldo

 

As vezes pode ser útil filtrar quais conteúdos da biblioteca de mídia de seu site os usuários podem ter acesso. Por isso mostrarei uma maneira pratica e simples de fazer o mesmo.

No caso abaixo, o objetivo era fazer com que os usuários(exceto editores) tivessem acesso apenas a conteúdos vinculados a uma post associado a ele ou que tenha sido enviado por ele.

1º passo – Utilizamos um filtro para ter acesso a query de posts e poder altera-la:

add_filter( 'posts_where', 'attachments_wpquery_where', 10, 2 )

2º passo – Definição da função:

function attachments_wpquery_where( $where ){

3° passo – Devemos obter o id do post para saber quais imagens estão vinculadas ao mesmo, e para isso utilizamos a expressão abaixo:

$id = $_POST['post_id'] ? $_POST['post_id'] : "NULL";

4º passo – Restringimos a função para filtrar apenas conteúdo de usuários que não tenham permissão de editor:

if( is_user_logged_in() && !current_user_can('edit_others_pages'))

5º passo – Checamos se o usuário está utilizando ação de consulta de imagens na biblioteca:

if( isset( $_POST['action'] ) ){
            // library query
            if( $_POST['action'] == 'query-attachments' ){

6º passo – Alterar a query de acordo com nossa necessidade:

$where .= ' AND (post_author=' . get_current_user_id() . ' OR post_parent=' . $id .')';
return $where;

No 6º passo filtramos na cláusula where da query conteúdo do autor logado ou que esteja vinculado ao post que ele está consultando.

O que acontece se o usuário for na biblioteca de mídia devido a essa alteração?
R: Como não haverá id de post na página da biblioteca serão trazidos apenas conteúdo que tenha sido enviado pelo usuário logado no sistema.

Código completo para referência:

add_filter( 'posts_where', 'attachments_wpquery_where', 10, 2 );
function attachments_wpquery_where( $where ){            
    $id = $_POST['post_id'] ? $_POST['post_id'] : "NULL";
    if( is_user_logged_in() && !current_user_can('edit_others_pages')){        
        if( isset( $_POST['action'] ) ){
            // library query
            if( $_POST['action'] == 'query-attachments' ){
                $where .= ' AND (post_author=' . get_current_user_id() . ' OR post_parent=' . $id .')';
            }
        }
    }    
    return $where;
}

Utilizando editor TinyMce no WordPress

Por: Diogo Teobaldo

Pode ser que um dia você precise que um campo texto como o textarea tenha mais funcionalidades e suporte código html. Para isso mostrarei como usar o TinyMce.

Primeiro de tudo, o que seria esse tal de TinyMce?
R: TinyMCE é uma plataforma web independente baseado em Javascript HTML WYSIWYG editor controle lançado como Open Source sob LGPL.

Ah! Entendi. Então vamos continuar.

O WordPress conta com uma função que serve para renderizar esse editor. Essa função é a wp_editor que recebe três parâmetros, sendo eles:

  • $content – Conteúdo inicial do editor.
  • $editor_id – Id HTML do textarea para o TinyMCE.
  • $settings – Um array de argumentos. Esses argumentos serão úteis para controlar por exemplo se os botões insert/upload de mídia devem ser exibidos.

Como exemplo suponha que queremos um campo resumo com os recursos do TinyMce.

1º Devemos obter o conteúdo inicial seja ele post ou um post_meta como abaixo:

$resumo = get_post_meta($post->ID, '_resumo', true);

2º Precisamos do id do textarea, no nosso caso será “resumo”.

3º O array de argumentos:

$settings = array(
        'textarea_name' => 'resumo_empresa',
        'media_buttons' => false,     
        'textarea_rows' => 10,   
        'tinymce' => array(
            'theme_advanced_buttons1' => 'formatselect,|,bold,italic,underline,|,' .
                'bullist,blockquote,|,justifyleft,justifycenter' .
                ',justifyright,justifyfull,|,link,unlink,|' .
                ',spellchecker,wp_fullscreen,wp_adv'));

Com isso, devemos fazer chamada a função wp_editor do wordpress no local onde queremos que nosso editor seja renderizado.

wp_editor($resumo, 'resumo', $settings);

Pronto com isso ele já será exibido, agora basta salvar o conteúdo assim que necessário:

update_post_meta( $_id, '_resumo', $_POST['resumo'] );