web-dev-qa-db-ja.com

親に基づいてページテンプレートを自動的に設定する

タイトルが示すように、私はX parentの下のそれぞれの新しいページを特定のページテンプレートに設定しようとしています。関数/プラグイン/コードを通して

例:もし私が 'スイスチーズ'ページを作るなら、それは 'chesses'ページの子供であるならば、wpはそれに 'チーズ'ページテンプレートを自動的に割り当てる

5
alme1304

管理者側では、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 );
5
kaiser

私はそれをより動的かつ防弾にするために、私がネットで見つけた他の解決策と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;
    }
};
0
honk31