Schimbă șablonul paginii programatic?

22 feb. 2012, 14:25:08
Vizualizări: 21.5K
Voturi: 12

Am două șabloane de pagină și Qtranslate instalat.

Vreau să aleg unul sau altul în funcție de limba selectată.

Pot face ceva de genul acesta?

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

Aveți vreo idee?

Mulțumesc!

0
Toate răspunsurile la întrebare 5
1
11

În sfârșit am găsit soluția! Dacă am înțeles corect întrebarea ta, template-ul este practic salvat ca metadate care trebuie actualizate.

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

Sursă și informații suplimentare

4 feb. 2013 05:02:02
Comentarii

Aceasta ar stoca o modificare permanentă a paginii în baza de date. Dar, el trebuie să modifice pagina dinamic, în funcție de limba utilizatorului.

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

Cea mai bună (canonică) metodă este utilizarea filtrului template_include: http://codex.wordpress.org/Plugin_API/Filter_Reference/template_include

Exemplu de cod:

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

Ar trebui să fie posibil folosind hook-ul template_include. Codul este netestat:

 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

Mulțumesc tuturor pentru aceste sugestii! Am dorit să setez șablonul "Elementor canvas" implicit doar pentru articole și am făcut astfel:

function default_post_template_elementor_canvas($post_type, $post) 
{
    $wishedTemplate = 'elementor_canvas'; // pentru a vedea șabloanele disponibile var_dump(get_page_templates($post))
    if ($post_type === 'post'
            && in_array($wishedTemplate, get_page_templates($post)) // Doar dacă elementor_canvas este disponibil
            && $post->ID != get_option('page_for_posts') // Nu pagina pentru afișarea articolelor
            && metadata_exists('post', $post->ID, '_wp_page_template') === false) {  // Doar când meta _wp_page_template nu este setat
      add_post_meta($post->ID, '_wp_page_template', $wishedTemplate);
    }
}
add_action('add_meta_boxes', 'default_post_template_elementor_canvas', 10, 2);
17 iun. 2019 01:24:47
2

Este posibil folosind hook-ul template_redirect.

Arată aproximativ astfel:

 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' );

Codul nu este testat, dar ar trebui să arate așa.

Vezi răspunsul meu similar AICI pentru mai mult ajutor.

22 feb. 2012 15:37:02
Comentarii

Nu folosiți template_redirect pentru a încărca un fișier de șablon alternativ http://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

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

Funcția exit va determina ca niciun script ulterior să nu se mai execute. Folosiți template_include, nu template_redirect.

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