タイトルが示すように、私はX parentの下のそれぞれの新しいページを特定のページテンプレートに設定しようとしています。関数/プラグイン/コードを通して
例:もし私が 'スイスチーズ'ページを作るなら、それは 'chesses'ページの子供であるならば、wpはそれに 'チーズ'ページテンプレートを自動的に割り当てる
管理者側では、page-post_typeのメタデータをプログラムで更新できます。
global $post;
if (
'swiss_cheese' === $post->post_parent
AND is_admin()
)
update_post_meta( $post->ID, '_wp_page_template', 'some_template.php' );
訪問者側では、単純にテンプレートリダイレクトに飛び込むことができます。
function wpse63267_template_include( $template )
{
global $post;
if ( 'swiss_cheese' === $post->post_parent )
{
$new_template = locate_template( array( 'swiss-cheese-template.php' ) );
if ( ! empty( $new_template ) ) {
return $new_template ;
}
}
return $template;
}
add_filter( 'template_include', 'wpse63267_template_include', 99 );
私はそれをより動的かつ防弾にするために、私がネットで見つけた他の解決策とkaiserの解決策を組み合わせました。
加えてwpコーデックスでそれは言う:template_redirectアクションフックを使って別のテンプレートをロードすることは良い使い方ではありません。別のテンプレートをインクルードしてからexit()(またはdie())を使用すると、それ以降のtemplate_redirectフックは実行されません。
そして私はこれを地獄のようにダイナミックにしました。あなたは言うことができます:ページXの子供たちはテンプレートZを使いますが、もしあなたが セット もし管理インターフェースでページXの子供たちのためのテンプレートなら、それからそれを使用してください。
これが解決策です(ページXの子が...にリダイレクトする場合)。
function jnz_is_child( $pid ) {
global $post;
$ancestors = get_post_ancestors( $post->$pid );
$root = count( $ancestors ) - 1;
$parent = $ancestors[$root];
if( is_page() && ( $post->post_parent === $pid || in_array( $pid, $ancestors ) ) ) {
return true;
} else {
return false;
}
};
function wpse140605_template_redirect( $template ) {
if ( $template === locate_template('page.php') ) { // if template is not set in admin interface
if ( jnz_is_child( 656 ) || jnz_is_child( 989 ) ) {
$new_template = locate_template( array( 'page-whatever.php' ) ); // if template file exist
if ( '' != $new_template ) {
return $new_template ;
}
}
}
return $template;
};
add_filter( 'template_include', 'wpse140605_template_redirect', 99 );
そのため、基本的に最初の関数jnz_is_child()
では、ページIDでページがページXの子(またはXの子の子でも)であるかどうかをチェックします。
そして、2番目の関数wpse140605_template_redirect()
で置き換えます(ページの親が=== 656
または=== 989
の場合:テンプレートのpage-whatever.php
を使います)。もちろん、2番目の関数には複数のif / else if
クロージャーを含めることができ、さらにこの関数はテンプレートファイルが存在するかどうかをチェックします。存在しない場合、phpはエラーをスローします。
そして最初の関数はテーマ内の他の場所でも使えます(is_page()
など)。
これは、現在の要素が選択されている場合(is_pageとis_childの組み合わせ)の別のif子バリアントです。
function jnz_is_child( $pid ) {
global $post;
$ancestors = get_post_ancestors( $post->$pid );
if( is_page() && ( is_page( $pid ) || $post->post_parent === $pid || in_array( $pid, $ancestors ) ) ) {
return true;
} else {
return false;
}
};