¿Cambiar la plantilla de página programáticamente?

22 feb 2012, 14:25:08
Vistas: 21.5K
Votos: 12

Tengo dos plantillas de página y Qtranslate instalado.

Quiero elegir una u otra dependiendo del idioma seleccionado.

¿Puedo hacer algo como esto?

if($q_config['lang'] == 'en'){
// cargar page-template_en.php
}else{
// cargar page-template_de.php
}

¿Alguna idea?

¡Gracias!

0
Todas las respuestas a la pregunta 5
1
11

¡Finalmente lo encontré! Si entiendo bien tu pregunta, la plantilla básicamente se guarda como metadatos que necesitan ser actualizados.

update_post_meta( $post_id, '_wp_page_template', 'tu_plantilla_personalizada' );
// o
update_metadata('post_type',  $post_id, '_wp_page_template', 'tu_plantilla_personalizada' );

Fuente y más información

4 feb 2013 05:02:02
Comentarios

Esto almacenaría un cambio permanente en la página en la base de datos. Pero, él necesita cambiar la página dinámicamente, basado en el idioma del usuario.

Landing on Jupiter Landing on Jupiter
18 may 2016 15:10:35
0
11

La mejor forma (canónica) es usar el filtro template_include: http://codex.wordpress.org/Plugin_API/Filter_Reference/template_include

Código de ejemplo:

function language_redirect( $template ) {
    global $q_config;
    $new_template = locate_template( array( "page-{$q_config['lang']}.php" ) );
    if ( '' != $new_template ) {
        return $new_template ;
    }
    return $template;
}
add_filter( 'template_include', 'language_redirect' );
2 may 2014 09:14:25
0

Debería ser posible usando el hook template_include. El código no está probado:

 add_action( 'template_include', 'language_redirect' );

 function language_redirect( $template ) {
      global $q_config;
      $lang = ( 'en' === $q_config['lang'] ) ? 'en' : 'de';

      $template = str_replace( '.php', '_'.$lang.'.php', $template );
      return $template;
 }
22 feb 2012 15:48:16
0

¡Gracias a todos por estas sugerencias!

Quería establecer la plantilla "Elementor Canvas" por defecto solo en los posts y lo hice así:

function default_post_template_elementor_canvas($post_type, $post) 
{
    $wishedTemplate = 'elementor_canvas'; // Para ver las plantillas disponibles usar var_dump(get_page_templates($post))
    if ($post_type === 'post'
            && in_array($wishedTemplate, get_page_templates($post)) // Solo si elementor_canvas está disponible
            && $post->ID != get_option('page_for_posts') // No la página para listar posts
            && metadata_exists('post', $post->ID, '_wp_page_template') === false) {  // Solo cuando el meta _wp_page_template no está establecido
      add_post_meta($post->ID, '_wp_page_template', $wishedTemplate);
    }
}
add_action('add_meta_boxes', 'default_post_template_elementor_canvas', 10, 2);
17 jun 2019 01:24:47
2

Es posible utilizando el hook template_redirect.

Se vería algo así:

 function language_redirect()
 {
      global $q_config;

      if( $q_config['lang'] == 'en' )
      {
           include( get_template_directory() . '/page-template_en.php' );
           exit;
      }
      else
      {
           include( get_template_directory() . '/page-template_de.php' );
           exit;
      }
 }
 add_action( 'template_redirect', 'language_redirect' );

El código no ha sido probado, pero debería verse así.

Consulta mi respuesta similar AQUÍ para más ayuda.

22 feb 2012 15:37:02
Comentarios

No uses template_redirect para cargar un archivo de plantilla alternativo http://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Brad Dalton Brad Dalton
2 may 2014 10:47:11

El exit hará que cualquier script posterior no se ejecute. Usa template_include, no template_redirect.

Landing on Jupiter Landing on Jupiter
18 may 2016 15:12:03