web-dev-qa-db-ja.com

カテゴリ別カスタムシングル投稿

私はWordPressの内外の用語に慣れようとしています。

私は、WordPressとカスタムテンプレートを利用してTwentyTenの基盤に基づいてフルサイトをセットアップしています。

私は「投稿」投稿タイプの下にできるだけ多くのものを入れようとしています、そしてトップレベルの「リスト」ページはちょうどカテゴリページになります。

一つのカテゴリーは「仕事」です

私はカスタムcategory-work.phpとloop-work.phpファイルを作ることでそれらをカスタマイズすることができました。しかし、カテゴリ別のカスタム単一投稿を作成するにはどうすればよいですか。

Single-work.phpを作成すると、「work」というカスタム投稿タイプが検索されるように見えます。カテゴリ/カテゴリスラッグによって引き起こされるsingle.php修正クローンを作る方法はありますか?

3
Keefer

Single.phpを次のようにします。

<?php
$post = $wp_query->post;

if ( in_category( 'work' ) ) {
  include( TEMPLATEPATH.'/single-work-cat.php' );
} 
else {
  include( TEMPLATEPATH.'/single-generic.php' );
}
?>

そしてsingle-work-cat.phpを単一の作業カテゴリーの投稿用に表示したいテンプレートにし、single-generic.phpを他のすべての場合に表示したいテンプレートにします。より多くのカテゴリのためにただ単にelseif文を追加して新しい単一のテンプレートを作るだけです。

8
artparks

私はこれが古い質問であることを認識していますが、同じトピックを検索している間に他の誰かが見つけた場合、あなたはあなたのWordPressテーマでincludeステートメントを使うべきではないことに注意してください。常に get_template_part() または locate_template() を使用してください。

http://make.wordpress.org/themes/guidelines/guidelines-theme-check/ を参照)

次のコードはWordPressフィルタを使用してタスクを実行し、自動的にあらゆるカテゴリのテンプレートを検索します。

/**
 * Replace "themeslug" with your theme's unique slug
 *
 * @see http://codex.wordpress.org/Theme_Review#Guidelines
 */
add_filter( 'single_template', 'themeslug_single_template' );

/**
 * Add category considerations to the templates WordPress uses for single posts
 *
 * @global obj $post The default WordPress post object. Used so we have an ID for get_post_type()
 * @param string $template The currently located template from get_single_template()
 * @return string The new locate_template() result
 */
function themeslug_single_template( $template ) {
    global $post;

    $categories = get_the_category();

    if ( ! $categories )
        return $template; // no need to continue if there are no categories

    $post_type = get_post_type( $post->ID );

    $templates = array();

    foreach ( $categories as $category ) {

        $templates[] = "single-{$post_type}-{$category->slug}.php";

        $templates[] = "single-{$post_type}-{$category->term_id}.php";
    }

    // remember the default templates

    $templates[] = "single-{$post_type}.php";

    $templates[] = 'single.php';

    $templates[] = 'index.php';

    /**
     * Let WordPress figure out if the templates exist or not.
     *
     * @see http://codex.wordpress.org/Function_Reference/locate_template
     */
    return locate_template( $templates );
}

コードにはいくつかの弱点があります。まず、WordPressが単一の投稿に対してlocate_template()を2回(この関数が実行される前に1回、および実行中に1回)実行されることを意味します。第二に、私はどのカテゴリーを優先して最初に検索するかを明確にする方法がないと思います。つまり、あなたの投稿がユニークな単一の投稿テンプレートを持つ複数のカテゴリに属している場合、どのテンプレートを使用するかを選択することはできません。

3
Michael Dozark