Comment utilisez-vous un CPT comme page d'accueil par défaut?

20

J'ai un client dont le site va strongment utiliser des types de publication personnalisés pour configurer son site. Mais je suis entre le marteau et l'enclume pour la page d'accueil demandée.

En réalité, la page d'accueil sera une pile de "pages" spécifiques au sein de WordPress. En gros, il y aura des pages pour: Intro , Blog , À propos de nous , Portfolio et Contacter Nous . Ils seront tous empilés les uns sur les autres pour que vous puissiez faire défiler les pages.

Mon premier réflexe consistait simplement à utiliser une page (appelée Accueil ) et à incorporer un shortcode acceptant les slug de page et indiquant le bon ordre (à savoir [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder] ). La page utiliserait un modèle de page personnalisé pour disposer les éléments, contrôler la boucle et ajouter une navigation sur le côté gauche de la page. Mais cela semble tout klunky.

Ma solution idéale consisterait à créer un type de publication personnalisé (appelé Pile ) permettant à l'utilisateur final de positionner les pages avec un glisser-déposer et de faire en sorte que le CPT prenne soin de la mise en page et de la navigation et autres.

Le problème avec ma solution idéale est le paramétrage. WordPress vous permet de sélectionner une page pour la page d'accueil par défaut du site. Mais cela est lié à un type de publication page , et je ne sais pas trop à quel branchement modifier pour que les utilisateurs puissent également sélectionner une pile comme page d'accueil par défaut. .

Alors, où dois-je me connecter pour ajouter un CPT au menu déroulant des pages disponibles pour la page d'accueil par défaut?

    
posée EAMann 23.05.2011 - 16:05

5 réponses

11

Merci à @toscho pour la réponse utile, mais cela me paraissait un peu fictif, alors j'ai fouillé un peu et découvert que je pouvais ajouter un filtre à la place:

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

Mettre à jour

Après avoir ajouté le code ci-dessus, j'ai effectivement pu utiliser un type de publication personnalisé comme page d'accueil, mais WordPress redirige les liens permanents, car ce n'est pas un type de publication "page". Donc, http://localhost/test serait redirigé vers http://localhost/test/stacks/home-stack , ce qui n’était pas ce que je voulais.

Cependant, cette action a été corrigée et le type de publication personnalisé ainsi que les pages de la page d'accueil ont été interrogés:

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' );
    
réponse donnée EAMann 24.05.2011 - 01:28
8

Peut-être que oui? Version affinée de ma solution antérieure .

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 );
}
    
réponse donnée fuxia 23.05.2011 - 16:21
5

Pourquoi ne pas simplement créer un fichier modèle front-page.php , qui utilise une requête / boucle normale, ou (si une option de thème personnalisé est définie pour afficher le CPT sur la page d'accueil), génère une requête / boucle personnalisée, basée sur sur le CPT?

Le problème, c'est que vous devez créer une option de thème distincte pour contrôler la sortie de la page de garde, tout en demandant aux utilisateurs de définir Front page sur une page statique.

Pour simplifier les choses, vous pouvez associer votre option Thème à la lecture de paramètres, à l'aide du groupe d'options "Lecture" de votre appel à register_setting via l'API de configuration, afin qu'il s'affiche avec les options de page d'accueil existantes.

    
réponse donnée Chip Bennett 23.05.2011 - 17:12
2

Je pense que quelque chose a changé depuis qu'EAMann a écrit sa mise à jour en 2011 et que la fonction wpa18013_add_pages_to_dropdown () qu'il fournit ne fonctionne plus. Comme mentionné dans un commentaire de Dameer, cette fonction génère actuellement (décembre 2013) une erreur "Argument manquant 2 pour wpa18013_add_pages_to_dropdown ()"

La solution, pour moi en tout cas, était de réécrire la fonction sans ce deuxième paramètre, ou de vérifier son contenu. Le bloc de code complet devient alors:

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

Veuillez noter que dans l'exemple ci-dessus, le type de publication personnalisé que j'ajoute est "unbox_tabs" plutôt que "pile".

    
réponse donnée Matthew Bernhardt 12.12.2013 - 16:32
1

J'utilise cette technique pour inclure un modèle à partir d'un plug-in. La solution de @ ChipBennett ne s'applique donc pas.

Pour ajouter les CPT ( 'hierarchical' => 'false' ) du plug-in dans la liste des pages statiques, j'ai modifié la solution de @ EAMann comme suit:

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

Référence de base v3.4.2:
légère différence de numéros de ligne dans la version 3.5 RC3, mais le code reste le même

/**
 * 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 );
    
réponse donnée brasofilo 08.12.2012 - 15:18

Lire d'autres questions sur les étiquettes