Page Templates do plugin não funcionam após a atualização do WP para a versão 4.7 ou superior

4

Estou trabalhando em um plugin que precisamos para o site de educação. Eu adicionei 3-4 modelos de página dentro do meu plugin para que possamos chamar quando o plugin for ativado.

Até o WordPress 4.7 , estava funcionando perfeitamente; mas quando atualizei o WordPress para o mais recente (de 4.6.3 ), os modelos de página nem aparecem na seção de atributos da página.

Aqui está o código que estava funcionando bem com versões mais antigas (antes de 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;
}

Estou procurando a solução dos últimos dois dias, mas não tenho sorte!

    
por Adi 23.02.2017 / 14:36

2 respostas

5

O problema:

Como Mark sugeriu já , o carregamento do seu modelo através da manipulação de cache está longe de ser uma prática padrão. Com esse tipo de alteração de cache, mesmo se você modificar seu CÓDIGO para trabalhar com o WordPress 4.7+ , não há garantia de que você não encontrará problemas semelhantes em futuras atualizações. Então, é melhor usar qualquer uma das soluções mencionadas abaixo:

Solução de tema:

Em vez de atribuir modelos a partir de um plug-in, você pode ter modelos de página reais no tema ativo. Seu tema ativo é o lugar recomendado para ter esses modelos de página.

Solução de Plugin

No entanto, se você tiver que atribuir esses modelos ao seu plug-in por algum motivo, use o theme_page_templates 4.4+ .

A seguir está a reescrita do seu CÓDIGO usando o gancho de filtro 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' );

Use o CÓDIGO acima, em vez do CÓDIGO que você forneceu. Ele funcionará para qualquer versão do WordPress 4.4 e posterior. Eu testei para o WordPress 4.7.2 & funciona bem.

    
por Fayaz 23.02.2017 / 16:07
0

Seu código de inserção em cache parece muito estranho e, dependendo de alguma forma específica, o núcleo calcula os hashes para o cache e os utiliza. Você precisa reescrever essa parte do código (que eu suponho adicionar modelos de páginas virtuais) para encontrar um método de inserção mais robusto, ou simplesmente abandoná-lo totalmente (por que não apenas ter modelos de páginas reais?)

No modelo de página geral, o tema é um tema e os plugins não devem ter um, e fornecer códigos de acesso ou outras formas de permitir que o usuário tenha páginas com seus dados.

    
por Mark Kaplun 23.02.2017 / 15:12