Как использовать CPT в качестве домашней страницы по умолчанию?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/18013

Вопрос

У меня есть клиент, который будет использовать пользовательские типы публикаций для настройки своего сайта. Но я между камнем и тяжелым местом для их запрошенной домашней страницы.

На самом деле домашняя страница будет стопкой конкретных «страниц» в WordPress. По сути, будут страницы для: вступление, Блог, О нас, портфолио, а также Свяжитесь с нами. Анкет Все они будут сложены друг на друга, чтобы вы могли прокрутить с одной страницы на другую.

Моим первым инстинктом было просто использовать страницу (называемая Дом) и внедряет шорт -код, который принимает слизняки страниц и выводит правильный порядок (т.е. [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]) На странице будет использоваться пользовательский шаблон страницы, чтобы выложить вещи, управлять циклом и добавлять навигацию в левую сторону страницы. Но все это кажется Клунки.

Мой идеал Решение будет заключаться в создании пользовательского типа поста (называемый Куча) Это позволяет конечному пользователю позиционировать страницы с помощью перетаскивания и заставить CPT позаботиться о макете, навигации и тому подобном.

Проблема с моим идеальным решением - это настройки. WordPress позволяет выбрать страницу для домашней страницы по умолчанию сайта. Но он привязан к типу поста страница, и я не уверен, где зацепить это, чтобы изменить это, чтобы пользователи также могли выбрать Куча Как домашняя страница по умолчанию.

Итак, где мне зацепить, чтобы добавить CPT к выпадению доступных страниц для домашней страницы по умолчанию?

Это было полезно?

Решение

Спасибо @toscho за полезный ответ, но это было немного взломанным для меня, поэтому я немного засунул и понял, что вместо этого я мог добавить фильтр:

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

Обновлять

После добавления приведенного выше кода я был, действительно, мог использовать пользовательский тип поста в качестве домашней страницы, но WordPress перенаправлял постоянные ссылки, потому что это был не тип «страницы». Так http://localhost/test перенаправляется на http://localhost/test/stacks/home-stack, что я не хотел.

Однако добавление этого действия исправило это и запрашивает мой пользовательский тип поста вместе со страницами для домашней страницы:

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

Другие советы

Может быть, так? Уточненная версия Мое раннее решение.

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

Почему бы просто не создать front-page.php Файл шаблона, который использует либо обычный запрос/цикл, или (если настроена на пользовательскую опцию темы для отображения CPT на первой странице), выводит пользовательский запрос/цикл, на основе CPT?

Проблема заключается в том, что вам придется создать отдельную опцию темы, чтобы управлять выводом на первой полосе, в то же время инструктируя пользователей установить первую страницу на статическую страницу.

Чтобы облегчить ситуацию, вы можете подключить вариант своей темы к чтению настроек, используя группу опций для чтения »в своем звонке к register_setting через API настройки, так что он отображается с существующими параметрами на первой полосе.

Я думаю, что, возможно, что -то изменилось с тех пор, как Иманн написал свое обновление в 2011 году, и функция WPA18013_ADD_PAGES_TO_DROPDOWN (), которую он поставляет, больше не работает. Как упомянуто в комментарии Dameer, эта функция в настоящее время (декабрь 2013 г.) выбрасывает ошибку «отсутствующий аргумент 2 для wpa18013_add_pages_to_dropdown ()»

В любом случае, решением было переписать функцию без этого второго параметра или проверку его содержимого. Полный блок кода становится:

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

Обратите внимание, что в приведенном выше примере пользовательский тип поста, который я добавляю, является «UNBOX_TABS», а не «стек».

я использую эта техника Чтобы включить шаблон из плагина. Таким образом, решение @Chipbennett не применяется.

Чтобы добавить CPT ( 'hierarchical' => 'false' ) Из плагина в списке статических страниц я изменил решение @eamann следующим образом:

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

Ссылка на основное значение v3.4.2:
небольшая разница в номерах строк в 3,5 RC3, но код остается прежним

/**
 * 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 );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top