Adicione o tipo de postagem personalizada à consulta atual

4

Estou tentando criar um plug-in que adicione um novo tipo de postagem personalizado e que seja exibido nos mesmos locais que uma postagem normal (página inicial, arquivos etc.).

Existe alguma função para recuperar os tipos de postagem que estão sendo chamados na consulta para que eu possa modificar e adicionar meu CPT à consulta atual? (exemplo declarado no segundo comentário se a minha pergunta parece confusa)

Não consigo usar o código abaixo (ou seja, listar os tipos de postagem) porque não posso prever quais tipos de postagem o usuário teria:

add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {

if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'page', 'album', 'movie', 'quote' ) );

return $query;
}

Da mesma forma, não posso usar o código abaixo porque isso retornaria todos tipos de postagens, incluindo aquelas que podem não ser mostradas na primeira página:

if ( !is_admin() && empty( $query->query_vars['suppress_filters'] ) && $query->is_main_query() ) {
    $post_type = get_query_var('post_type');
    $post_types = get_post_types( array( 'public' => true ) );

    if ($post_type) {
        $post_type = $post_type;
    } else {
        $post_type = $post_types;
    }

    $query->set('post_type',$post_type);
    return $query;
    }
}

Então, há alguma ideia de como posso adicionar meu CPT à consulta sem afetar outros tipos de postagem? Obrigado por ajudar!

    
por Billy 24.12.2014 / 10:26

1 resposta

4

Na verdade, você não está tão longe com pre_get_posts , você só precisa primeiro pegar os tipos de postagem atuais que estão na consulta antes de adicionar os seus próprios.

Além disso, recomendo usar $priority de 99 para que a ação seja conectada depois de qualquer outro pre_get_posts ganchos, o que significa que, se os usuários adicionarem CPTs próprios (ou tipos de postagem incorporados), eles serão detectados e incluído pela função abaixo (mas você pode alterar isso conforme necessário).

add_action('pre_get_posts', 'djg_includ_my_cpt_in_query', 99);
function djg_includ_my_cpt_in_query($query){

    if(is_home() && $query->is_main_query()) :              // Ensure you only alter your desired query

        $post_types = $query->get('post_type');             // Get the currnet post types in the query

        if(!is_array($post_types) && !empty($post_types))   // Check that the current posts types are stored as an array
            $post_types = explode(',', $post_types);

        if(empty($post_types))                              // If there are no post types defined, be sure to include posts so that they are not ignored
            $post_types[] = 'post';         
        $post_types[] = 'document';                         // Add your custom post type

        $post_types = array_map('trim', $post_types);       // Trim every element, just in case
        $post_types = array_filter($post_types);            // Remove any empty elements, just in case

        $query->set('post_type', $post_types);              // Add the updated list of post types to your query

    endif; 

    return $query;

}

EDITAR

Ao construir a consulta final, o WordPress verifica se 'post_type' está vazio e, em caso afirmativo, o código a seguir é executado -

$where .= " AND $wpdb->posts.post_type = 'post'";
$post_type_object = get_post_type_object ( 'post' );

Então, o que acontece quando adicionamos um CPT é que o WordPress pretende ignorar as mensagens, pois elas não são explicitamente declaradas. Ou seja, meu cenário era diferente - eu declarara explicitamente outros tipos de postagem anteriormente para que eles fossem incluídos na chamada $post_types = $query->get('post_type'); .

Assim, no seu caso, podemos ressaltar que, se $post_types estiver vazio, o usuário não deseja alterar essa parte da consulta para que 'post' possa ser adicionado manualmente à matriz $post_types . Isso deve (espero!) Fazer o truque.

    
por David Gard 24.12.2014 / 12:03