2010-06-29 7 views
1

Si j'ai un type de poste personnalisé nommé 'my_type', comment puis-je obtenir Wordpress pour faire date en fonction des archives, par exemple:archives basée sur la date pour post_types personnalisés (wordpress 3.0)

mysite.com/my_type/2010/ 
mysite.com/my_type/2010/07/ 
mysite.com/my_type/2010/07/28/ 

Je Je suis à la recherche de conseils sur la création des règles de réécriture et sur la liaison des urls aux modèles.

Merci!


Mise à jour: J'ai essayé ce qui suit dans mon functions.php (EVENT_TYPE_SLUG est une constante définie ailleurs):

function event_rewrite_rules() { 
    global $wp_rewrite; 
    $new_rules = array(
     EVENT_TYPE_SLUG."/([0-9]{4})/([0-9]{1,2})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1).'&monthnum='.$wp_rewrite->preg_index(2), 
     EVENT_TYPE_SLUG."/([0-9]{4})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1), 
    ); 
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; 
} 
add_action('generate_rewrite_rules', 'event_rewrite_rules'); 

les règles de réécriture apparaissent dans les règles $ wp_rewrite->, mais quand je navigue vers ces pages, j'obtiens une erreur 404. Si je navigue manuellement mysite.com/index.php?post_type=event&year=2010, je redirigés vers mysite.com/2010?post_type=event

Répondre

0

OK ... pris un certain temps, mais je me suis dit ceci (il peut y avoir des solutions plus élégantes là-bas).

1) Créer une page de wordpress standard pour servir de page d'archive (et me donner accès au template). J'ai défini la limace de la page comme une constante (EVENT_ARCHIVE_BASE) de sorte qu'elle soit simplement codée en dur dans un endroit et référencée partout ailleurs.

2) Faire récrire sur mesure des règles qui attrapent les urls de cette page et de les rediriger vers la page:

function event_date_queryvars($qvars) { 
    array_push($qvars, 'eyear', 'emonth'); 
    return $qvars; 
} 
add_filter('query_vars', 'event_date_queryvars'); 

function event_date_rewrite_rules() { 
    // Adds rewrite rules for date-based event archives 
    global $wp_rewrite; 
    $new_rules = array(
     EVENT_ARCHIVE_BASE."/([0-9]{4})/([0-9]{1,2})/?$" => 
      "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1)."&emonth=".$wp_rewrite->preg_index(2), 
     EVENT_ARCHIVE_BASE."/([0-9]{4})/?$" => "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1), 
    ); 
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; 
} 
add_action('generate_rewrite_rules', 'event_date_rewrite_rules'); 

3) Au sommet de mon modèle de page, je vérifie la requête personnalisée vars et construire la page en conséquence. (J'aurais pu utiliser le haut-année et monthnum, mais n'a pas pu les faire fonctionner correctement le dépannage futur.):

// Was the page called with a specific year, month, or just plain? 
$year = get_query_var('eyear'); 
$monthnum = sprintf('%02d', get_query_var('emonth')); 
if ($monthnum) { 
    $list_type = 'Month'; 
    $monthname = $month[$monthnum]; 
    $heading = "Events from $monthname, $year"; 
} elseif ($year) { 
    $list_type = 'Year'; 
    $heading = "Events from $year"; 
} else { 
    $list_type = 'AllPast'; 
    $heading = get_the_title(); 
} 

Merci pour l'aide, et nous espérons que cela est utile pour quelqu'un d'autre ! Faites-moi savoir si vous avez un moyen plus simple/intégré de le faire.

0

Benj Je pense que WordPress crée automatiquement des archives pour le type de poste personnalisé

+1

Si c'est le cas, je ne les trouve pas ... Ce qui suit existe: 'mysite.com/2010/? Post_type = event', mais cela pointe vers la page d'archive standard, et seulement des filtres basés sur l'événement .Cela ne me donne pas la structure d'url que je cherche. – Benj

0

J'ai réussi à trouver une solution plus élégante/intégrée.

L'astuce est dans le paramètre "post_type = article". Si vous créez une ré-écriture comme ceci:

'(articles)/([0-9]{4})' => 'index.php?post_type=article&eyear=' . $wp_rewrite->preg_index(2) 

Ce sera alors garder votre structure d'URL, mais passer par le modèle par défaut « archive ». Ensuite, vous volez le modèle de la valeur par défaut à votre propre modèle d'archive. (Par exemple « archive articles.php »)

Cette fonction accomplit cette (fonctionne pour moi):

add_action("template_redirect", 'my_template_redirect'); 

// Template selection 
function my_template_redirect() 
{ 
    global $wp; 
    global $wp_query; 
    if ($wp->query_vars["post_type"] == "article") 
    { 
     if (have_posts()) 
     { 
      include(TEMPLATEPATH . '/archive-articles.php'); 
      die(); 
     } 
     else 
     { 
      $wp_query->is_404 = true; 
     } 
    } 
} 

Vous aurez toujours besoin de créer vos propres méthodes pour gérer l 'get_query_var() pour l'année/mois/jour, mais au moins vous n'avez pas besoin de créer un modèle de page personnalisé.

Questions connexes