WP - 플러그인 디렉토리의 파일을 커스텀 페이지 템플릿으로 사용하시겠습니까?
플러그인 디렉토리의 파일을 커스텀 페이지 템플릿으로 사용할 수 있습니까?
또한 플러그인에서 페이지를 작성하려면 어떻게 해야 합니까?
테마를 기반으로 클라이언트를 위한 플러그인을 개발하고 있는데, 그는 이 플러그인이 홈페이지에서 테마를 사용하면서 판매 페이지를 만들길 원합니다.이 제품은 제가 그를 위해 만들고 있는 제품이기 때문에 플러그인 전체를 자동화해야 합니다.
이게 가능합니까?
편집
플러그인 메인 파일에 활성화/비활성화 후크가 있는데 작동하지 않습니다.코드는 다음과 같습니다.
$filename = __FILE__;
register_activation_hook($filename, 'superActivation');
register_deactivation_hook($filename, 'superDeactivation');
global $myFile; global $fh; global $stringData; global $filename;
$myFile = "testFile.txt";
$stringData = "Testing\n";
$fh = fopen($myFile, 'w') or die("can't open file");
function superActivation() {
global $myFile; global $fh; global $stringData; global $filename;
fwrite($fh, $stringData);
fclose($fh);
}
function superDeactivation() {
$myFile = "testFile.txt";
unlink($myFile);
}
이를 수행하려면 template_redirect 훅을 사용합니다.템플릿 폴더에 사용자 지정 게시 유형의 템플릿이 없는 경우 수동으로 테마에 있는 템플릿으로 바꾸기 위한 코드입니다.이 파일을 플러그인 파일에 넣은 다음 기본 테마 파일로 파일이라는 폴더를 플러그인 아래에 넣습니다.
//Template fallback
add_action("template_redirect", 'my_theme_redirect');
function my_theme_redirect() {
global $wp;
$plugindir = dirname( __FILE__ );
//A Specific Custom Post Type
if ($wp->query_vars["post_type"] == 'product') {
$templatefilename = 'single-product.php';
if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
$return_template = TEMPLATEPATH . '/' . $templatefilename;
} else {
$return_template = $plugindir . '/themefiles/' . $templatefilename;
}
do_theme_redirect($return_template);
//A Custom Taxonomy Page
} elseif ($wp->query_vars["taxonomy"] == 'product_categories') {
$templatefilename = 'taxonomy-product_categories.php';
if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
$return_template = TEMPLATEPATH . '/' . $templatefilename;
} else {
$return_template = $plugindir . '/themefiles/' . $templatefilename;
}
do_theme_redirect($return_template);
//A Simple Page
} elseif ($wp->query_vars["pagename"] == 'somepagename') {
$templatefilename = 'page-somepagename.php';
if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
$return_template = TEMPLATEPATH . '/' . $templatefilename;
} else {
$return_template = $plugindir . '/themefiles/' . $templatefilename;
}
do_theme_redirect($return_template);
}
}
function do_theme_redirect($url) {
global $post, $wp_query;
if (have_posts()) {
include($url);
die();
} else {
$wp_query->is_404 = true;
}
}
페이지 캐시를 조작하면 플러그인에서 페이지 템플릿을 매우 쉽게 추가할 수 있습니다.
커스터마이즈 하려면 __construct 메서드 내에서 다음 코드 블록을 편집하기만 하면 됩니다.
$this->templates = array(
'goodtobebad-template.php' => 'It\'s Good to Be Bad',
);
이것은 플러그인용으로 설계되어 있습니다(템플릿 파일은 플러그인의 루트 디렉토리에서 검색됩니다).필요에 따라 변경할 수 있습니다.이 솔루션에 대한 자세한 내용은 제 튜토리얼 전문 http://www.wpexplorer.com/wordpress-page-templates-plugin/을 참조하십시오.이러한 파일도 테마에 직접 포함되는 형식과 완전히 동일합니다.
풀코드
class PageTemplater {
/**
* A Unique Identifier
*/
protected $plugin_slug;
/**
* A reference to an instance of this class.
*/
private static $instance;
/**
* The array of templates that this plugin tracks.
*/
protected $templates;
/**
* Returns an instance of this class.
*/
public static function get_instance() {
if( null == self::$instance ) {
self::$instance = new PageTemplater();
}
return self::$instance;
}
/**
* Initializes the plugin by setting filters and administration functions.
*/
private function __construct() {
$this->templates = array();
// Add a filter to the attributes metabox to inject template into the cache.
add_filter(
'page_attributes_dropdown_pages_args',
array( $this, 'register_project_templates' )
);
// Add a filter to the save post to inject out template into the page cache
add_filter(
'wp_insert_post_data',
array( $this, 'register_project_templates' )
);
// Add a filter to the template include to determine if the page has our
// template assigned and return it's path
add_filter(
'template_include',
array( $this, 'view_project_template')
);
// Add your templates to this array.
$this->templates = array(
'goodtobebad-template.php' => 'It\'s Good to Be Bad',
);
}
/**
* Adds our template to the pages cache in order to trick WordPress
* into thinking the template file exists where it doens't really exist.
*
*/
public function register_project_templates( $atts ) {
// Create the key used for the themes cache
$cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );
// Retrieve the cache list.
// If it doesn't exist, or it's empty prepare an array
$templates = wp_get_theme()->get_page_templates();
if ( empty( $templates ) ) {
$templates = array();
}
// New cache, therefore remove the old one
wp_cache_delete( $cache_key , 'themes');
// Now add our template to the list of templates by merging our templates
// with the existing templates array from the cache.
$templates = array_merge( $templates, $this->templates );
// Add the modified cache to allow WordPress to pick it up for listing
// available templates
wp_cache_add( $cache_key, $templates, 'themes', 1800 );
return $atts;
}
/**
* Checks if the template is assigned to the page
*/
public function view_project_template( $template ) {
global $post;
if (!isset($this->templates[get_post_meta(
$post->ID, '_wp_page_template', true
)] ) ) {
return $template;
}
$file = plugin_dir_path(__FILE__). get_post_meta(
$post->ID, '_wp_page_template', true
);
// Just to be safe, we check if the file exist first
if( file_exists( $file ) ) {
return $file;
}
else { echo $file; }
return $template;
}
}
add_action( 'plugins_loaded', array( 'PageTemplater', 'get_instance' ) );
자세한 내용은 이 튜토리얼을 참조하십시오.
http://www.wpexplorer.com/wordpress-page-templates-plugin/
이것이 당신이 하고 싶은 일에 도움이 되기를 바랍니다:)
데이비드가 위에 올린 코드는 나에게 거의 효과가 있다. 하지만 그것은 나를 위해 모든 게시물과 페이지를 덮는 것 같다.아래 코드는 메인 플러그인 파일에 의해 작성된 단일 투고 유형에 템플릿을 추가할 때 유용합니다.
function get_book_post_type_template($single_template) {
global $post;
if ($post->post_type == 'books') {
$single_template = dirname( __FILE__ ) . '/themefiles/single-books.php';
}
return $single_template;
}
add_filter( "single_template", "get_book_post_type_template" ) ;
그러나 post_type이 없거나 post_type = 페이지가 있는 커스텀 페이지 템플릿에서 작동하는데 어려움을 겪고 있습니다. 예를 들어 커스텀 페이지는 내 커스텀 포스트를 보기 위한 보조 멤버 로그인 페이지입니다.제 경우 이 파일을 제 계정이라고 부릅니다.php 및 나는 그것을 themefiles라는 이름의 플러그인 폴더 내의 하위 폴더에 포함시켰습니다.
//Add Page and Post Template Files to Current Theme
add_action("template_redirect", 'my_account_redirect');
function my_account_redirect() {
global $wp;
//Set myAccount Custom Page Template
if (isset($wp->query_vars['pagename'] ) == "myaccount") {
$templatefilename = 'myAccount.php';
if (file_exists(dirname( __FILE__ ) . '/themefiles/' . $templatefilename)) {
$return_template = dirname( __FILE__ ) . '/themefiles/' . $templatefilename;
}
do_account_redirect($return_template);
}
}
//Finishing setting templates
function do_account_redirect($url) {
global $post, $wp_query;
if (have_posts()) {
include($url);
die();
} else {
$wp_query->is_404 = true;
}
}
위의 코드를 실행하면 홈을 제외한 모든 페이지에 내 계정 템플릿이 표시됩니다.홈은 정적 페이지가 아닌 블로그 롤로 설정되어 있기 때문입니다.
user1912899 에는 회답할 수 없지만, 그들의 추천이 가장 우아한 해결책인 것 같습니다.커스텀 템플릿을 사용하여 single-post.php를 덮어쓰기 위해 다음 코드를 구현했습니다.이것은 플러그인에 추가하는 모든 커스텀 single-***.php 파일에 적용됩니다.존재하지 않으면 WordPress가 일반적으로 사용하는 것으로 귀결됩니다.
add_action('template_include', 'my_template_include');
function my_template_include($template) {
$file = dirname( __FILE__ ).'/theme/single-'.get_post_type().'.php';
if(file_exists($file)) {
$template = $file;
}
return $template;
}
언급URL : https://stackoverflow.com/questions/4647604/wp-use-file-in-plugin-directory-as-custom-page-template
'source' 카테고리의 다른 글
엄격한 기준:'의 선언은 '와 호환되어야 합니다. (0) | 2023.03.20 |
---|---|
JSON.stringify가 RangeError를 슬로우합니다.거대한 개체의 문자열 길이가 잘못되었습니다. (0) | 2023.03.20 |
angularjs: 필터링된 데이터를 가져올 때 $filter가 정의되지 않았습니다. (0) | 2023.03.20 |
Ajax 요청을 통해 JSON과 함께 Select 2를 사용하는 방법 (0) | 2023.03.20 |
워드프레스 위젯을 프로그래밍 방식으로 표시하는 방법 (0) | 2023.03.20 |