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

4

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 pouvoir appeler quand le plugin est activé.

Jusqu'à WordPress 4.7 , cela fonctionnait parfaitement; mais lors de la mise à niveau de WordPress vers la dernière (à partir de 4.6.3 ), les modèles de page ne sont même pas affichés 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!

    
posée Adi 23.02.2017 - 14:36

2 réponses

5

Le problème:

Comme Marque déjà suggérée , 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 fonctionner avec WordPress 4.7+ , rien ne garantit que vous ne rencontrerez pas de problèmes similaires dans les futures mises à jour. Alors, utilisez mieux l’une des solutions mentionnées ci-dessous:

Solution thématique:

Au lieu d'attribuer des modèles à un plugin, vous pouvez définir les 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 plug-in

Toutefois, si vous devez attribuer ces modèles avec votre plugin pour une raison quelconque, utilisez le theme_page_templates 4.4+ .

Ce qui suit est la réécriture de votre CODE en utilisant le crochet% filter:

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 à la place du code que vous avez fourni. Cela fonctionnera pour toutes les versions de WordPress theme_page_templates et versions ultérieures. Je l'ai testé pour WordPress 4.4 & cela fonctionne bien.

    
réponse donnée Fayaz 23.02.2017 - 16:07
0

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 tout 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 de thème et les plug-ins ne doivent pas en posséder 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.

    
réponse donnée Mark Kaplun 23.02.2017 - 15:12

Lire d'autres questions sur les étiquettes