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

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

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

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

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

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

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

21
23.05.2011, 17:05
5 ответов

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

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' );
11
19.02.2020, 21:56
  • 1
    , который я играл с таким фильтром также, но он должен быть ограничен размещенным на первой полосе запросом. И затем я был избит некоторым странным поведением/ошибками: Я получил всего 404 с. Так или иначе +1. :) –  fuxia♦ 24.05.2011, 04:49
  • 2
    Хорошая выгода. Дополнительное условное выражение в функции (удостоверяются post_type уже не установлен и это page_id не 0) предотвращает все 404 с. Я могу теперь выполнить запросы для всех моих пользовательских сообщений, всех моих сообщений и всех моих страниц без любой интерференции. –  EAMann 24.05.2011, 07:39
  • 3
    @EAmann спасибо за код! Это работает, как это должно, хотя это изменяет заголовок первой полосы к Заголовку Сообщения | имя Домашней страницы, это может быть изменено, чтобы просто быть именем Домашней страницы, в некоторым образом? –  INT 11.07.2012, 03:38
  • 4
    Это не работает вообще... предупреждения/ошибки сервера: Недостающий аргумент 2 для wpa18013_add_pages_to_dropdown () и Неопределенная переменная: r –  Dameer 22.10.2013, 14:16

Возможно, так? Усовершенствованная версия моего более раннего решения.

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 );
}
8
19.02.2020, 21:56
  • 1
    Это только для выбора пользовательского типа сообщения, но это не заставляет его отобразить тот пользовательский тип сообщения как первую полосу? или я пропускаю что-то? –  Hameedullah Khan 23.05.2011, 21:23
  • 2
    @Hameedullah - После того как Вы выбираете его, WordPress обновляет опцию, которая отмечает, какая страница, как предполагается, используется для первой полосы. Затем когда пользователь посещает первую полосу, WordPress читает ту же опцию назад из базы данных. –  EAMann 23.05.2011, 21:49
  • 3
    @Hameedullah прав. Это работало, прежде 3.1, теперь я перенаправляюсь к постоянной ссылке сообщения – и я получаю 404.Странно. Мне жаль, что у меня не было времени для этого. :( –  fuxia♦ 23.05.2011, 23:06

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

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

Для создания вещей легче Вы могли сцепить свою опцию Theme в чтение настроек, с помощью группы опции "Reading" в вызове к register_setting через Настройки API, так, чтобы это отобразилось с существующими опциями Front-Page.

5
19.02.2020, 21:56
  • 1
    мне действительно нравятся простые решения и Микросхема, я думаю Ваш, является лучшим. Wordpress допускает пользовательские шаблоны для первой полосы codex.wordpress.org/Template_Hierarchy#Home_Page_display, и затем можно сделать то, что каждый любит в этом. –  anmari 12.10.2011, 13:12
  • 2
    Это - самое удобное в сопровождении и простое решение. front-page.php выбран автоматически, потому что часть шаблонной иерархии Wordpress. Никакая потребность помнить, почему это происходит (или потребность отметить его для следующего человека). –  Odys 02.11.2014, 16:25

Я использую эту технику для включения шаблона от плагина. Так, решение @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 );
1
19.02.2020, 21:56

Я думаю, что что-то, возможно, изменилось, так как EAMann записал свое обновление в 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", а не "стеком".

3
19.02.2020, 21:56

Теги

Похожие вопросы