web-dev-qa-db-fra.com

Custom Post Type Archives par date et taxonomie

Utilisons l'exemple classique d'un type d'article personnalisé appelé "films", avec sa propre taxonomie appelée "genre".

En enregistrant le type de publication personnalisé (avec un slug "movie"), les permaliens sont déjà configurés pour

<domain>/movie/action/ 

... pour voir tous les films du genre action.

Mais, archives par date, comme

<domain>/2010/09/

... Ne sais pas sur le type de message personnalisé.

L'archive la plus proche basée sur la date que je peux utiliser est:

<domain>/2010/?post_type=movies

... qui répertorie tous les types de publication personnalisés publiés au cours de l'année en cours (2010). Pour une raison quelconque, le mois, la taxonomie et un terme ne peuvent pas être ajoutés à l'URL pour obtenir le résultat attendu.

Que faut-il faire pour activer les URL comme celles-ci ...

<domain>/2010/09/movie/action/

... pour fonctionner comme prévu, donc pour lister tous les films d'action postés en septembre 2010?

6
Werner

Oui, il n’existe actuellement pas de prise en charge intégrée des archives CPT, mais cela ne signifie pas que vous ne pouvez pas étendre WP à le fournir. Je viens de faire cela moi-même l'autre jour ...

Cela ne créera pas les archives basées sur la date que vous recherchez, mais vous donnera un comportement d'archive virtuelle pour les types de publication personnalisés. L'ajout de la date devrait simplement être une question de peaufiner les règles de réécriture (en fait, les liens permanents basés sur la date pourraient fonctionner comme tels) ...

EXEMPLE: vous avez un type personnalisé de "films" et un post de film unique appelé "parti avec le vent". Ce code vous donnera une structure d'URL de website.com/movies/gone-with-the-wind. De plus, aller à website.com/movies ne listera que les films (comme une archive de catégorie, bien qu'il n'appelle pas le modèle archive.php pour la sortie, mais formate la sortie exactement comme le modèle de boucle index.php standard).

function register_post_type_archives( $post_type, $base_path = '' ) {
    global $wp_rewrite;
    if ( !$base_path ) {
        $base_path = $post_type;
    }
    $rules = $wp_rewrite->generate_rewrite_rules($base_path);
    $rules[$base_path.'/?$'] = 'index.php?paged=1';
    foreach ( $rules as $regex=>$redirect ) {
        if ( strpos($redirect, 'attachment=') == FALSE ) {
            $redirect .= '&post_type='.$post_type;
            if (  0 < preg_match_all('@\$([0-9])@', $redirect, $matches) ) {
                for ( $i=0 ; $i < count($matches[0]) ; $i++ ) {
                    $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect);
                }
            }
        }
        add_rewrite_rule($regex, $redirect, 'top');
    }
}

appelez cette fonction juste après avoir généré votre type de message personnalisé:

register_post_type('movies', $args);
register_post_type_archives('movies');

Ensuite, si vous souhaitez pouvoir utiliser des modèles personnalisés pour contrôler la sortie de ces listes de quasi-archives, vous pouvez utiliser ceci:

add_action('template_redirect', 'post_type_templates');
function post_type_templates() {
    $post_type = get_query_var('post_type');
    if (!empty($post_type)) {
        locate_template(array("{$post_type}.php","index.php"), true);
        die;
    }
}

Vous pouvez maintenant créer un modèle "movies.php" dans votre thème et personnaliser la sortie de boucle à votre guise.

UPDATE: Avoir la fonctionnalité d'archivage pour les types personnalisés est génial, mais j'ai compris qu'il me fallait un moyen d'y accéder. Vous pouvez évidemment coder en dur des boutons qui pointent vers les slugs, mais j’ai créé une fonction permettant de générer une barre de navigation wp3.0 contenant tous mes types personnalisés. Pour le moment, il crée une nouvelle barre de navigation et en fait la principale, mais vous pouvez le changer pour qu'il soit secondaire ou simplement ajouter les éléments à une barre de navigation existante. Remarque: les liens de navigation ne fonctionneront que si vous utilisez les règles de réécriture ci-dessus.

function register_typenav() {
    $mainnav = wp_get_nav_menu_object('Types Nav');
    if (!$mainnav) {
        $menu_id = wp_create_nav_menu( 'Types Nav' );
        // vav item for each post type
        $types = get_post_types( array( 'exclude_from_search' => false ), 'objects' );
        foreach ($types as $type) {
            if (!$type->_builtin) {
                wp_update_nav_menu_item( $menu_id, 0, array(
                    'menu-item-type' => 'custom',
                    'menu-item-title' => $type->labels->name,
                    'menu-item-url' => get_bloginfo('url') . '/' . $type->rewrite['slug'] . '/',
                    'menu-item-status' => 'publish'
                    )
                );
            }
        }
    if ($mainnav && !has_nav_menu( 'primary-menu' ) ) {
        $theme = get_current_theme();
        $mods = get_option("mods_$theme");
        $key = key($mods['nav_menu_locations']);
        $mods['nav_menu_locations'][$key] = $mainnav->term_id;
        update_option("mods_$theme", $mods);
    }
}
add_action('init', 'register_typenav');
6
somatic

Les types de publication personnalisés ne sont pas conçus pour fournir des archives comme le type de publication de blog commun. Cela pourrait être quelque chose qui sera changé dans le futur.

Voici le lien manquant: Améliorations apportées aux types de messages personnalisés (CPT) qui méritent d’être examinées dans la section 3.1 .

2
hakre

Ce plugin fournit exactement ce que vous voulez. Cela fonctionne bien avec Wordpress 3.3.1.

1
baxang