Como você usa um CPT como a home page padrão?

20

Eu tenho um cliente cujo site fará uso pesado de tipos de postagem personalizados para configurar seu site. Mas estou entre um rock e um lugar difícil para a página inicial solicitada.

Na realidade, a home page será uma pilha de "páginas" específicas dentro do WordPress. Basicamente, haverá páginas para: Introdução , Blog , Sobre nós , Portfólio e Contato Nós . Todos eles serão empilhados um sobre o outro para que você possa rolar de uma página para outra.

Meu primeiro instinto foi simplesmente usar uma página (chamada Home ) e incorporar um shortcode que aceita slugs de página e gera a ordem correta (ou seja, [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder] ). A página usaria um modelo de página personalizado para definir as configurações, controlar o loop e adicionar navegação ao lado esquerdo da página. Mas tudo isso parece klunky.

A solução ideal seria criar um tipo de postagem personalizado (chamado Stack ) que permite ao usuário final posicionar as páginas com arrastar e soltar e fazer o CPT cuidado de layout e navegação e tal.

O problema com a minha solução ideal é configurações. WordPress permite que você selecione uma página para a home page padrão do site. Mas ele está ligado a um tipo de postagem de página , e não sei ao certo onde modificar isso para que os usuários também possam selecionar uma Pilha como a home page padrão .

Então, onde eu me conecto para adicionar um CPT à lista suspensa de páginas disponíveis para a página inicial padrão?

    
por EAMann 23.05.2011 / 16:05

5 respostas

11

Obrigado ao @toscho pela resposta útil, mas pareceu-me um pouco trabalhoso, por isso, pesquisei um pouco e descobri que podia adicionar um filtro:

function wpa18013_add_pages_to_dropdown( $pages, $r ){
    if('page_on_front' == $r['name']){
        $args = array(
            'post_type' => 'stack'
        );
        $stacks = get_posts($args);
        $pages = array_merge($pages, $stacks);
    }

    return $pages;
}
add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 );

Atualizar

Depois de adicionar o código acima, eu era, de fato, capaz de usar um tipo de postagem personalizado como a página inicial, mas o WordPress redirecionava os permalinks porque não era um tipo de postagem de "página". Então, http://localhost/test iria redirecionar para http://localhost/test/stacks/home-stack , o que não era o que eu queria.

Adicionar essa ação, no entanto, corrigiu isso e consultou meu tipo de postagem personalizada junto com as páginas da página inicial:

function enable_front_page_stacks( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );
    
por EAMann 24.05.2011 / 01:28
8

Talvez sim? Versão refinada de minha solução anterior .

add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 );


/**
 * Adds CPTs to the list of available pages for a static front page.
 *
 * @param  string $select Existing select list.
 * @return string
 */
function add_cpt_to_front_page_dropdown( $select )
{
    if ( FALSE === strpos( $select, '<select name="page_on_front"' ) )
    {
        return $select;
    }

    $cpt_posts = get_posts(
        array(
            'post_type'      => 'YOUR_POST_TYPE'
        ,   'nopaging'       => TRUE
        ,   'numberposts'    => -1
        ,   'order'          => 'ASC'
        ,   'orderby'        => 'title'
        ,   'posts_per_page' => -1
        )
    );

    if ( ! $cpt_posts ) // no posts found.
    {
        return $select;
    }

    $current = get_option( 'page_on_front', 0 );

    $options = walk_page_dropdown_tree(
        $cpt_posts
    ,   0
    ,    array(
            'depth'                 => 0
         ,  'child_of'              => 0
         ,  'selected'              => $current
         ,  'echo'                  => 0
         ,  'name'                  => 'page_on_front'
         ,  'id'                    => ''
         ,  'show_option_none'      => ''
         ,  'show_option_no_change' => ''
         ,  'option_none_value'     => ''
        )
    );

    return str_replace( '</select>', $options . '</select>', $select );
}
    
por fuxia 23.05.2011 / 16:21
5

Por que não criar apenas um arquivo de modelo front-page.php , que usa uma consulta / loop normal ou (se uma opção de tema personalizada estiver definida para exibir o CPT na primeira página), gera uma consulta / loop personalizada com base no CPT?

A questão é que você teria que criar uma opção Theme separada para controlar a saída Front Page, enquanto ao mesmo tempo instruía os usuários a configurar Front Page para a página estática.

Para facilitar, você pode ligar sua opção de tema à leitura de configurações, usando o grupo de opções "Leitura" em sua chamada para register_setting por meio da API de configurações, para que seja exibido com as opções de página frontal existentes.

    
por Chip Bennett 23.05.2011 / 17:12
2

Acho que algo pode ter mudado desde que o EAMann escreveu sua atualização em 2011, e a função wpa18013_add_pages_to_dropdown () que ele fornece não funciona mais. Como mencionado em um comentário por Dameer, esta função atualmente (dezembro de 2013) gera um erro "Missing argument 2 para wpa18013_add_pages_to_dropdown ()"

A solução, para mim, era reescrever a função sem esse segundo parâmetro, ou a verificação de seu conteúdo. O bloco completo de código torna-se então:

function add_unbox_tabs_to_dropdown( $pages ){
    $args = array(
        'post_type' => 'unbox_tabs'
    );
    $items = get_posts($args);
    $pages = array_merge($pages, $items);

    return $pages;
}
add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' );

function enable_front_page_unbox_tabs( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' );
}
add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' );

Por favor, note que no exemplo acima, o tipo de postagem personalizada que estou adicionando é "unbox_tabs" em vez de "stack".

    
por Matthew Bernhardt 12.12.2013 / 16:32
1

Estou usando esta técnica para incluir um modelo de um plug-in. Então, a solução do @ ChipBennett não se aplica.

Para adicionar os CPTs ( 'hierarchical' => 'false' ) do plug-in na lista de Páginas Estáticas, modifiquei a solução do @EAMann da seguinte forma:

add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' );
add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' );

function wpse_18013_modify_front_pages_dropdown()
{
    // Filtering /wp-includes/post-templates.php#L780
    add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' );
}

function wpse_18013_add_cpt_to_pages_on_front( $r )
{
    $args = array(
        'post_type' => 'stack'
    );
    $stacks = get_posts( $args );
    $r = array_merge( $r, $stacks );

    return $r;
}

function wpse_18013_enable_front_page_stacks( $query )
{
    if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] )
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}

Referência central v3.4.2:
pequena diferença de números de linha em 3.5 RC3, mas o código permanece o mesmo

/**
 * wp-admin/options-reading.php#L96
 * Happens inside a <li><label>-</label></li>
 */
    wp_dropdown_pages( array( 
                'name' => 'page_on_front'
            ,   'echo' => 0
            ,   'show_option_none' => __( '&mdash; Select &mdash;' )
            ,   'option_none_value' => '0'
            ,   'selected' => get_option( 'page_on_front' ) 
        ) 
    )

/**
  * wp-includes/post-template.php#L768
  */
function wp_dropdown_pages($args = '') {
    $defaults = array( /* defaults array */ );    
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );  
    $pages = get_pages( $r );
    
por brasofilo 08.12.2012 / 15:18