답변:
해당 템플릿을 재정의하는 것이 템플릿을 제거하는 것보다 훨씬 쉽습니다. 논리가가는 방식.
나는 그것이 효율적인 아이디어라고 주장하지 않지만 (여기 말) 편집 화면에서 빠져 나올 것입니다.
add_action('admin_head-post.php','remove_template');
function remove_template() {
global $wp_themes;
get_themes();
$templates = &$wp_themes['Twenty Ten']['Template Files'];
$template = trailingslashit( TEMPLATEPATH ).'onecolumn-page.php';
$key = array_search($template, $templates);
unset( $templates[$key] );
}
WordPress 3.9에는 theme_page_templates
필터가 도입되었습니다 .
Twenty Fourteen child 테마의 아래 예 functions.php
는 "기여자 페이지"템플리트를 제거하는 방법을 보여줍니다.
function tfc_remove_page_templates( $templates ) {
unset( $templates['page-templates/contributors.php'] );
return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );
@Rarst의 답변을 확장하여 다음은 특정 테마와 관련이 없지만 자신의 자식 테마의 functions.php 내에서 사용하여 제거하려는 부모 테마 페이지 템플릿을 압축하는 더 일반적인 접근 방식입니다.
function remove_template( $files_to_delete = array() ){
global $wp_themes;
// As convenience, allow a single value to be used as a scalar without wrapping it in a useless array()
if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );
// remove TLA if it was provided
$files_to_delete = preg_replace( "/\.[^.]+$/", '', $files_to_delete );
// Populate the global $wp_themes array
get_themes();
$current_theme_name = get_current_theme();
// Note that we're taking a reference to $wp_themes so we can modify it in-place
$template_files = &$wp_themes[$current_theme_name]['Template Files'];
foreach ( $template_files as $file_path ){
foreach( $files_to_delete as $file_name ){
if ( preg_match( '/\/'.$file_name.'\.[^.]+$/', $file_path ) ){
$key = array_search( $file_path, $template_files );
if ( $key ) unset ( $template_files[$key] );
}
}
}
}
따라서 자식 테마의 functions.php 파일에서 다음과 같이 사용할 수 있습니다.
add_action( 'admin_head-post.php', 'remove_parent_templates' );
function remove_parent_templates() {
remove_template( array( "showcase.php", "sidebar-page" ) );
}
여기서는 원하지 않는 경우 ".php"부분을 전달할 필요가 없음을 보여줍니다.
또는 : remove_template( "sidebar-page" );
-단일 파일 만 수정하려는 경우 배열을 전달할 필요가 없습니다.
WP 코어 (3.9)에는 페이지 템플릿을 제거하는 새로운 필터가 있습니다. 어린이 테마에서 사용할 수 있습니다.
TwentyTen에서 이것을 달성하는 방법은 다음과 같습니다 (WP 3.9에서 테스트).
add_filter( 'theme_page_templates', 'my_remove_page_template' );
function my_remove_page_template( $pages_templates ) {
unset( $pages_templates['onecolumn-page.php'] );
return $pages_templates;
}
https://core.trac.wordpress.org/changeset/27297
http://boiteaweb.fr/theme_page_templates-hook-semaine-16-8033.html
2012 년 7 월 10 일-WordPress 3.4.1
이전 답변은 작동하지 않으며 Rarst는 다음과 같이 말했습니다.
테마 관련 내부는 3.4에서 주요 리팩토링 및 API 변경을 거쳤으므로 많은 오래된 것들이 작동하지 않습니다.
add_action('admin_head', 'wpse_13671_script_enqueuer');
function wpse_13671_script_enqueuer() {
global $current_screen;
/**
* /wp-admin/edit.php?post_type=page
*/
if('edit-page' == $current_screen->id)
{
?>
<script type="text/javascript">
jQuery(document).ready( function($) {
$("a.editinline").live("click", function () {
var ilc_qe_id = inlineEditPost.getId(this);
setTimeout(function() {
$('#edit-'+ilc_qe_id+' select[name="page_template"] option[value="showcase.php"]').remove();
}, 100);
});
$('#doaction, #doaction2').live("click", function () {
setTimeout(function() {
$('#bulk-edit select[name="page_template"] option[value="showcase.php"]').remove();
}, 100);
});
});
</script>
<?php
}
/**
* /wp-admin/post.php?post=21&action=edit
*/
if( 'page' == $current_screen->id )
{
?>
<script type="text/javascript">
jQuery(document).ready( function($) {
$('#page_template option[value="showcase.php"]').remove();
});
</script>
<?php
}
}
올바른 경로를 따르면 여기에 "조치"가 발생하는 곳 ( /wp-includes/class-wp-theme.php
)이 있으며 여기에 연결할 것이없는 것처럼 보입니다 ...
/**
* Returns the theme's page templates.
*
* @since 3.4.0
* @access public
*
* @return array Array of page templates, keyed by filename, with the value of the translated header name.
*/
public function get_page_templates() {
// If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) )
return array();
$page_templates = $this->cache_get( 'page_templates' );
if ( ! is_array( $page_templates ) ) {
$page_templates = array();
$files = (array) $this->get_files( 'php', 1 );
foreach ( $files as $file => $full_path ) {
$headers = get_file_data( $full_path, array( 'Template Name' => 'Template Name' ) );
if ( empty( $headers['Template Name'] ) )
continue;
$page_templates[ $file ] = $headers['Template Name'];
}
$this->cache_add( 'page_templates', $page_templates );
}
if ( $this->load_textdomain() ) {
foreach ( $page_templates as &$page_template ) {
$page_template = $this->translate_header( 'Template Name', $page_template );
}
}
if ( $this->parent() )
$page_templates += $this->parent()->get_page_templates();
return $page_templates;
}