나쁜 소식을 전하는 사람을 싫어하지만 WordPress는 페이지 템플릿 기능을 v3.0 이상에서 "페이지" 게시 유형으로 하드 코딩합니다 (향후 버전에서는 변경 될 수 있지만 변경하려는 특정 이니셔티브는 없습니다) 그래서 이것은 코어를 해킹하지 않고 무언가를 해결하는 방법을 찾기 위해 고심하고있는 몇 번의 시간 중 하나입니다.)
내가 생각해 낸 해결책은 기본적으로 WordPress 핵심에서 관련 코드를 복사하여 필요에 맞게 수정하는 것입니다. 단계는 다음과 같습니다 (행 번호는 v3.0.1의 것임).
의page_attributes_meta_box()
라인 535 에서 함수 를 복사하고 적절하게 /wp-admin/includes/meta-boxes.php
수정하십시오.
add_meta_boxes
# 1에서 만든 메타 박스를 추가 할 후크 를 코딩하십시오.
get_page_templates()
166 번째 줄 에서 함수 를 복사하여/wp-admin/includes/theme.php
수정하십시오.
의page_template_dropdown()
2550 행 에서 기능 을 복사하고 적절하게 /wp-admin/includes/template.php
수정하십시오.
테마에 게시물 템플릿 을 추가하십시오 .
코드는 save_post
후크 저장에 포스트 템플릿 파일 이름으로 저장 가능합니다.
코드는 single_template
후크 관련 게시물에 대한 게시 템플릿의 로딩을 가능하게합니다.
이제 그것으로!
1. page_attributes_meta_box()
기능을 복사
첫 번째 단계 page_attributes_meta_box()
로의 라인 535 에서 함수 를 복사해야 /wp-admin/includes/meta-boxes.php
하며 이름을 변경하기로 선택했습니다 post_template_meta_box()
. 페이지 템플릿 만 요청했기 때문에 부모 게시물을 지정하고 순서를 지정하여 코드를 훨씬 간단하게 만드는 코드를 생략했습니다. 또한 page_template
의도하지 않은 커플 링으로 인한 비 호환성을 피하고 잠재적 인 비 호환성을 피하기 위해 객체 속성 을 재사용하려고 시도하는 대신 postmeta를 사용하기로했습니다 . 코드는 다음과 같습니다.
function post_template_meta_box($post) {
if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
$template = get_post_meta($post->ID,'_post_template',true);
?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
} ?>
<?php
}
2. add_meta_boxes
후크를 코딩
다음 단계는 add_meta_boxes
후크를 사용하여 메타 박스를 추가하는 것입니다 .
add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}
3. get_page_templates()
기능을 복사
페이지 템플릿과 게시물 템플릿을 구분하는 것이 타당하다고 생각했기 때문에의 라인 166을 get_post_templates()
기반으로 한 기능에 대한 필요성 get_page_templates()
이 /wp-admin/includes/theme.php
있습니다. 그러나이 Template Name:
페이지 템플릿을 사용하는 Post Template:
마커를 사용하는 대신 아래에서 볼 수 있는 마커를 사용 합니다.
또한 검사 필터링 functions.php
(하지 않도록하는 방법 get_page_templates()
!이없이 올바르게 작동 적 있지만, 무엇이든) 그리고 남은 건 오직 말씀을 변경 참조하는 것입니다 page
에 대한 post
도로 아래로 유지 보수 가독성을 위해 :
function get_post_templates() {
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];
$post_templates = array();
if ( is_array( $templates ) ) {
$base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );
foreach ( $templates as $template ) {
$basename = str_replace($base, '', $template);
if ($basename != 'functions.php') {
// don't allow template files in subdirectories
if ( false !== strpos($basename, '/') )
continue;
$template_data = implode( '', file( $template ));
$name = '';
if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
$name = _cleanup_header_comment($name[1]);
if ( !empty( $name ) ) {
$post_templates[trim( $name )] = $basename;
}
}
}
}
return $post_templates;
}
4. page_template_dropdown()
기능을 복사
마찬가지로 복사 page_template_dropdown()
라인 2550의에서 /wp-admin/includes/template.php
만들 post_template_dropdown()
단순히 전화를 변경 get_post_templates()
하는 대신 :
function post_template_dropdown( $default = '' ) {
$templates = get_post_templates();
ksort( $templates );
foreach (array_keys( $templates ) as $template )
: if ( $default == $templates[$template] )
$selected = " selected='selected'";
else
$selected = '';
echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
endforeach;
}
5. 게시물 템플릿 추가
다음 단계는 테스트 용 포스트 템플릿을 추가하는 것입니다. Post Template:
3 단계에서 언급 한 마커를 사용 single.php
하여 테마에서 복사 single-test.php
하고 다음 주석 헤더를 추가하십시오 ( 무언가 single-test.php
대신 수정하여 로드하지 말고로드하십시오 single.php
) .
/**
* Post Template: My Test Template
*/
1 단계에서 5 단계까지 1 단계를 완료하면 게시물 편집기 페이지에 "게시물 템플릿" 메타 박스가 나타납니다.
(출처 : mikeschinkel.com )
6. save_post
후크를 코딩
이제 편집기를 제곱했습니다. 사용자가 "게시"를 클릭하면 실제로 페이지 템플리트 파일 이름을 postmeta에 저장해야합니다. 그 코드는 다음과 같습니다.
add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
if ($post->post_type=='post' && !empty($_POST['post_template']))
update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}
7. single_template
후크를 코딩
마지막으로 새 게시물 템플릿을 사용하려면 실제로 WordPress를 가져와야합니다. single_template
할당 된 게시물에 대해 원하는 템플릿 이름을 연결 하고 반환하면됩니다.
add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
global $wp_query;
$post = $wp_query->get_queried_object();
if ($post) {
$post_template = get_post_meta($post->ID,'_post_template',true);
if (!empty($post_template) && $post_template!='default')
$template = get_stylesheet_directory() . "/{$post_template}";
}
return $template;
}
그게 다야!
참고 나는 것을 하지 않았다 고려 사용자 정의 포스트 유형 만 post_type=='post'
. 내 의견으로는 맞춤 게시물 유형을 다루는 것은 다른 게시물 유형을 차별화해야하며 지나치게 어렵지는 않지만 여기서 시도하지는 않았습니다.