私はプラグインに取り組んでいます。プラグインはカスタム投稿タイプを "product"にします。まず私はtemplate_redirect
アクションを使ってシングルページとカテゴリページにリダイレクトします。
これが私のtemplate_redirectコードです:
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);
}
if (is_tax('prodcategories')) {
$templatefilename = 'taxonomy-prodcategories.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;
}
}
それは完璧に働いています。しかし、今私はtemplate_include
フィルタを使用しようとしていますが、それがうまくいっていない私のサイトは空白になります。
これがtemplate_includeのコードです。
add_filter("template_include", 'my_theme_redirect');
function my_theme_redirect($templatefilename) {
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;
}
return $return_template;
}
if (is_tax('prodcategories')) {
$templatefilename = 'taxonomy-prodcategories.php';
if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
$return_template = TEMPLATEPATH . '/' . $templatefilename;
} else {
$return_template = $plugindir . '/themefiles/' . $templatefilename;
}
return $return_template;
}
}
function do_theme_redirect($url) {
global $post, $wp_query;
if (have_posts()) {
include($url);
die();
} else {
$wp_query->is_404 = true;
}
}
私がうまくいかないところへの提案
さて、私は自分でやりました。
上記のコードをすべて削除して、このコードを書きます。それは私のために完璧に機能します
コード:
function template_chooser($template){
global $wp_query;
$plugindir = dirname(__FILE__);
$post_type = get_query_var('post_type');
if( $post_type == 'product' ){
return $plugindir . '/themefiles/single-product.php';
}
if (is_tax('prodcategories')) {
return $plugindir . '/themefiles/taxonomy-prodcategories.php';
}
return $template;
}
add_filter('template_include', 'template_chooser');
これはもっと安全な方法です。
add_filter( 'template_include', 'wpse138858_woocommerce_category_archive_template');
function wpse138858_woocommerce_category_archive_template( $original_template ) {
// we're loading the template conditionally,
global $post;
if (is_archive() && get_post_type($post)=='ym_package') {
// you've to create the template you want to use here first
return get_template_directory().'/archive-ym_package.php';
}
else if(is_archive() && get_post_type($post)=='ym_place') {
// you've to create the template you want to use here first
return get_template_directory().'/archive-ym_place.php';
}
else {
return $original_template;
}
}
うまく動作するようにこのコードをfunction.phpに入れてください。