web-dev-qa-db-fra.com

Modèles uniques de taxonomie de type poste personnalisé

J'ai créé un type de message personnalisé appelé "Ad". J'ai ensuite une taxonomie sous le nom "type". J'ai ajouté certains termes dans la catégorie Type appelée "Radio", "TV", "Imprimer". Je voudrais que WordPress utilise un modèle single.php différent pour chaque terme. J'aimerais avoir un modèle Radio différent du modèle Imprimer. J'ai essayé taxonomy-ad-type-radio.php J'ai essayé single-ad-type-radio.php et toutes les autres formes de ceux-ci. Quelqu'un peut-il me dire quel est le meilleur moyen d'y parvenir?

J'ai ajouté des filtres à mon fichier functions.php, mais en vain. Je sais qu'il me manque quelque chose de très facile. Merci beaucoup pour votre aide.

<?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

Je pense que vous manquez certains concepts ou que vous ne comprenez pas tout à fait.

  1. Une taxonomie est un moyen de regrouper des éléments, par exemple des publications. La même taxonomie peut être utilisée pour plusieurs types de publication, de sorte qu'une taxonomie ne soit pas sous une publication.
  2. Les fichiers de modèle single sont utilisés pour afficher un seul message. Vous pouvez créer un modèle unique différent pour chaque type de publication, même pour chaque publication.
  3. Le modèle spécifique pour un terme d'une taxonomie est taxonomy-{your_taxonomy}-{term}.php; dans votre cas, ce serait par exemple taxonomy-type-radio.php. Ce modèle affichera tous les messages dans le terme radio de la taxonomie 'type'.

Je pense que ce que vous voulez vraiment, c'est utiliser un modèle single différent, basé sur le terme du "type" de taxonomie associé à une publication "Ad". Je suppose un seul terme de taxonomie de type peut être sélectionné par message . Vous pouvez utiliser template_include filter ou plus précisément le filtre single_template :

<?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" ) ;
?>

Placez ceci dans le fichier functions.php de votre thème. N'oubliez pas de créer le single - *. Php pour chaque terme (single-radio.php, single-tv.php, etc.).

Si vous n'avez pas besoin d'un fichier de modèle complet et que vous n'avez besoin que de petites modifications, telles que différentes classes CSS, vous pouvez vérifier si l'article contient le terme et attribuer une autre classe. Par exemple, dans un modèle unique commun:

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

Ou

<?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