web-dev-qa-db-fra.com

Les modèles de page du plug-in ne fonctionnent pas après la mise à niveau WP à la version 4.7 ou supérieure

Je travaille sur un plugin dont nous avons besoin pour le site Web de l'éducation. J'ai ajouté 3 ou 4 modèles de page dans mon plugin pour que nous puissions appeler quand le plugin est activé.

Jusqu'à WordPress 4.7, cela fonctionnait parfaitement; mais comme j'ai mis à jour WordPress vers la dernière version (à partir de 4.6.3), les modèles de page ne s'affichent même pas dans la section attribut de page.

Voici le code qui fonctionnait bien avec les anciennes versions (avant 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;
}

Je cherche la solution des 2 derniers jours, mais pas de chance!

4
Adi

Le problème:

Comme Mark a déjà suggéré , le chargement de vos modèles par manipulation du cache est loin d’être une pratique courante. Avec ce type de modification du cache, même si vous modifiez votre code pour utiliser WordPress 4.7+, rien ne garantit que vous ne rencontrerez pas de problèmes similaires dans les futures mises à jour. Alors mieux utiliser l'une des solutions mentionnées ci-dessous:

Solution thématique:

Au lieu d'attribuer des modèles à un plugin, vous pouvez avoir le vrai { modèles de page } _ dans le thème actif. Votre thème actif est l’emplacement recommandé pour disposer de ces modèles de page.

Solution de plugin

Cependant, si vous devez attribuer ces modèles avec votre plugin pour une raison quelconque, utilisez le hook theme_page_templates pour le faire. Cela fonctionnera pour WordPress 4.4+.

Voici la réécriture de votre CODE en utilisant le crochet de filtre theme_page_templates:

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' );

Utilisez le code ci-dessus au lieu du code que vous avez fourni. Cela fonctionnera pour toute version WordPress 4.4 et ultérieure. Je l'ai testé pour WordPress 4.7.2 et cela fonctionne bien.

5
Fayaz

Votre code d'insertion de mise en cache semble très étrange et, selon une méthode spécifique, Core calcule les hachages pour le cache et les utilise. Vous devez réécrire cette partie du code (ce qui suppose l’ajout de modèles de page virtuels) pour trouver une méthode d’insertion plus robuste, ou simplement l’abandonner totalement (pourquoi ne pas simplement disposer de modèles de page réels?)

En général, les modèles de page sont un élément du thème et les plugins ne devraient pas en avoir un, mais plutôt fournir des codes abrégés ou d'autres moyens permettant à l'utilisateur de disposer de pages contenant ses données.

0
Mark Kaplun