Як ви використовуєте 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.