web-dev-qa-db-ja.com

カスタム投稿型分類単一テンプレート

「広告」というカスタム投稿タイプを作成した後、「タイプ」という分類の分類を作成しました。「ラジオ」、「テレビ」、「印刷」というタイプカテゴリに用語をいくつか追加しました。 WordPressが各用語に異なるsingle.phpテンプレートを使用するようにします。印刷テンプレートとは異なるラジオテンプレートが欲しいのですが。私はtaxonomy-ad-type-radio.phpを試してみました私はsingle-ad-type-radio.phpとそれらの他のすべての形を試してみました。誰かがこれを達成するための最良の方法は何ですか私に言うことができますか?

私はfunctions.phpファイルにフィルタを追加しましたが、これも役に立ちません。私は私がただ簡単に何かを逃しているのを知っています。ご協力ありがとうございました。

<?php 

/** Register the post type for the ads **/

add_action( 'init', 'register_cpt_ad' );

function register_cpt_ad() {

    $labels = array( 
        'name' => _x( 'Ads', 'ad' ),
        'singular_name' => _x( 'ad', 'ad' ),
        'add_new' => _x( 'Add New', 'ad' ),
        'add_new_item' => _x( 'Add New ad', 'ad' ),
        'edit_item' => _x( 'Edit ad', 'ad' ),
        'new_item' => _x( 'New ad', 'ad' ),
        'view_item' => _x( 'View ad', 'ad' ),
        'search_items' => _x( 'Search Ads', 'ad' ),
        'not_found' => _x( 'No ads found', 'ad' ),
        'not_found_in_trash' => _x( 'No ads found in Trash', 'ad' ),
        'parent_item_colon' => _x( 'Parent ad:', 'ad' ),
        'menu_name' => _x( 'Ads', 'ad' ),
    );

    $args = array( 
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Adbank system',
        'supports' => array( 'title', 'excerpt', 'editor', 'thumbnail', 'custom-fields' ),
        'taxonomies' => array( 'category', 'type', 'campaign', 'post_tag' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,     
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
    'menu_position' => 3,
        'can_export' => true,
        'rewrite' => true,
        'capability_type' => 'post'
    );

    register_post_type( 'ad', $args );
}

/**Register the taxonomy for the ad types**/
add_action( 'init', 'register_taxonomy_type' );

function register_taxonomy_type() {

    $labels = array( 
        'name' => _x( 'Ad Type', 'type' ),
        'singular_name' => _x( 'Ad Types', 'type' ),
        'search_items' => _x( 'Search Ad Type', 'type' ),
        'popular_items' => _x( 'Popular Ad Type', 'type' ),
        'all_items' => _x( 'All Ad Type', 'type' ),
        'parent_item' => _x( 'Parent Ad Types', 'type' ),
        'parent_item_colon' => _x( 'Parent Ad Types:', 'type' ),
        'edit_item' => _x( 'Edit Ad Types', 'type' ),
        'update_item' => _x( 'Update Ad Types', 'type' ),
        'add_new_item' => _x( 'Add New Ad Types', 'type' ),
        'new_item_name' => _x( 'New Ad Types', 'type' ),
        'separate_items_with_commas' => _x( 'Separate ad type with commas', 'type' ),
        'add_or_remove_items' => _x( 'Add or remove ad type', 'type' ),
        'choose_from_most_used' => _x( 'Choose from the most used ad type', 'type' ),
        'menu_name' => _x( 'Ad Type', 'type' ),
    );

    $args = array( 
        'labels' => $labels,
        'public' => true,
        'show_in_nav_menus' => true,
        'show_ui' => true,
        'show_tagcloud' => true,
        'hierarchical' => true,
        'rewrite' => true,
        'query_var' => true
    );

    register_taxonomy( 'type', array('ad'), $args );
}

/**Register the taxonomy for the campaigns**/
add_action( 'init', 'register_taxonomy_campaign' );

function register_taxonomy_campaign() {

    $labels = array( 
        'name' => _x( 'Campaigns', 'campaign' ),
        'singular_name' => _x( 'Campaign', 'campaign' ),
        'search_items' => _x( 'Search campaigns', 'campaign' ),
        'popular_items' => _x( 'Popular campaigns', 'campaign' ),
        'all_items' => _x( 'All campaigns', 'campaign' ),
        'parent_item' => _x( 'Parent Campaign', 'campaign' ),
        'parent_item_colon' => _x( 'Parent Campaign:', 'campaign' ),
        'edit_item' => _x( 'Edit Campaign', 'campaign' ),
        'update_item' => _x( 'Update Campaign', 'campaign' ),
        'add_new_item' => _x( 'Add New Campaign', 'campaign' ),
        'new_item_name' => _x( 'New Campaign', 'campaign' ),
        'separate_items_with_commas' => _x( 'Separate campaigns with commas', 'campaign' ),
        'add_or_remove_items' => _x( 'Add or remove campaigns', 'campaign' ),
        'choose_from_most_used' => _x( 'Choose from the most used campaigns', 'campaign' ),
        'menu_name' => _x( 'Campaigns', 'campaign' ),
    );

    $args = array( 
        'labels' => $labels,
        'public' => true,
        'show_in_nav_menus' => true,
        'show_ui' => true,
        'show_tagcloud' => true,
        'hierarchical' => true,

        'rewrite' => true,
        'query_var' => true
    );

    register_taxonomy( 'campaign', array('ad'), $args );
}

function query_post_type($query) {
    $post_types = get_post_types();

    if ( is_category() || is_tag()) {

        $post_type = get_query_var('ad');

        if ( $post_type ) {
            $post_type = $post_type;
        } else {
            $post_type = $post_types;
        }

        $query->set('post_type', $post_type);

        return $query;
    }
}

add_filter('pre_get_posts', 'query_post_type');

/* NEW STUFF */

// Register the column
function price_column_register( $columns ) {
$columns['level'] = __( 'User Level', 'my-plugin' );

return $columns;
}
add_filter( 'manage_edit-ad_columns', 'price_column_register' );

// Display the column content
function price_column_display( $column_name, $post_id ) {
if ( 'level' != $column_name )
    return;
$roles = get_post_meta( $post->ID, '_members_access_role', true );
if ($roles == 'level1') echo 'level1';
echo 'hello';
}
add_action( 'manage_posts_custom_column', 'price_column_display', 10, 2 );

/**
 * Append the terms of multiple taxonomies to the list
 * of classes generated by post_class().
 *
 * @since 2010-07-10
 * @alter 2012-01-06
 */
function mysite_post_class( $classes, $class, $ID ) {

    $taxonomies = array(
        'type',
        'campaign',

    );

    $terms = get_the_terms( (int) $ID, $taxonomies );

    if ( is_wp_error( $terms ) || empty( $terms ) )
        return $classes;

    foreach ( (array) $terms as $term ) {
        if ( ! in_array( $term->slug, $classes ) )
            $classes[] = $term->slug;
    }

    return $classes;
}

add_filter( 'post_class', 'mysite_post_class', 10, 3 );
add_filter( 'tpicker_taxonomies', 'my_tpicker_taxonomies' );
function my_tpicker_taxonomies( $old_taxies) { // Filter taxonomy order

    foreach( array("Categories ", "Campaigns ", "Ad Type " ) as $tax_label) {
        $new_taxies[$tax_label] = $old_taxies[$tax_label];
    }

    return $new_taxies;
}
2
Ben

私はあなたがいくつかの概念を欠いているか、または完全に理解していないと思います。

  1. 分類法は物事、すなわち投稿をグループ化する方法です。同じ分類法を複数の投稿タイプに使用できるため、分類法は投稿の下にありません。
  2. singleテンプレートファイルは単一の投稿の表示に使用されます。個々の投稿ごとであっても、投稿タイプごとに異なる単一のテンプレートを作成できます。
  3. 分類法の用語の具体的なテンプレートはtaxonomy-{your_taxonomy}-{term}.phpです。あなたの場合、それは例えばtaxonomy-type-radio.phpです。このテンプレートは、 'type'分類法の用語ラジオ内のすべての投稿を表示します。

私はあなたが本当に欲しいのは '広告'投稿に関連した分類 "タイプ"の用語に基づいて異なるsingleテンプレートを使うことだと思います。 ポストごとに選択できる「タイプ」分類法の用語は1つだけです template_include filter、より具体的には single_template filter を使用できます。

<?php
function get_custom_single_template($single_template) {
    global $post;

    if ($post->post_type == 'ad') {
        $terms = get_the_terms($post->ID, 'type');
        if($terms && !is_wp_error( $terms )) {
            //Make a foreach because $terms is an array but it supposed to be only one term
            foreach($terms as $term){
                $single_template = dirname( __FILE__ ) . '/single-'.$term->slug.'.php';
            }
        }
     }
     return $single_template;
}

add_filter( "single_template", "get_custom_single_template" ) ;
?>

これをあなたのテーマのfunctions.phpファイルに入れてください。各用語(single-radio.php、single-tv.phpなど)に対して単一の - *。phpを作成することを忘れないでください。

あなたが完全なテンプレートファイルを必要とせず、異なるCSSクラスのようにほんの少しの修正を必要とするならば、あなたはポストが用語を持っているかどうかをチェックして異なるクラスを割り当てることができます。たとえば、一般的な単一のテンプレートでは、

 <div class="<?php echo class="<?php echo has_term( 'radio', 'type' ) ? 'radio' : ''; ?>">
   <?php the_cotent();?>
</div>

または

<?php
$terms = get_the_terms($post->ID, 'type');
$class = '';
//Make a foreach because $terms is an array but it supposed to be only one term
foreach($terms as $term){
    $class = $term->slug;
}
?>
<div class="<?php echo $class; ?>">
   <?php the_cotent();?>
</div>
4
cybmeta