web-dev-qa-db-ja.com

特定のカテゴリ用のカスタム単体テンプレートプレート

特定のカテゴリに属する​​WordPress Post用のカスタムテンプレートを作成するための最善の方法(パフォーマンスとコード構造)は何ですか? single-catname.phpを作成することはできません。

これまで、テンプレートを変更する方法を2つ試してみました。しかし、どれが一番良いのでしょうか。

編集:

どのようにすべてのサブ/親などのカテゴリに含める方法はありますか?私は今それが唯一の主要なカテゴリを示していることに気づきました...

1. functions.phpに追加

function get_custom_cat_template($single_template) {
   global $post;
   if ( in_category( 'movies' )) {
      $single_template = dirname( __FILE__ ) . '/single-movies.php';
   }
   return $single_template;
} 
add_filter( "single_template", "get_custom_cat_template" ) ;

2. (他のすべてのコードではなく)次のコードをsingle.phpに追加し、(single.phpからのコードを使用して)single-template.phpを作成し、custom single-movies.phpを作成します。

<?php        
if(has_term('movies', 'category', $post)) {      
   get_template_part('single-movies', 'movies');
} else {
   // use default template file single-template.php
   get_template_part('single-template');
}
?>
6
NewUser

私のコメントからOPへ

私の意見では、あなたが快適であるものを使用してください。パフォーマンスに違いがある場合、それは分/無関係になります。私の好みは、フィルタを使う

私の意見では、あなたの本当の関心事/質問に来るために、最善のアプローチは親カテゴリーIDを使用してそこから作業することでしょう。ここから作業するのが最もリソース集約的になります。リバースエンジニアリングは、非常に不要なリソースの浪費になる可能性があります。

与えられたカテゴリから子カテゴリを取得するために get_categories を使用してください。 parentまたはchild_ofのいずれかの2つのパラメーターのいずれかを使用できます。

(整数)

そのIDで識別されるカテゴリの直接の子孫であるカテゴリ(つまり、子供のみ)を表示します。これは 'child_of'パラメータのようには動作しません。このパラメータにはデフォルトはありません。 [2.8.4に]

child_of (整数)

そのIDで識別されるカテゴリの子孫(つまり子供と孫)であるすべてのカテゴリを表示します。このパラメータにはデフォルトはありません。このパラメータを使用すると、hide_emptyパラメータはfalseに設定されます。

これらを取得したら、 wp_list_pluck を使用して、返されたカテゴリの配列からcatID、name、またはslugフィールドを取得します。この配列は、投稿がこれらのカテゴリのいずれかに属しているかどうかを確認するために使用されます。 has_category または in_category のいずれかを使用できます。

これは、親カテゴリまたはその子孫に属する投稿が特定のテンプレートを使用するようにコードを拡張する方法です。

add_filter( 'single_template', function ( $single_template ) {

    $parent     = '21'; //Change to your category ID
    $categories = get_categories( 'child_of=' . $parent );
    $cat_names  = wp_list_pluck( $categories, 'name' );

    if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
        $single_template = dirname( __FILE__ ) . '/single-movies.php';
    }
    return $single_template;

}, PHP_INT_MAX, 2 );
6
Pieter Goosen

ステップ1:content-single.phpを作成またはコピーして新しいファイルを作成します。例:content-yourCategory.phpステップ2:single.phpを開き、このget_template_part('content','single');を次のコードに置き換えます。

    if(is_category('yourCategory')){
        get_template_part('content','yourCategory');
    }else{
        get_template_part('content','single.php');
    }

パラメータは、カテゴリID、カテゴリタイトル、カテゴリスラッグ、またはIDの配列、名前、およびスラッグです。

3
Karun

これはそのための便利な方法で、 here がこのコードを過ぎてfunction.phpになります。

// Custom single template by category
// https://halgatewood.com/wordpress-custom-single-templates-by-category

add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
  foreach( (array) get_the_category() as $cat ) 
  { 
    if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php"; 
    if($cat->parent)
    {
      $cat = get_the_category_by_ID( $cat->parent );
      if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
    }
  } 
  return $t;
}

詳細については、チェックアウトする https://halgatewood.com/wordpress-custom-single-templates-by-category

2
Ninda