web-dev-qa-db-ja.com

アップグレード後にプラグインのページテンプレートが機能しない WP 4.7以上のバージョンへ

私は教育ウェブサイトに必要なプラグインに取り組んでいます。プラグインがアクティブになったときに呼び出すことができるように、プラグイン内に3-4ページのテンプレートを追加しました。

WordPressの4.7までは、完璧に動作していました。しかし、WordPressを(4.6.3から)最新のものにアップグレードしたので、ページテンプレートはページ属性セクションにも表示されません。

これは、古いバージョン(4.7以前)で問題なく動作していたコードです。

add_action( 'wp_loaded', 'add_my_templates' );
function add_my_templates() {
    if( is_admin() ){
        global $wp_object_cache;
        $current_theme = wp_get_theme();
        $templates = $current_theme->get_page_templates();
        $hash = md5( $current_theme->theme_root . '/'. $current_theme->stylesheet );
        $templates = $wp_object_cache->get( 'page_templates-'. $hash, 'themes' );
        $templates['templates/exams.php'] = __('Exams');
        $templates['templates/colleges.php'] = __('Colleges');
        $templates['templates/study_home.php'] = __('Study Home');
        $templates['templates/study_job_home.php'] = __('Study Job Home');
        wp_cache_replace( 'page_templates-'. $hash, $templates, 'themes' );
    }
    else {
        add_filter( 'page_template', 'get_my_template', 1 );
    }
}

function get_my_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, '_wp_page_template', true );
    if( $page_template == 'templates/study_home.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/study_home.php";
    }
    if( $page_template == 'templates/study_job_home.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/study_job_home.php";
    }
    if( $page_template == 'templates/exams.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/exams.php";
    }
    if( $page_template == 'templates/colleges.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/colleges.php";
    }
    return $template;
}

私は過去2日間の解決策を探していますが、運が悪いです!

4
Adi

問題:

Markがすでに示唆しているように 、キャッシュを操作することによるテンプレートのロードは標準的なやり方にはほど遠いです。この種のキャッシュの変更では、WordPressの4.7+で動作するようにCODEを変更しても、今後のアップデートで同様の問題が発生しないとは限りません。そのため、下記の解決策のいずれかを使用してください。

テーマソリューション:

テンプレートをプラグインから割り当てる代わりに、実際の ページテンプレート をアクティブなテーマに含めることができます。あなたのアクティブなテーマはこれらのページテンプレートを持つための recommended の場所です。

プラグインソリューション

ただし、何らかの理由でこれらのテンプレートをプラグインに割り当てる必要がある場合は、 theme_page_templates フックを使用してください。それはWordPressの4.4+でうまくいくでしょう。

以下はtheme_page_templatesフィルタフックを使ったあなたのCODEの書き換えです:

function get_my_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, '_wp_page_template', true );
    if( $page_template == 'templates/study_home.php' ){
        return plugin_dir_path(__FILE__) . "templates/study_home.php";
    }
    if( $page_template == 'templates/study_job_home.php' ){
        return plugin_dir_path(__FILE__) . "templates/study_job_home.php";
    }
    if( $page_template == 'templates/exams.php' ){
        return plugin_dir_path(__FILE__) . "templates/exams.php";
    }
    if( $page_template == 'templates/colleges.php' ){
        return plugin_dir_path(__FILE__) . "templates/colleges.php";
    }
    return $template;
}

function filter_admin_page_templates( $templates ) {
    $templates['templates/exams.php'] = __('Exams');
    $templates['templates/colleges.php'] = __('Colleges');
    $templates['templates/study_home.php'] = __('Study Home');
    $templates['templates/study_job_home.php'] = __('Study Job Home');
    return $templates;
}

function add_my_templates() {
    if( is_admin() ) {
        add_filter( 'theme_page_templates', 'filter_admin_page_templates' );
    }
    else {
        add_filter( 'page_template', 'get_my_template', 1 );
    }
}

add_action( 'wp_loaded', 'add_my_templates' );

指定したコードの代わりに上記のコードを使用してください。 WordPressのバージョン4.4以降で動作します。私はWordPressの4.7.2のためにそれをテストしました、そして、それはうまく働きます。

5
Fayaz

あなたのキャッシング挿入コードはとても奇妙に見えます、そして、コアがキャッシュのためにハッシュを計算して、それらを使用するある特定の方法に依存します。もっと堅牢な挿入方法を見つけるには、コードのその部分(私は仮想ページテンプレートを追加すると仮定します)を書き直す必要があります。

一般的にページテンプレートはテーマのものであり、プラグインは実際にそれを持っているべきではなく、代わりにショートコードやユーザーにデータを持つページを持たせる他の方法を提供するべきです。

0
Mark Kaplun