web-dev-qa-db-ja.com

WordPressのtemplate_includeフィルタが正しく機能していない

私はプラグインに取り組んでいます。プラグインはカスタム投稿タイプを "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;
    }
}

私がうまくいかないところへの提案

2
deemi-D-nadeem

さて、私は自分でやりました。

上記のコードをすべて削除して、このコードを書きます。それは私のために完璧に機能します

コード:

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');
2
deemi-D-nadeem

これはもっと安全な方法です。

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に入れてください。

1
Saran