¿Cómo usa un CPT como página de inicio predeterminada?

20

Tengo un cliente cuyo sitio hará un uso intensivo de los tipos de publicaciones personalizadas para configurar su sitio. Pero estoy entre una roca y un lugar difícil para su página de inicio solicitada.

En realidad, la página de inicio será una pila de "páginas" específicas dentro de WordPress. Básicamente, habrá páginas para: Introducción , Blog , Acerca de nosotros , Cartera y Contacto Nosotros . Todos se apilarán uno encima del otro para que pueda desplazarse de una página a otra.

Mi primer instinto fue usar solo una página (llamada Inicio ) e incrustar un código abreviado que acepte las barras de página y genere el orden adecuado (es decir, [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder] ). La página usaría una plantilla de página personalizada para organizar las cosas, controlar el bucle y agregar navegación al lado izquierdo de la página. Pero todo eso parece torpe.

La solución

Mi ideal consistiría en crear un tipo de publicación personalizada (llamada Pila ) que permita al usuario final colocar las páginas con arrastrar y soltar y hacer que la CPT tome cuidado del diseño y la navegación y tal.

El problema con mi solución ideal es la configuración. WordPress le permite seleccionar una página para la página de inicio predeterminada del sitio. Pero está vinculado a un tipo de publicación de página , y no estoy seguro de dónde conectar para modificar eso, de modo que los usuarios también puedan seleccionar una Pila como la página de inicio predeterminada .

Entonces, ¿dónde me conecto para agregar un CPT al menú desplegable de páginas disponibles para la página de inicio predeterminada?

    
pregunta EAMann 23.05.2011 - 16:05

5 respuestas

11

Gracias a @toscho por la respuesta útil, pero me pareció un poco pirata, así que me asomé un poco y descubrí que podía agregar un filtro en su lugar:

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

Actualizar

Después de agregar el código anterior, fui capaz de usar un tipo de publicación personalizada como página de inicio, pero WordPress redirigiría los enlaces permanentes porque no era una publicación de "página". Así que http://localhost/test se redireccionaría a http://localhost/test/stacks/home-stack , que no era lo que quería.

Sin embargo, al agregar esta acción, se corrigió eso y se consultó mi tipo de publicación personalizada junto con las páginas de la página de inicio:

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' );
    
respondido por el EAMann 24.05.2011 - 01:28
8

Tal vez sea así? Versión mejorada de mi solución 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 );
}
    
respondido por el fuxia 23.05.2011 - 16:21
5

¿Por qué no solo crea un archivo de plantilla front-page.php , que usa una consulta / bucle normal, o (si una opción de tema personalizado está configurada para mostrar el CPT en la Página principal), genera una consulta / bucle personalizado, basado en el CPT?

El problema es que tendrías que crear una opción de Tema separada para controlar el resultado de la Página principal, mientras que al mismo tiempo les ordenas a los usuarios que configuren la Página frontal como página estática.

Para facilitar las cosas, puede conectar su opción de Tema a la configuración de lectura, usando el grupo de opciones "Lectura" en su llamada a register_setting a través de la API de Configuración, para que se muestre con las opciones existentes de la Página principal.

    
respondido por el Chip Bennett 23.05.2011 - 17:12
2

Creo que algo puede haber cambiado desde que EAMann escribió su actualización en 2011, y la función wpa18013_add_pages_to_dropdown () que ya no funciona. Como se mencionó en un comentario de Dameer, esta función actualmente (diciembre de 2013) emite un error "Falta el argumento 2 para wpa18013_add_pages_to_dropdown ()"

La solución, para mí de todos modos, fue reescribir la función sin ese segundo parámetro, o la verificación de su contenido. El bloque completo de código se convierte en:

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' );

Ten en cuenta que en el ejemplo anterior, el tipo de publicación personalizada que estoy agregando es "unbox_tabs" en lugar de "stack".

    
respondido por el Matthew Bernhardt 12.12.2013 - 16:32
1

Estoy usando esta técnica para incluir una plantilla de un complemento. Por lo tanto, la solución de @ ChipBennett no se aplica.

Para agregar el CPT ( 'hierarchical' => 'false' ) del complemento en la lista de Páginas estáticas, modifiqué la solución de @ EAMann de la siguiente manera:

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

Referencia de núcleo v3.4.2:
ligera diferencia de números de línea en 3.5 RC3, pero el código sigue siendo el mismo

/**
 * 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 );
    
respondido por el brasofilo 08.12.2012 - 15:18

Lea otras preguntas en las etiquetas