Como usar um arquivo personalizado de tipo de postagem como primeira página?

16

Eu gostaria de usar um arquivo de postagem personalizado como página inicial do site, para que

 http://the_site.com/

é um arquivo de tipo de postagem personalizado exibido de acordo com meu archive-{post-type}.phparquivo.

Idealmente, gostaria de alterar a consulta usando is_front_page()no meu functions.phparquivo. Tentei o seguinte, com uma página chamada "Página inicial" como minha primeira página:

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

mas a primeira página está retornando o conteúdo de "Página inicial" e parece estar ignorando a consulta personalizada.

O que estou fazendo de errado? Existe uma maneira melhor, em geral, de fazer isso?

Isaac Lubow
fonte
is_front_page () não funcionará com pre_get_posts
Brad Dalton

Respostas:

27

Depois de definir uma página estática como sua página inicial, você pode adicioná-la functions.phpe pronto . Isso chamará o archive-POSTTYPE.phpmodelo corretamente também.

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}
Ijaas
fonte
Essa função precisa if(is_admin()) return;no início, caso contrário, ela mexe com a área de administração.
brasofilo
11
Enquanto isso funcionava para mim, meus menus primário e secundário desapareceram como resultado.
super9
Está quase corretamente. Este código está mudando todos os wp_queries, por isso deve ser if (is_home ()) em vez de if ($ wp_query-> get .....)
Leo Caseiro
Estou usando o mesmo, mas no meu modelo de página personalizado, em vez de na página inicial, e ele não mostra resultados (como se nenhuma postagem personalizada fosse adicionada). Alguma ideia?
Trainoasis
Esta solução não suporta paginação. Qualquer URL / page / 2 ainda mostra as 10 primeiras postagens.
Rg89 19/07/19
6

Mude o nome do seu arquivo CPT para home.php

Em seguida, use pre_get_posts para alterar a consulta da página inicial, para que apenas a exibição do CPT

function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
    }
  }

add_action('pre_get_posts','wpsites_home_page_cpt_filter');

Substitua your-cpt pelo nome do seu tipo de postagem personalizado.

Brad Dalton
fonte
2
finalmente, uma explicação clara e viável!
Jack
1

Obrigado pela resposta ljaas - eu estava procurando resolver esse problema exato. Para que o modelo de arquivo morto de tipo de postagem personalizado seja chamado, tive que adicionar as seguintes condições:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Eli
fonte
2
Olá Eli, bem-vindo ao WPSE. As "respostas" destinam-se a responder à pergunta inicial (os sites stackexchange não são fóruns de discussão encadeados ). Isso seria muito melhor para um comentário .
Johannes Pille
Obrigado pelo esclarecimento Johannes. Foi o que pensei, embora não tenha conseguido descobrir como comentar a resposta, pois não há um recurso para adicionar comentários. Esse recurso é sensível ao tempo ou estou cego?
Eli
0

Isso funciona melhor para mim, substituindo as postagens do blog e a página estática em Configurações> Leitura> Exibições da primeira página:

<?php
/**
 * Set custom post type archive as front page.
 *
 * @since 1.0.0
 */
function ql_set_as_front_page( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ql_is_front_page( $query ) ) {
        $query->set( 'page_id', '' );
        $query->is_page = false;
        $query->is_singular = false;
        $query->set( 'post_type', 'MYCPT' );
        $query->is_archive = true;
        $query->is_post_type_archive = true;
    }
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main WP Query.
 */
function ql_is_front_page( $query ) {
    if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
        return true;
    elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
        return true;
    else
        return false;
}

Estou usando-o em conjunto com uma substituição de modelo usando os filtros front_page_templatee home_templatepara retornar um modelo personalizado.

Elliot
fonte
0

Para mim, isso quebra a paginação: ou você seleciona o índice ou uma página estática como a página inicial, os links de paginação são exibidos, mas ao clicar na página 2, recebo:

  • no caso da página de índice (padrão): a página 404
  • no caso de página estática: os mesmos resultados da página 1: o argumento "paginado" é então interpretado para mostrar a paginação do tipo de página, não a paginação da lista de tipos de postagem.

Eu acho que precisa de algumas regras de reescrita para pegar o argumento paginado e passá-lo corretamente.

De qualquer forma, uma página de modelo personalizada deve ser a solução com algumas regras de reescrita adicionais.

nderambure
fonte