Jak używasz CPT jako domyślnej strony głównej?

20

Mam klienta, którego witryna będzie intensywnie wykorzystywać niestandardowe typy postów do konfigurowania swojej witryny. Ale jestem między kamieniem a twardym miejscem dla ich żądanej strony głównej.

W rzeczywistości strona główna będzie stosem określonych „stron” w WordPress. Zasadniczo będą dostępne strony: Intro , Blog , O nas , Portfolio i Kontakt . Wszystkie zostaną ułożone jeden na drugim, aby można było przewijać strony.

Moim pierwszym instynktem było po prostu użycie strony (zwanej Home ) i osadzenie krótkiego kodu, który akceptuje ślimaki stron i wyświetla odpowiednią kolejność (tj [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder].). Strona używałaby niestandardowego szablonu strony do układania elementów, kontrolowania pętli i dodawania nawigacji po lewej stronie strony. Ale to wszystko wydaje się niezdarne.

Moim idealnym rozwiązaniem byłoby stworzenie niestandardowego typu postu (zwanego Stackem ), który pozwoli użytkownikowi końcowemu na pozycjonowanie stron metodą przeciągania i upuszczania, a CPT zajmie się układem i nawigacją.

Problem z moim idealnym rozwiązaniem to ustawienia. WordPress pozwala wybrać stronę domyślnej strony głównej witryny. Ale jest to związane ze stroną typu post i nie jestem pewien, gdzie się podłączyć, aby to zmodyfikować, aby użytkownicy mogli również wybrać stos jako domyślną stronę główną.

Gdzie mam się podłączyć, aby dodać CPT do listy dostępnych stron domyślnej strony głównej?

EAMann
źródło

Odpowiedzi:

11

Dzięki @toscho za przydatną odpowiedź, ale było to dla mnie trochę hackingowe, więc trochę się rozejrzałem i pomyślałem, że mogę zamiast tego dodać filtr:

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

Aktualizacja

Po dodaniu powyższego kodu rzeczywiście mogłem użyć niestandardowego typu postu jako strony głównej, ale WordPress przekierowywałby linki bezpośrednie, ponieważ nie był to typ postu „strona”. http://localhost/testPrzekierowałbym więc na to http://localhost/test/stacks/home-stack, czego nie chciałem.

Dodanie tej akcji naprawiło to i pyta o mój niestandardowy typ postu wraz ze stronami strony głównej:

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' );
EAMann
źródło
Grałem też z takim filtrem, ale musi on być ograniczony do zapytania na pierwszej stronie. A potem zostałem pobity przez dziwne zachowanie / błędy: dostałem tylko 404s. W każdym razie +1. :)
fuxia
Dobry chwyt Dodatkowy warunek wewnątrz funkcji (upewnij się, że post_typenie jest jeszcze ustawiony, a page_idto nie jest 0) uniemożliwia wszystkie 404. Mogę teraz uruchamiać zapytania dla wszystkich moich niestandardowych postów, wszystkich moich postów i wszystkich stron bez żadnej ingerencji.
EAMann
@EAmann Dzięki za kod! Działa tak, jak powinien, choć zmienia tytuł strony tytułowej na Tytuł postu Nazwa strony głównej, czy można to w jakiś sposób zmienić na nazwę strony głównej?
INT
To w ogóle nie działa ... ostrzeżenia / błędy serwera: brak argumentu 2 dla wpa18013_add_pages_to_dropdown () i zmiennej niezdefiniowanej: r
Dameer
8

Może tak? Udoskonalona wersja mojego wcześniejszego rozwiązania .

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 );
}
fuxia
źródło
To jest tylko wybór niestandardowego typu postu, ale to nie oznacza, że ​​wyświetla ten niestandardowy typ posta jako stronę główną? czy coś mi brakuje?
Hameedullah Khan
@Hameedullah - Po wybraniu WordPress aktualizuje opcję oznaczającą, która strona ma być użyta na stronie głównej. Następnie, gdy użytkownik odwiedza stronę główną, WordPress odczytuje tę samą opcję z bazy danych.
EAMann
@Hameedullah Khan Masz rację. To działało przed 3.1, teraz jestem przekierowywany do bezpośredniego linku do postu - i otrzymuję 404. Dziwne. Chciałbym mieć na to czas. :(
fuxia
5

Dlaczego po prostu nie utworzyć front-page.phppliku szablonu, który używa normalnego zapytania / pętli lub (jeśli opcja Motyw niestandardowy jest ustawiona do wyświetlania CPT na stronie głównej), wyświetla niestandardowe zapytanie / pętlę na podstawie CPT?

Problem polega na tym, że musiałbyś utworzyć osobną opcję Motywu, aby kontrolować wyjście strony głównej, a jednocześnie pouczyć użytkowników, aby ustawić stronę główną na stronę statyczną.

Aby to ułatwić, możesz podłączyć opcję motywu do czytania ustawień, używając grupy opcji „Czytanie” w swoim wywołaniu register_settingza pośrednictwem interfejsu API ustawień, aby wyświetlał się z istniejącymi opcjami strony głównej.

Chip Bennett
źródło
Lubię proste rozwiązania, a Chip uważam, że twoje są najlepsze. Wordpress zezwala na niestandardowe szablony dla strony tytułowej codex.wordpress.org/Template_Hierarchy#Home_Page_display, a następnie można robić w nim wszystko, co się chce.
anmari
Jest to najbardziej łatwe w utrzymaniu i proste rozwiązanie. front-page.phpWybierany jest automatycznie, ponieważ jest częścią hierarchii szablonu wordpress. Nie musisz pamiętać, dlaczego tak się dzieje (lub musisz zaznaczyć to dla następnej osoby).
Odys
2

Myślę, że coś mogło się zmienić, odkąd EAMann napisał swoją aktualizację w 2011 roku, a funkcja wpa18013_add_pages_to_dropdown () już nie działa. Jak wspomniano w komentarzu Dameera, ta funkcja obecnie (grudzień 2013 r.) Zgłasza błąd „Brak argumentu 2 dla wpa18013_add_pages_to_dropdown ()”

Dla mnie rozwiązaniem było przepisanie funkcji bez tego drugiego parametru lub sprawdzenie jego zawartości. Pełny blok kodu staje się wtedy:

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

Pamiętaj, że w powyższym przykładzie niestandardowy typ wpisu, który dodaję, to „unbox_tabs” zamiast „stack”.

Matthew Bernhardt
źródło
1

Korzystam z tej techniki, aby dołączyć szablon z wtyczki. Tak więc rozwiązanie @ ChipBennett nie ma zastosowania.

Aby dodać CPT ( ) z wtyczki do listy stron statycznych, zmodyfikowałem rozwiązanie @ EAMann w następujący sposób: 'hierarchical' => 'false'

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

Odniesienie rdzenia v3.4.2:
niewielka różnica numerów linii w 3.5 RC3, ale kod pozostaje ten sam

/**
 * 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 );
brasofilo
źródło