web-dev-qa-db-ja.com

ページIDに基づいてプログラムでページテンプレートを設定する

IDに基づいてページテンプレートを設定する方法私のサイトにはRedux Frameworkがインストールされていますが、登録ページを設定することもできます。このページでは、特定のテンプレートを使用したいのですが、他のテンプレートではデフォルトのテンプレートを使用する必要があります。

私はそれで半分働いていました

add_filter( 'page_template', 'my_function' );
function my_function(){
  global $my_options;
  $page_id = get_queried_object_id();
  if ( $my_options['my-reg-page'] == $page_id ) {
    return get_template_directory() . '/reg-page.php'; 
  }
}

問題のページ(IDが$my_options['my-reg-page']に格納されているページ)にはページセットがありますが、残りのページにはindex.phpをテンプレートとして使用し、適切なページ(single.php、page.phpなど)は使用しません。条件をフィルタの外側に設定した場合、探しているテンプレートは表示されません。必要に応じて関連ページとして異なるページを使用することになる複数のテーマで使用するためにコードを自分のfunctions.phpファイルに貼り付けるのではなく、メタデータを保存しないようにします。最も簡単な方法は管理領域のページに直接テーマを設定することですが、それはそのまま複数のオプションを作成します。私はそれらを可能な限り減らすことを望んでいます。

何かアドバイス?それも可能ですか?

2
Nate

私が開発していたプラグインの1つに対して、非常によく似たことをする必要がありました。私はプラグインのアクティベーション中に2つの別々のcptを登録しました、そしてそれらのそれぞれのcptは私がプラグインコードベースにバンドルしたカスタムの単一テンプレートを使うべきです。

page_template フィルタを使用して、ページテンプレートに対しても同じことができるはずです。

これがsingle_templateフィルタを使った私の関数です。これは代わりにpage_templateを使うように調整できます。グローバルな$ post変数を取得するだけで、投稿の種類や投稿IDを確認して、そのデータに基づいてテンプレートを配信できます。

add_filter( 'page_template', 'custom_page_template' );
public function custom_page_template( $page_template ) {
        global $post;

        switch ( $post->ID) {

            default :
            case '2' : // page ID 2
                if( file_exists( get_stylesheet_directory() . '/single-event-template.php' ) ) {
                    $page_template = get_stylesheet_directory() . '/single-event-template.php'; 
                return $single_template;
            break;

            case '14' : // page ID 14
                $page_template= plugin_dir_path( dirname( __FILE__ ) ) . 'public/partials/single-event-location-template.php';
                return $page_template;
            break;

        } // end switch

}

ページテンプレートを使ってこれをテストしたことはありませんが、コーデックスページからはうまくいくようです。

あなたの例から手を加えて、あなたは以下のような何かを試みたがっているかもしれません:

add_filter( 'page_template', 'my_function' );
function my_function( $page_template ){
  global $post;
  $page_id = $post->ID;
  if ( $my_options['my-reg-page'] == $page_id ) {
    $page_template = get_template_directory() . '/reg-page.php'; 
  } else {
   $page_template = get_template_directory() . '/some-other-page-template.php'; 
  } 
  return $page_template;
}
2
EHerman