web-dev-qa-db-fra.com

Custom Single Post par catégorie

J'essaie de me familiariser avec la terminologie des tenants et les aboutissants de WordPress, alors excuses-moi.

Je suis en train de créer un site complet utilisant WordPress et un modèle personnalisé, en me basant sur les bases de TwentyTen.

J'essaie d'avoir autant que possible dans les pages "post" Type de message, et la "liste" de premier niveau "juste les pages de catégorie.

Une catégorie est "travail"

J'ai pu personnaliser ceux-ci en créant des fichiers category-work.php et loop-work.php personnalisés. Mais comment puis-je créer un message personnalisé par catégorie?

Il semble que faire un single-work.php chercherait un type de publication personnalisé appelé "travail". Existe-t-il un moyen de créer un clone modifié single.php déclenché par slug category/category?

3
Keefer

Faites votre single.php comme suit:

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

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

et faites que single-work-cat.php soit le modèle que vous souhaitez afficher pour les publications d’une catégorie d’œuvre unique et single-generic.php celui que vous souhaitez afficher dans tous les autres cas. Pour plus de catégories, ajoutez simplement des instructions elseif et créez de nouveaux modèles uniques.

8
artparks

Je me rends compte que c’est une vieille question, mais si quelqu'un d'autre découvre en cherchant le même sujet, sachez que vous ne devez pas utiliser d'instructions include dans vos thèmes WordPress. Utilisez toujours get_template_part () ou Locate_template () à la place.

(voir http://make.wordpress.org/themes/guidelines/guidelines-theme-check/ )

Le code suivant utilise des filtres WordPress pour accomplir la tâche et recherche automatiquement des modèles pour toutes les catégories:

/**
 * 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 );
}

Il y a quelques points faibles dans le code. Tout d’abord, cela signifie que WordPress effectue deux fois la méthode position_template () pour une publication unique (une fois avant que cette fonction ne soit exécutée et une fois pendant). Deuxièmement, je ne pense pas qu'il existe un moyen propre de hiérarchiser les catégories dans lesquelles rechercher en premier. Cela signifie que si votre message appartient à plusieurs catégories comportant des modèles uniques, vous ne pourrez pas choisir le modèle à utiliser.

3
Michael Dozark