Las plantillas de página del complemento no funcionan después de actualizar WP a la versión 4.7 o superior

4

Estoy trabajando en un complemento que necesitamos para el sitio web de educación. He agregado 3-4 plantillas de página dentro de mi complemento para que podamos llamar cuando el complemento esté activado.

Hasta WordPress 4.7 , estaba funcionando perfectamente; pero cuando actualicé WordPress a la última versión (de 4.6.3 ), las plantillas de página ni siquiera se muestran en la sección de atributos de la página.

Aquí está el código que funcionaba bien con versiones anteriores (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;
}

Estoy buscando la solución de los últimos 2 días, ¡pero no tengo suerte!

    
pregunta Adi 23.02.2017 - 14:36

2 respuestas

5

El problema:

Como marca sugerida ya , la carga de su plantilla mediante la manipulación del caché está lejos de ser una práctica estándar. Con este tipo de alteración de la memoria caché, incluso si modifica su CÓDIGO para que funcione con WordPress 4.7+ , no hay garantía de que no encontrará problemas similares en futuras actualizaciones. Así que mejor utilice cualquiera de las soluciones mencionadas a continuación:

Solución de tema:

En lugar de asignar plantillas desde un complemento, puede tener plantillas de página en el tema activo. Tu tema activo es el lugar recomendado para tener estas plantillas de página.

Solución de complemento

Sin embargo, si tiene que asignar estas plantillas con su complemento por alguna razón, entonces use theme_page_templates gancho para hacerlo. Funcionará para WordPress 4.4+ .

Lo siguiente es la reescritura de su CÓDIGO usando theme_page_templates filter hook:

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 el CÓDIGO anterior en lugar del CÓDIGO que ha proporcionado. Funcionará para cualquier versión de WordPress 4.4 y posterior. Lo he probado para WordPress 4.7.2 & funciona bien.

    
respondido por el Fayaz 23.02.2017 - 16:07
0

El código de inserción del almacenamiento en caché parece muy extraño y, dependiendo de alguna forma específica, Core calcula los hashes para el caché y los usa. Debe volver a escribir esa parte del código (que supongo que agregue plantillas de página virtuales) para encontrar un método de inserción más sólido, o simplemente abandonarlo por completo (¿por qué no tener plantillas de página reales?)

En general, la plantilla de página es una cosa de tema y los complementos no deberían tener uno realmente, sino que deben proporcionar códigos cortos u otras formas para que el usuario tenga páginas con sus datos.

    
respondido por el Mark Kaplun 23.02.2017 - 15:12

Lea otras preguntas en las etiquetas