web-dev-qa-db-ja.com

プログラムでページテンプレートを変更しますか?

2つのページテンプレートとQtranslateがインストールされています。

選択した言語に応じて選択します。

こんなことができますか?

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

何か案が ?

ありがとうございます。

5
Klian

ついに見つけました!私があなたの質問を正しく理解していれば、テンプレートは基本的に更新が必要なメタデータとして保存されます。

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

情報源および詳しい情報

7
David Hobs

(標準的な)最善の方法はtemplate_includeフックを使うことです: http://codex.wordpress.org/Plugin_API/Filter_Reference/template_include

コード例:

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_action( 'template_include', 'language_redirect' );
4

template_includeフックを使って可能であるべきです。コードはテストされていません:

 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;
 }
3
Geert

これらの提案をありがとうございました!デフォルトでは投稿時のみに "Elementor canvas"テンプレートを設定したいと思いました。

function default_post_template_elementor_canvas($post_type, $post) 
{
    $wishedTemplate = 'elementor_canvas'; // to see available template var_dump(get_page_templates($post))
    if ($post_type === 'post'
            && in_array($wishedTemplate, get_page_templates($post)) // Only if elementor_canvas is available
            && $post->ID != get_option('page_for_posts') // Not the page for listing posts
            && metadata_exists('post', $post->ID, '_wp_page_template') === false) {  // Only when meta _wp_page_template is not set
      add_post_meta($post->ID, '_wp_page_template', $wishedTemplate);
    }
}
add_action('add_meta_boxes', 'default_post_template_elementor_canvas', 10, 2);
0
FloO