Cambiare il template della pagina programmaticamente?

22 feb 2012, 14:25:08
Visualizzazioni: 21.5K
Voti: 12

Ho due template di pagina e Qtranslate installato.

Vorrei sceglierne uno o l'altro a seconda della lingua selezionata.

Posso fare qualcosa del genere?

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

Qualche idea?

Grazie!

0
Tutte le risposte alla domanda 5
1
11

Finalmente trovato! Se ho capito bene la tua domanda, il template viene sostanzialmente salvato come metadato che deve essere aggiornato.

update_post_meta( $post_id, '_wp_page_template', 'your_custom_template' );
// oppure
update_metadata('post_type',  $post_id, '_wp_page_template', 'your_custom_template' );

Fonte e ulteriori informazioni

4 feb 2013 05:02:02
Commenti

Questo memorizzerebbe una modifica permanente alla pagina nel database. Ma lui ha bisogno di cambiare la pagina dinamicamente, in base alla lingua dell'utente.

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

Il modo migliore (canonico) è utilizzare l'hook filter template_include: http://codex.wordpress.org/Plugin_API/Filter_Reference/template_include

Codice di esempio:

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 mag 2014 09:14:25
0

Dovrebbe essere possibile utilizzando l'hook template_include. Il codice non è testato:

 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

Grazie a tutti per questi suggerimenti! Volevo impostare il template "Elementor canvas" come predefinito solo per i post e ho fatto così:

function default_post_template_elementor_canvas($post_type, $post) 
{
    $wishedTemplate = 'elementor_canvas'; // per vedere i template disponibili var_dump(get_page_templates($post))
    if ($post_type === 'post'
            && in_array($wishedTemplate, get_page_templates($post)) // Solo se elementor_canvas è disponibile
            && $post->ID != get_option('page_for_posts') // Non la pagina per l'elenco dei post
            && metadata_exists('post', $post->ID, '_wp_page_template') === false) {  // Solo quando il meta _wp_page_template non è impostato
      add_post_meta($post->ID, '_wp_page_template', $wishedTemplate);
    }
}
add_action('add_meta_boxes', 'default_post_template_elementor_canvas', 10, 2);
17 giu 2019 01:24:47
2

È possibile utilizzare l'hook template_redirect.

Dovrebbe apparire così:

/**
 * Reindirizza al template giusto in base alla lingua
 */
function language_redirect()
{
     global $q_config;

     if( $q_config['lang'] == 'en' )
     {
          // Carica il template in inglese
          include( get_template_directory() . '/page-template_en.php' );
          exit;
     }
     else
     {
          // Carica il template in tedesco (o altra lingua)
          include( get_template_directory() . '/page-template_de.php' );
          exit;
     }
}
add_action( 'template_redirect', 'language_redirect' );

Il codice non è stato testato, ma dovrebbe funzionare così.

Vedi la mia risposta simile QUI per ulteriore aiuto.

22 feb 2012 15:37:02
Commenti

Non utilizzare template_redirect per caricare un file di template alternativo http://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

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

L'istruzione exit causerà l'interruzione di qualsiasi script successivo. Utilizza template_include, non template_redirect.

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