CPT를 기본 홈페이지로 어떻게 사용합니까?


20

사이트에 사용자 정의 게시물 유형을 많이 사용하여 사이트를 구성 할 클라이언트가 있습니다. 그러나 나는 그들이 요청한 홈페이지에 대한 바위와 힘든 곳 사이에 있습니다.

실제로, 홈 페이지는 워드 프레스 내의 특정 "페이지"의 스택입니다. 기본적으로 소개 , 블로그 , 회사 소개 , 포트폴리오연락처 페이지가 있습니다. 그것들은 모두 서로 쌓여있어 한 페이지에서 다른 페이지로 스크롤 할 수 있습니다.

첫 번째 본능은 페이지 ( Home )를 사용하고 페이지 슬러그를 허용하고 올바른 순서 (예 :)를 출력하는 단축 코드를 포함시키는 것 [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]입니다. 페이지는 사용자 정의 페이지 템플리트를 사용하여 배치하고 루프를 제어하며 페이지 왼쪽에 탐색을 추가합니다. 그러나 그 모든 것이 멍청한 것 같습니다.

최적의 솔루션 (라는 사용자 지정 게시 유형 작성하는 것입니다 스택 최종 사용자가 드래그 앤 드롭 페이지의 위치 및 레이아웃 및 탐색 등의 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 코드 감사합니다! 첫 페이지 제목이 Post of Post | 홈페이지 이름, 이것이 홈페이지 이름만으로 변경 될 수 있습니까?
INT

이것은 전혀 작동하지 않습니다 ... 서버 경고 / 오류 : wpa18013_add_pages_to_dropdown ()정의되지 않은 변수에
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 Khan

@Hameedullah-일단 선택하면 WordPress는 첫 페이지에 사용할 페이지를 표시하는 옵션을 업데이트합니다. 그런 다음 사용자가 첫 페이지를 방문하면 WordPress는 데이터베이스에서 동일한 옵션을 다시 읽습니다.
EAMann

@Hameedullah Khan 당신이 맞아요. 이것은 3.1 이전에 작동했으며 이제는 게시물의 퍼머 링크로 리디렉션되며 404를 얻습니다. 시간이 있었으면 좋겠다. :(
fuxia

5

왜 그냥 front-page.php일반 쿼리 / 루프를 사용하거나 (사용자 정의 테마 옵션이 프론트 페이지에 CPT를 표시하도록 설정된 경우) CPT를 기반으로 사용자 정의 쿼리 / 루프를 출력 템플릿 파일을 는 무엇입니까?

문제는 사용자에게 프론트 페이지를 정적 페이지로 설정하도록 지시하면서 프론트 페이지 출력을 제어하기 위해 별도의 테마 옵션을 작성해야한다는 것입니다.

작업을보다 쉽게하기 위해 register_setting설정 API 를 통해 호출 할 때 "읽기"옵션 그룹을 사용하여 테마 옵션을 설정 읽기에 연결하여 기존 프론트 페이지 옵션과 함께 표시 할 수 있습니다.


나는 간단한 솔루션과 칩을 좋아한다. 나는 당신의 것이 가장 좋다고 생각한다. Wordpress를 사용하면 첫 페이지 codex.wordpress.org/Template_Hierarchy#Home_Page_display에 대한 사용자 지정 템플릿을 사용할 수 있으며 그 내부에서 원하는 것을 수행 할 수 있습니다.
anmari

가장 유지 관리가 쉽고 간단한 솔루션입니다. 는 front-page.php워드 프레스 템플릿 계층 구조의 일부이기 때문에 자동으로 선택됩니다. 왜 이런 일이 발생했는지 기억할 필요가 없습니다 (또는 다음 사람에게 표시해야 함).
Odys

2

EAMann이 2011 년에 업데이트를 작성한 이후로 변경되었을 수 있으며 wpa18013_add_pages_to_dropdown () 함수가 더 이상 작동하지 않습니다. Dameer의 설명에서 언급했듯이이 함수는 현재 (2013 년 12 월) "wpa18013_add_pages_to_dropdown ()에 대한 인수 2 누락"오류를 발생시킵니다.

어쨌든 해결책은 두 번째 매개 변수없이 함수를 다시 작성하거나 내용을 확인하는 것이 었습니다. 전체 코드 블록은 다음과 같습니다.

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

위의 예에서 내가 추가 한 맞춤 게시물 유형은 "stack"이 아니라 "unbox_tabs"입니다.


1

이 기술 을 사용하여 플러그인의 템플릿을 포함시킵니다. 따라서 @ChipBennett의 솔루션은 적용되지 않습니다.

정적 페이지 목록의 플러그인에서 CPT ( ) 를 추가하기 위해 다음과 같이 @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 );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.