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