Як ви використовуєте CPT як домашню сторінку за замовчуванням?


20

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

Насправді домашня сторінка буде складом певних "сторінок" в WordPress. В основному, будуть сторінки для: Intro , Blog , About Us , Portfolio та Contact Us . Усі вони будуть розташовані один на одного, так що ви можете прокручувати одну сторінку на іншу.

Перший мій інстинкт полягав у тому, щоб просто скористатися сторінкою (називається Головна ) та вставити короткий код, який приймає журнали сторінки та виводить належний порядок (тобто [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]). Сторінка використовує спеціальний шаблон сторінки для розміщення речей, керування циклом та додавання навігації в лівій частині сторінки. Але це все здається klunky.

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

Проблема мого ідеального рішення - налаштування. WordPress дозволяє вибрати сторінку для домашньої сторінки за замовчуванням сайту. Але вона прив’язана до сторінки публікації типу , і я не знаю, куди підключити, щоб змінити це, щоб користувачі могли також вибрати стек як домашню сторінку за замовчуванням.

Отже, куди я можу підключитися, щоб додати CPT до випадаючих доступних сторінок для домашньої сторінки за замовчуванням?

Відповіді:


11

Дякую @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' );

Я теж грав з таким фільтром, але він повинен бути обмежений запитом на головній сторінці. І тоді мене побили якісь дивні поведінки / помилки: мені вийшло всього 404 роки. У будь-якому разі +1. :)
— fuxia

Хороший улов. Додаткова умовна функція (переконайтесь, що post_typeвона вже не встановлена, і page_idце не 0) заважає всім 404. Тепер я можу запускати запити для всіх моїх спеціальних публікацій, усіх моїх публікацій та всіх моїх сторінок без будь-яких втручань.
— EAMann

@EAmann Дякую за код! Він працює як слід, хоча змінює заголовок титульної сторінки на Назва допису | Назва домашньої сторінки, чи можна це якось змінити лише на ім’я домашньої сторінки?
— INT

Це взагалі не працює ... попередження / помилки сервера: Відсутній аргумент 2 для wpa18013_add_pages_to_dropdown () та Невизначена змінна: r
— Dameer

8

Може так? Вдосконалена версія мого попереднього рішення .

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

Це лише для вибору користувальницького типу публікації, але це не робить його відображенням спеціального типу публікації як головну сторінку? чи я щось пропускаю?
— Хамедулла хан

@Hameedullah - Після її вибору WordPress оновлює опцію, яка позначає, яка сторінка повинна використовуватися для титульної сторінки. Потім, коли користувач відвідує головну сторінку, WordPress зчитує той самий варіант назад із бази даних.
— EAMann

@Hameedullah Khan Ви маєте рацію. Це працювало раніше 3.1, тепер я переспрямований на постійну посилання - і я отримую 404. Дивно. Я б хотів, щоб у мене був час на це. :(
— фуксія

5

Чому б просто не створити front-page.phpфайл шаблону, який використовує звичайний запит / цикл, або (якщо налаштована спеціальна опція теми для відображення CPT на головній сторінці), виводить власний запит / цикл на основі CPT?

Проблема полягає в тому, що вам доведеться створити окремий параметр Тема для керування виводом Front Front, в той же час доручаючи користувачам встановлювати Front Page на статичну сторінку.

Щоб полегшити ситуацію, ви можете підключити свій параметр "Тема" для читання налаштувань, використовуючи групу опцій "Читання" у своєму дзвінку register_settingчерез API налаштувань, щоб він відображався з існуючими параметрами Front-Page.


Мені подобаються прості рішення, і Chip я думаю, що ваш найкращий. Wordpress дозволяє створювати власні шаблони для титульної сторінки codex.wordpress.org/Template_Hierarchy#Home_Page_display, і тоді ви можете робити все, що вам подобається всередині цього.
— anmari

Це найбільш рентабельне та найпростіше рішення. Вибір front-page.phpвибирається автоматично, оскільки є частиною ієрархії шаблонів wordpress. Не потрібно пам’ятати, чому це відбувається (або потрібно позначити це для наступної людини).
— Одіс

2

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


1

Я використовую цю техніку, щоб включити шаблон із плагіна. Отже, рішення @ ChipBennett не застосовується.

Щоб додати CPT's ( ) з плагіна до списку Static Pages, я змінив рішення @ EAMann таким чином: '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' );
}

Основна посилання 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 );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.