Como consultar a postagem por função do usuário?

6

Eu quero consultar as postagens por sua função de autor. E faça algo com o post baseado no papel.

Eu sei que podemos obter o post por get_posts ou WP_query, o problema é que não há nenhum argumento para classificar o post com base na função de autor. Ou também podemos combinar get_users e get_posts juntos, como este

$users = get_users(array(role => 'author'));
foreach($users as $user){
//here we can use get_posts to query the posts by the $user->ID   
} .....

isso é muito desajeitado para fazer isso. Eu quero saber se existe alguma outra maneira de consultar as mensagens com base na função, consulta SQL, talvez?

    
por dev-jim 21.06.2012 / 17:57

4 respostas

-2

Eu realmente não mexi nas consultas de postagem personalizadas antes, mas aqui está minha tentativa em uma solução:

function get_posts_by_author_role($role) {
    global $wpdb;
    return $wpdb->get_results( "SELECT p.* FROM {$wpdb->posts} p, {$wpdb->usermeta} u"
                                ." WHERE    p.post_type     = 'post'"
                                ." AND      p.post_status   = 'publish'"
                                ." AND      u.user_id       = p.'post_author'"
                                ." AND      u.meta_key      = 'wp_capabilities'"
                                ." AND      u.meta_value    LIKE '%\"{$role}\"%'" );
}

Esta função retornará postagens somente se o autor tiver a função especificada. Ele foi testado e está funcionando na minha instalação local do 3.4, mas deixe-me saber se você está tendo algum problema com ele.

Espero que isso ajude.

Exemplo de uso:

$posts = get_posts_by_author_role('author');
foreach($posts as $post) echo $post->post_title, '<br />';
    
por Sarathi Hansen 25.06.2012 / 08:07
11

tente isso

crie uma função para alterar a cláusula where da consulta:

function authors_where_filter( $where ) {
        global $wpdb;
        $ids = get_users(array('role' => 'author' ,'fields' => 'ID'));
        $where .= " AND post_author IN ($ids)";
        return $where;
}

e, em seguida, antes de consultar, basta ligar ex:

add_filter('posts_where','authors_where_filter');
$all_posts = new WP_Query(array('posts_per_page' => -1 .....
remove_filter('posts_where');

e você deve obter todas as postagens de usuários de autor em uma única consulta, (bem, duas, na verdade, uma para obter os usuários e a outra é para obter as postagens)

    
por Bainternet 25.06.2012 / 00:47
0

Primeiro, obtenha o ID do usuário por função com uma função:

function author_ids_by_role() {
        $ids = get_users(array('role' => 'author' ,'fields' => 'ID'));
        return $ids;
}

Em seguida, na sua consulta, você pode usar essa matriz de IDs de usuário da seguinte maneira:

$role_ids = author_ids_by_role();
    $args = array(
      "post_count"      => -1, 
      "posts_per_page"  => 10,
      "post_type"       => "my_custom_posttype",
      "author__in"      => $role_ids
    );

Se você quiser consultar a postagem por função do usuário atual. Use a seguinte função:

function author_ids_by_role() {
        global $current_user;

        $user_roles = $current_user->roles;
        $user_role = array_shift($user_roles);

        $ids = get_users(array('role' => $user_role ,'fields' => 'ID'));

        return $ids;
}

Esteja ciente de que esta última função só funciona quando os usuários têm apenas 1 função.

    
por Trekdrop 03.12.2015 / 16:55
-3

Você pode usar a verificação de funções e recursos implantando a função:

current_user_can( $capability );

Por exemplo:

if(current_user_can('read') && !current_user_can('edit_posts')){
//code for subscribers...
}
else if(current_user_can('edit_posts') && !current_user_can('edit_pages')){
//code for authors...
}
else if(current_user_can('edit_pages') && !current_user_can('delete_themes')){
//code for editors....
}
else {
//code for admins...
}

Você terá mais uma verificação se usar o multi-site para superadministradores.

Observe que você precisa usar duas verificações porque, sem outra verificação, algum usuário receberia várias consultas.

    
por OriginalEXE 21.06.2012 / 18:14