web-dev-qa-db-ja.com

デフォルトのページテンプレートの選択を変更する方法はありますか?

「ページ」をクリック - >「新規追加」をクリック

新規ページ追加画面選択されているデフォルトのページテンプレートは「デフォルトのテンプレート」です。デフォルトのオプションをに変更する方法はありますか、「私のその他のテンプレート」としましょう。それで、私が "Add New"をクリックしたとき、 "My Other Template"が常にデフォルトで選択されるようになるでしょうか?これはページが保存される前に行われる必要があります。私はJSでこれを達成することができます。 WPオプションはありますか?

更新:

これが例です:

テンプレートオプション:

  • デフォルトのテンプレート(自動的に選択)
  • 私のテンプレート1
  • 私のテンプレート2

に変更するワードプレスの方法はありますか?

  • デフォルトのテンプレート
  • マイテンプレート1(自動選択)
  • 私のテンプレート2

私は多分これが機能で達成されるかもしれないと思った:

if (some condition is met)
 default_template = My Template 1
endif

テンプレート階層がどのように機能するのか私は知っています。テンプレートを特定のページに常に使用する方法を知っています。しかし、それは問題ではありません。私は、エンドユーザーが簡単にできるようにするために、特定の条件でページのグループで使用するテンプレートを事前に選択できるようにする一方で、必要に応じて別のテンプレートに切り替える柔軟性をユーザーに提供できる。

5
gdaniel

template_includeを使用すると(Brad Daltonが推奨)、フロントエンドのページテンプレートのみが変更され、管理者はページを編集するときに変更されません。

一方、czerspalaceが示唆しているように、メタボックスがレンダリングされる前にpostオブジェクトの値を変更するとうまくいきます。 $post->page_templateが設定されていない場合にのみこれを適用するチェックを追加しました。

function wpse196289_default_page_template() {
    global $post;
    if ( 'page' == $post->post_type 
        && 0 != count( get_page_templates( $post ) ) 
        && get_option( 'page_for_posts' ) != $post->ID // Not the page for listing posts
        && '' == $post->page_template // Only when page_template is not set
    ) {
        $post->page_template = "page-mytemplate.php";
    }
}
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);
4
Adrian B

私はこれをテストしていませんが、うまくいくかもしれません。テンプレートはグローバル投稿オブジェクトの値に基づいて選択されるため、メタボックスがレンダリングされる前に投稿オブジェクトの値を変更する必要があります。デフォルトのドロップダウンを選択するコードは次のとおりです。 https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/meta-boxes.php#L751

add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);

function wpse196289_default_page_template() {
    global $post;
    if ( 'page' == $post->post_type && 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID ) {
         if( $my_conditions )
             $post->page_template = "page-mytemplate.php";
    }
}
1
czerspalace

私は新しい ブロックエディタ (Gutenberg)でそれを成し遂げました。

この場合、タスクは REST AP​​Iレスポンス にフックする必要があります。

Adrian's answerから条件を取りました。

foreach ( array( 'page', 'post' ) as $post_type ) :
    add_filter( "rest_prepare_{$post_type}", 'wpse196289_rest_set_default_page_template', 1, 2 );
endforeach;

function wpse196289_rest_set_default_page_template( $data, $post ) {
    if ( 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID && '' == $data->data['template'] ) :
        $data->data['template'] = 'page-mytemplate.php';
    endif;

    return $data;
}
0

私が見つけた最も簡単な方法は、コードをハックすることなく、あなたのテンプレートファイルにリダイレクトするために(あなたのpage_template-name.phpファイルから離れた)個別のpage.phpとget_template_part()を作ることです。これにより、サイト全体でデフォルトのテンプレートが提供されるだけでなく、テンプレートは個別のオプションとして保持されます。

<?php get_template_part('page_template-name'); ?>

これがあなたのpage.phpファイルに存在する必要があるすべてです。デフォルトのテンプレートを取得するだけです。テンプレートサイト全体を変更したい場合は、スラッグを変更するだけで済みます。デフォルトオプションが選択されているページはすべて変更されます。テンプレートを使用するように特に設定されている(つまり、デフォルトではなくtemplate-1に設定されている)ページは変更されません。

0
Ben Matthews

関数ファイル内で template_include を条件タグとともに使用します。

add_filter( 'template_include', 'default_page_template', 99 );

function default_page_template( $template ) {

    if ( is_singular( 'page' )  ) {
        $default_template = locate_template( array( 'default-page-template.php' ) );
        if ( '' != $default_template ) {
            return $default_template ;
        }
    }

    return $template;
}
0
Brad Dalton