web-dev-qa-db-ja.com

ページテンプレートのリストを操作することは可能ですか?

この質問に答えた後ページを編集するときに利用できる可能性のあるページテンプレートのドロップダウンリストを操作することが可能かどうかと思いました。 WordPressはこのリストをルートディレクトリで利用可能なテンプレートファイル(page.phppage-onecolumn.phppage-about-us.phpのような)から導き出します。データベースにリストを保存するようには見えません。

例えば、あなたが10個のページテンプレートを持っていて、管理者以外のユーザのためにそれらのうちのいくつかにアクセスを制限したいなら、これを望む合法的な理由があると想像することができます。あるいは、オプションページを使って動的にテンプレートを作成したい場合は、リストを拡張します。

5
cjbj

主力は WP_Theme::get_page_templates() (ヘルパー関数 get_page_templates() で囲まれた)です。ソースをチェックアウトすると、次のようになります。

/**
 * Filter list of page templates for a theme.
 *
 * @since 3.9.0
 * @since 4.4.0 Converted to allow complete control over the `$page_templates` array.
 *
 * @param array        $page_templates Array of page templates. Keys are filenames,
 *                                     values are translated names.
 * @param WP_Theme     $this           The theme object.
 * @param WP_Post|null $post           The post being edited, provided for context, or null.
 */
return (array) apply_filters( 'theme_page_templates', $page_templates, $this, $post );

例:

function wpse_226324_page_templates( $templates ) {
    // Remove tpl-home.php template
    unset( $templates['tpl-home.php'] );

    // Add custom template
    $templates['tpl-custom.php'] = 'Custom Template';

    return $templates;
}

add_filter( 'theme_page_templates', 'wpse_226324_page_templates' );

theme_page_templatesコードリファレンス もご覧ください。

5
TheDeadMedic